From aac64d013546c8be3b992af63d70150155386c11 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 27 May 2022 16:04:22 -0500 Subject: Start making azalea-block --- Cargo.lock | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Cargo.lock') diff --git a/Cargo.lock b/Cargo.lock index 0faed271..87a6a3aa 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,6 +78,10 @@ dependencies = [ "uuid", ] +[[package]] +name = "azalea-block" +version = "0.1.0" + [[package]] name = "azalea-brigadier" version = "0.1.0" -- cgit v1.2.3 From 88bc6d16602c163d122685997dc269d5d97a93a2 Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 27 May 2022 19:34:09 -0500 Subject: Start making block macro --- Cargo.lock | 40 +++++--- azalea-block/Cargo.toml | 5 +- azalea-block/block-macros/Cargo.toml | 14 +++ azalea-block/block-macros/src/lib.rs | 157 +++++++++++++++++++++++++++++ azalea-block/src/blocks.rs | 188 ++++++++++++++++++++--------------- azalea-block/src/lib.rs | 2 - azalea-block/src/properties.rs | 20 ---- 7 files changed, 310 insertions(+), 116 deletions(-) create mode 100644 azalea-block/block-macros/Cargo.toml create mode 100644 azalea-block/block-macros/src/lib.rs delete mode 100644 azalea-block/src/properties.rs (limited to 'Cargo.lock') diff --git a/Cargo.lock b/Cargo.lock index 87a6a3aa..09523320 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,6 +81,9 @@ dependencies = [ [[package]] name = "azalea-block" version = "0.1.0" +dependencies = [ + "block-macros", +] [[package]] name = "azalea-brigadier" @@ -200,6 +203,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-macros" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "bot" version = "0.1.0" @@ -971,11 +983,11 @@ checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -986,9 +998,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.10" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] @@ -1244,13 +1256,13 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1407,6 +1419,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + [[package]] name = "unicode-normalization" version = "0.1.19" @@ -1428,12 +1446,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - [[package]] name = "url" version = "2.2.2" diff --git a/azalea-block/Cargo.toml b/azalea-block/Cargo.toml index ea43e8ae..edeba385 100644 --- a/azalea-block/Cargo.toml +++ b/azalea-block/Cargo.toml @@ -1,8 +1,11 @@ [package] +edition = "2021" name = "azalea-block" version = "0.1.0" -edition = "2021" + +[lib] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +block-macros = {path = "./block-macros"} diff --git a/azalea-block/block-macros/Cargo.toml b/azalea-block/block-macros/Cargo.toml new file mode 100644 index 00000000..03b19e1d --- /dev/null +++ b/azalea-block/block-macros/Cargo.toml @@ -0,0 +1,14 @@ +[package] +edition = "2021" +name = "block-macros" +version = "0.1.0" + +[lib] +proc-macro = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +proc-macro2 = "1.0.39" +quote = "1.0.18" +syn = "1.0.95" diff --git a/azalea-block/block-macros/src/lib.rs b/azalea-block/block-macros/src/lib.rs new file mode 100644 index 00000000..20ec5f3e --- /dev/null +++ b/azalea-block/block-macros/src/lib.rs @@ -0,0 +1,157 @@ +use proc_macro::TokenStream; +use quote::{quote, ToTokens}; +use std::fmt::Debug; +use syn::{ + self, braced, + parse::{Parse, ParseStream, Result}, + parse_macro_input, + punctuated::Punctuated, + Data, DeriveInput, Expr, FieldsNamed, Ident, LitInt, Token, +}; + +struct PropertyDefinition { + name: Ident, + variants: Punctuated, +} +struct PropertyDefinitions { + properties: Vec, +} + +struct BlockDefinition { + name: Ident, + behavior: Expr, + properties: Punctuated, +} +struct BlockDefinitions { + blocks: Vec, +} +struct MakeBlockStates { + property_definitions: PropertyDefinitions, + block_definitions: BlockDefinitions, +} + +impl Parse for PropertyDefinition { + fn parse(input: ParseStream) -> Result { + // Face { + // Floor, + // Wall, + // Ceiling + // }; + let name = input.parse()?; + let variants = input.parse_terminated(Ident::parse)?; + input.parse::()?; + Ok(PropertyDefinition { name, variants }) + } +} + +impl Parse for PropertyDefinitions { + fn parse(input: ParseStream) -> Result { + let mut property_definitions = Vec::new(); + while !input.is_empty() { + property_definitions.push(input.parse()?); + } + + Ok(PropertyDefinitions { + properties: property_definitions, + }) + } +} + +impl Parse for BlockDefinition { + fn parse(input: ParseStream) -> Result { + // acacia_button => BlockBehavior { has_collision: false }, { + // Face, + // Facing, + // Powered + // }; + let name = input.parse()?; + input.parse::]>()?; + let behavior = input.parse()?; + input.parse::()?; + let content; + braced!(content in input); + let properties = content.parse_terminated(Ident::parse)?; + input.parse::()?; + Ok(BlockDefinition { + name, + behavior, + properties, + }) + } +} + +impl Parse for BlockDefinitions { + fn parse(input: ParseStream) -> Result { + let mut blocks = Vec::new(); + while !input.is_empty() { + blocks.push(input.parse()?); + } + + Ok(BlockDefinitions { blocks }) + } +} + +impl Parse for MakeBlockStates { + fn parse(input: ParseStream) -> Result { + // PROPERTIES => { ... } BLOCKS => { ... } + let properties_ident = input.parse::()?; + assert_eq!(properties_ident.to_string(), "PROPERTIES"); + input.parse::]>()?; + let content; + braced!(content in input); + let properties = content.parse()?; + + let blocks_ident = input.parse::()?; + assert_eq!(blocks_ident.to_string(), "BLOCKS"); + input.parse::]>()?; + let content; + braced!(content in input); + let blocks = content.parse()?; + + Ok(MakeBlockStates { + property_definitions: properties, + block_definitions: blocks, + }) + } +} + +#[proc_macro] +pub fn make_block_states(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as MakeBlockStates); + + let mut property_enums = quote! {}; + + for property in &input.property_definitions.properties { + let mut property_enum_variants = quote! {}; + + for variant in &property.variants { + property_enum_variants.extend(quote! { + #variant, + }); + } + + let property_name = property.name; + + property_enums.extend(quote! { + #[derive(Debug, Clone, Copy)] + pub enum #property_name { + #property_enum_variants + } + }); + } + + // let mut block_state_enum_variants = quote! {}; + + // for block in &input.block_definitions.blocks { + // let block_state_enum_variant = quote! { + // #block.name(#block.behavior, #block.properties) + // }; + // block_state_enum_variants.extend(block_state_enum_variant); + // } + + quote! { + #property_enums + // #block_state_enum_variants + } + .into() +} diff --git a/azalea-block/src/blocks.rs b/azalea-block/src/blocks.rs index f6f33a89..6bc82a20 100644 --- a/azalea-block/src/blocks.rs +++ b/azalea-block/src/blocks.rs @@ -1,88 +1,118 @@ use crate::{behavior::BlockBehavior, properties}; -// make_block_states! { -// acacia_button => BlockBehavior { has_collision: false }, { -// Face, -// Facing, -// Powered -// }; -// acacia_door => BlockBehavior { has_collision: true }, { -// Facing, -// Half, -// Hinge, -// Open, -// Powered -// }; +make_block_states! { + PROPERTIES => { + Face { + Floor, + Wall, + Ceiling + }; + } + BLOCKS => { + acacia_button => BlockBehavior { has_collision: false }, { + Face, + Facing, + Powered + }; + acacia_door => BlockBehavior { has_collision: true }, { + Facing, + Half, + Hinge, + Open, + Powered + }; + } +} + +// #[derive(Debug, Clone, Copy)] +// pub enum Face { +// Floor, +// Wall, +// Ceiling, // } -// the underscore makes it more readable, so i think it's fine to allow it -#[allow(non_camel_case_types)] -pub enum BlockState { - AcaciaButton_FloorNorthTrue, - AcaciaButton_WallNorthTrue, - AcaciaButton_CeilingNorthTrue, -} +// #[derive(Debug, Clone, Copy)] +// pub enum Facing { +// North, +// South, +// West, +// East, +// } -pub trait Block { - fn behavior(&self) -> BlockBehavior; -} +// #[derive(Debug, Clone, Copy)] +// pub enum Powered { +// True, +// False, +// } -#[derive(Debug)] -pub struct AcaciaButtonBlock { - pub face: properties::Face, - pub facing: properties::Facing, - pub powered: properties::Powered, -} +// // the underscore makes it more readable, so i think it's fine to allow it +// #[allow(non_camel_case_types)] +// pub enum BlockState { +// AcaciaButton_FloorNorthTrue, +// AcaciaButton_WallNorthTrue, +// AcaciaButton_CeilingNorthTrue, +// } -impl Block for AcaciaButtonBlock { - fn behavior(&self) -> BlockBehavior { - BlockBehavior { - has_collision: false, - } - } -} +// pub trait Block { +// fn behavior(&self) -> BlockBehavior; +// } -pub struct AcaciaDoorBlock { - pub facing: properties::Facing, - // pub half: properties::Half, - // pub hinge: properties::Hinge, - // pub open: properties::Open, - pub powered: properties::Powered, -} +// #[derive(Debug)] +// pub struct AcaciaButtonBlock { +// pub face: properties::Face, +// pub facing: properties::Facing, +// pub powered: properties::Powered, +// } -impl From for &dyn Block { - fn from(b: BlockState) -> Self { - match b { - BlockState::AcaciaButton_FloorNorthTrue => &AcaciaButtonBlock { - face: properties::Face::Floor, - facing: properties::Facing::North, - powered: properties::Powered::True, - }, - // BlockState::AcaciaButton_WallNorthTrue => todo!(), - // BlockState::AcaciaButton_CeilingNorthTrue => todo!(), - _ => todo!(), - } - } -} -impl From for BlockState { - fn from(b: AcaciaButtonBlock) -> Self { - match b { - AcaciaButtonBlock { - face: properties::Face::Floor, - facing: properties::Facing::North, - powered: properties::Powered::True, - } => BlockState::AcaciaButton_FloorNorthTrue, - // AcaciaButtonBlock { - // face: properties::Face::Wall, - // facing: properties::Facing::North, - // powered: properties::Powered::True, - // } => todo!(), - // AcaciaButtonBlock { - // face: properties::Face::Ceiling, - // facing: properties::Facing::North, - // powered: properties::Powered::True, - // } => todo!(), - _ => todo!(), - } - } -} +// impl Block for AcaciaButtonBlock { +// fn behavior(&self) -> BlockBehavior { +// BlockBehavior { +// has_collision: false, +// } +// } +// } + +// pub struct AcaciaDoorBlock { +// pub facing: properties::Facing, +// // pub half: properties::Half, +// // pub hinge: properties::Hinge, +// // pub open: properties::Open, +// pub powered: properties::Powered, +// } + +// impl From for &dyn Block { +// fn from(b: BlockState) -> Self { +// match b { +// BlockState::AcaciaButton_FloorNorthTrue => &AcaciaButtonBlock { +// face: properties::Face::Floor, +// facing: properties::Facing::North, +// powered: properties::Powered::True, +// }, +// // BlockState::AcaciaButton_WallNorthTrue => todo!(), +// // BlockState::AcaciaButton_CeilingNorthTrue => todo!(), +// _ => todo!(), +// } +// } +// } +// impl From for BlockState { +// fn from(b: AcaciaButtonBlock) -> Self { +// match b { +// AcaciaButtonBlock { +// face: properties::Face::Floor, +// facing: properties::Facing::North, +// powered: properties::Powered::True, +// } => BlockState::AcaciaButton_FloorNorthTrue, +// // AcaciaButtonBlock { +// // face: properties::Face::Wall, +// // facing: properties::Facing::North, +// // powered: properties::Powered::True, +// // } => todo!(), +// // AcaciaButtonBlock { +// // face: properties::Face::Ceiling, +// // facing: properties::Facing::North, +// // powered: properties::Powered::True, +// // } => todo!(), +// _ => todo!(), +// } +// } +// } diff --git a/azalea-block/src/lib.rs b/azalea-block/src/lib.rs index db94d081..30f2aadc 100644 --- a/azalea-block/src/lib.rs +++ b/azalea-block/src/lib.rs @@ -1,5 +1,3 @@ pub mod behavior; pub mod blocks; pub mod properties; - -use std::fmt::Debug; diff --git a/azalea-block/src/properties.rs b/azalea-block/src/properties.rs deleted file mode 100644 index ac81fcb3..00000000 --- a/azalea-block/src/properties.rs +++ /dev/null @@ -1,20 +0,0 @@ -#[derive(Debug, Clone, Copy)] -pub enum Face { - Floor, - Wall, - Ceiling, -} - -#[derive(Debug, Clone, Copy)] -pub enum Facing { - North, - South, - West, - East, -} - -#[derive(Debug, Clone, Copy)] -pub enum Powered { - True, - False, -} -- cgit v1.2.3 From e36095c2b1800e20bf0c47c6e7939071752759d6 Mon Sep 17 00:00:00 2001 From: mat Date: Sat, 11 Jun 2022 17:18:57 -0500 Subject: Fix all the errors --- .vscode/settings.json | 2 +- Cargo.lock | 40 +- azalea-block/block-macros/src/lib.rs | 153 +- azalea-block/src/blocks.rs | 4923 +--------------------------------- codegen/lib/code/blocks.py | 4 +- 5 files changed, 141 insertions(+), 4981 deletions(-) (limited to 'Cargo.lock') diff --git a/.vscode/settings.json b/.vscode/settings.json index b0d07499..3b614348 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "editor.formatOnSave": false + "editor.formatOnSave": true } \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index e86d73ed..1ef95311 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -45,9 +45,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.53" +version = "0.1.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" dependencies = [ "proc-macro2", "quote", @@ -236,9 +236,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.9.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" +checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" [[package]] name = "byteorder" @@ -474,13 +474,11 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if", "crc32fast", - "libc", "miniz_oxide", ] @@ -745,9 +743,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ "adler", ] @@ -1120,9 +1118,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "semver" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" +checksum = "a41d061efea015927ac527063765e73601444cdc344ba855bc7bd44578b25e1c" [[package]] name = "serde" @@ -1223,9 +1221,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" +checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" dependencies = [ "proc-macro2", "quote", @@ -1288,9 +1286,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.18.2" +version = "1.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395" +checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" dependencies = [ "bytes", "libc", @@ -1306,9 +1304,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" dependencies = [ "proc-macro2", "quote", @@ -1392,12 +1390,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" -[[package]] -name = "unicode-ident" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" - [[package]] name = "unicode-normalization" version = "0.1.19" diff --git a/azalea-block/block-macros/src/lib.rs b/azalea-block/block-macros/src/lib.rs index b5a7909f..d38062d4 100644 --- a/azalea-block/block-macros/src/lib.rs +++ b/azalea-block/block-macros/src/lib.rs @@ -8,12 +8,13 @@ use syn::{ parse::{Parse, ParseStream, Result}, parse_macro_input, punctuated::Punctuated, - Expr, Ident, Token, + Expr, Ident, LitStr, Token, }; use utils::{combinations_of, to_pascal_case}; struct PropertyDefinition { - name: Ident, + name: LitStr, + struct_name: Ident, variants: Punctuated, } struct PropertyDefinitions { @@ -21,7 +22,12 @@ struct PropertyDefinitions { } struct PropertyAndDefault { - name: Ident, + struct_name: Ident, + default: Ident, +} +struct PropertyWithNameAndDefault { + name: String, + struct_name: Ident, default: Ident, } struct BlockDefinition { @@ -29,6 +35,15 @@ struct BlockDefinition { behavior: Expr, properties_and_defaults: Vec, } +impl PropertyAndDefault { + fn into_property_with_name_and_default(&self, name: String) -> PropertyWithNameAndDefault { + PropertyWithNameAndDefault { + name, + struct_name: self.struct_name.clone(), + default: self.default.clone(), + } + } +} struct BlockDefinitions { blocks: Vec, } @@ -39,19 +54,29 @@ struct MakeBlockStates { impl Parse for PropertyDefinition { fn parse(input: ParseStream) -> Result { - // Face { + // "face" => Face { // Floor, // Wall, // Ceiling // }, + + // if you're wondering, the reason it's in quotes is because `type` is + // a keyword in rust so if we don't put it in quotes it results in a + // syntax error let name = input.parse()?; + input.parse::]>()?; + let struct_name = input.parse()?; let content; braced!(content in input); let variants = content.parse_terminated(Ident::parse)?; input.parse::()?; - Ok(PropertyDefinition { name, variants }) + Ok(PropertyDefinition { + name, + struct_name, + variants, + }) } } @@ -70,11 +95,11 @@ impl Parse for PropertyDefinitions { impl Parse for BlockDefinition { fn parse(input: ParseStream) -> Result { - // acacia_button => BlockBehavior::default().no_collision(), { - // Face, - // Facing, - // Powered - // }, + // acacia_button => BlockBehavior::default(), { + // Facing=North, + // Powered=False, + // Face=Wall, + // }, let name = input.parse()?; input.parse::]>()?; let behavior = input.parse()?; @@ -93,7 +118,7 @@ impl Parse for BlockDefinition { content.parse::()?; let property_default = content.parse()?; properties_and_defaults.push(PropertyAndDefault { - name: property, + struct_name: property, default: property_default, }); if content.parse::().is_err() { @@ -152,15 +177,21 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { let mut property_enums = quote! {}; let mut properties_map = HashMap::new(); + let mut property_struct_names_to_names = HashMap::new(); - let mut state_id = 0usize; + let mut state_id: usize = 0; for property in &input.property_definitions.properties { let mut property_enum_variants = quote! {}; let mut property_from_number_variants = quote! {}; let mut property_enum_variant_names = Vec::new(); - let property_name = &property.name; + let property_struct_name = &property.struct_name; + + property_struct_names_to_names.insert( + property_struct_name.to_string(), + property.name.clone().value(), + ); for i in 0..property.variants.len() { let variant = &property.variants[i]; @@ -177,7 +208,7 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { // i_lit is used here instead of i because otherwise it says 0size // in the expansion and that looks uglier property_from_number_variants.extend(quote! { - #i_lit => #property_name::#variant, + #i_lit => #property_struct_name::#variant, }); property_enum_variant_names.push(variant.to_string()); @@ -185,11 +216,11 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { property_enums.extend(quote! { #[derive(Debug, Clone, Copy)] - pub enum #property_name { + pub enum #property_struct_name { #property_enum_variants } - impl From for #property_name { + impl From for #property_struct_name { fn from(value: usize) -> Self { match value { #property_from_number_variants @@ -198,7 +229,10 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { } } }); - properties_map.insert(property_name.to_string(), property_enum_variant_names); + properties_map.insert( + property_struct_name.to_string(), + property_enum_variant_names, + ); } let mut block_state_enum_variants = quote! {}; @@ -208,7 +242,7 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { let block_property_names = &block .properties_and_defaults .iter() - .map(|p| p.name.to_string()) + .map(|p| p.struct_name.to_string()) .collect::>(); let mut block_properties_vec = Vec::new(); for property_name in block_property_names { @@ -219,17 +253,56 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { block_properties_vec.push(property_variants); } + let mut properties_with_name: Vec = + Vec::with_capacity(block.properties_and_defaults.len()); + for property in &block.properties_and_defaults { + let index: Option = if block + .properties_and_defaults + .iter() + .filter(|p| p.struct_name == property.struct_name) + .count() + > 1 + { + Some( + properties_with_name + .iter() + .filter(|p| p.struct_name == property.struct_name) + .count(), + ) + } else { + None + }; + let mut property_name = property_struct_names_to_names + .get(&property.struct_name.to_string()) + .expect(format!("Property '{}' is bad", property.struct_name).as_str()) + .clone(); + if let Some(index) = index { + property_name.push_str(&format!("_{}", &index.to_string())); + } + properties_with_name + .push(property.into_property_with_name_and_default(property_name.clone())); + } + // pub face: properties::Face, // pub facing: properties::Facing, // pub powered: properties::Powered, + // or + // pub has_bottle_0: HasBottle, + // pub has_bottle_1: HasBottle, + // pub has_bottle_2: HasBottle, let mut block_struct_fields = quote! {}; - for PropertyAndDefault { name: property, .. } in &block.properties_and_defaults { - let property_name_snake = - Ident::new(&property.to_string(), proc_macro2::Span::call_site()); + for PropertyWithNameAndDefault { + struct_name, name, .. + } in &properties_with_name + { + // let property_name_snake = + // Ident::new(&property.to_string(), proc_macro2::Span::call_site()); + let name_ident = Ident::new(&name, proc_macro2::Span::call_site()); block_struct_fields.extend(quote! { - pub #property_name_snake: #property, + pub #name_ident: #struct_name, }) } + let block_name_pascal_case = Ident::new( &to_pascal_case(&block.name.to_string()), proc_macro2::Span::call_site(), @@ -272,16 +345,16 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { // facing: properties::Facing::North, // powered: properties::Powered::True, let mut from_block_to_state_combination_match_inner = quote! {}; - for i in 0..block_property_names.len() { - let property_name = &block_property_names[i]; + for i in 0..properties_with_name.len() { + let property = &properties_with_name[i]; + let property_name = &property.name; let property_name_ident = Ident::new(property_name, proc_macro2::Span::call_site()); - let property_name_snake = - Ident::new(&property_name.to_string(), proc_macro2::Span::call_site()); + let property_struct_name_ident = &property.struct_name; let variant = Ident::new(&combination[i].to_string(), proc_macro2::Span::call_site()); from_block_to_state_combination_match_inner.extend(quote! { - #property_name_ident: #property_name_snake::#variant, + #property_name_ident: #property_struct_name_ident::#variant, }); } @@ -295,23 +368,25 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { // 7035..=7058 => { // let b = b - 7035; // &AcaciaButtonBlock { - // Powered: Powered::from((b / 1) % 2), - // Facing: Facing::from((b / 2) % 4), - // Face: Face::from((b / 8) % 3), + // powered: Powered::from((b / 1) % 2), + // facing: Facing::from((b / 2) % 4), + // face: Face::from((b / 8) % 3), // } // } let mut from_state_to_block_inner = quote! {}; let mut division = 1usize; - for i in (0..block.properties_and_defaults.len()).rev() { - let PropertyAndDefault { + for i in (0..properties_with_name.len()).rev() { + let PropertyWithNameAndDefault { + struct_name: property_struct_name_ident, name: property_name, .. - } = &block.properties_and_defaults[i]; + } = &properties_with_name[i]; let property_variants = &block_properties_vec[i]; let property_variants_count = property_variants.len(); + let property_name_ident = Ident::new(property_name, proc_macro2::Span::call_site()); from_state_to_block_inner.extend(quote! { - #property_name: #property_name::from((b / #division) % #property_variants_count), + #property_name_ident: #property_struct_name_ident::from((b / #division) % #property_variants_count), }); division *= property_variants_count; @@ -328,13 +403,15 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { }); let mut block_default_fields = quote! {}; - for PropertyAndDefault { - name: property, + for PropertyWithNameAndDefault { + struct_name: struct_name_ident, + name, default: property_default, - } in &block.properties_and_defaults + } in properties_with_name { + let name_ident = Ident::new(&name, proc_macro2::Span::call_site()); block_default_fields.extend(quote! { - #property: #property::#property_default, + #name_ident: #struct_name_ident::#property_default, }) } diff --git a/azalea-block/src/blocks.rs b/azalea-block/src/blocks.rs index dd297bcb..8d330b8c 100644 --- a/azalea-block/src/blocks.rs +++ b/azalea-block/src/blocks.rs @@ -8,4934 +8,25 @@ pub trait Block { make_block_states! { Properties => { - face => Face { - Floor, - Wall, - Ceiling, - }, - facing => Facing { + "facing" => Facing { North, South, West, East, }, - powered => Powered { - True, - False, - }, - half => Half { - Top, - Bottom, - }, - hinge => Hinge { - Left, - Right, - }, - open => Open { - True, - False, - }, - east => East { - True, - False, - }, - north => North { - True, - False, - }, - south => South { - True, - False, - }, - waterlogged => Waterlogged { - True, - False, - }, - west => West { - True, - False, - }, - in_wall => InWall { - True, - False, - }, - distance => AcaciaLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - persistent => Persistent { - True, - False, - }, - axis => Axis { - X, - Y, - Z, - }, - stage => AcaciaSaplingStage { - _0, - _1, - }, - rotation => AcaciaSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - type => Type { - Top, - Bottom, - Double, - }, - shape => Shape { - Straight, - InnerLeft, - InnerRight, - OuterLeft, - OuterRight, - }, - east => EastWall { - None, - Low, - Tall, - }, - north => NorthWall { - None, - Low, - Tall, - }, - south => SouthWall { - None, - Low, - Tall, - }, - up => Up { - True, - False, - }, - west => WestWall { - None, - Low, - Tall, - }, - distance => AzaleaLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - age => BambooAge { - _0, - _1, - }, - leaves => Leaves { - None, - Small, - Large, - }, - stage => BambooStage { - _0, - _1, - }, - honey_level => BeeNestHoneyLevel { - _0, - _1, - _2, - _3, - _4, - _5, - }, - honey_level => BeehiveHoneyLevel { - _0, - _1, - _2, - _3, - _4, - _5, - }, - age => BeetrootsAge { - _0, - _1, - _2, - _3, - }, - attachment => Attachment { - Floor, - Ceiling, - SingleWall, - DoubleWall, - }, - tilt => Tilt { - None, - Unstable, - Partial, - Full, - }, - distance => BirchLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - stage => BirchSaplingStage { - _0, - _1, - }, - rotation => BirchSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - rotation => BlackBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - occupied => Occupied { - True, - False, - }, - part => Part { - Head, - Foot, - }, - candles => BlackCandleCandles { - _1, - _2, - _3, - _4, - }, - lit => Lit { - True, - False, - }, - rotation => BlueBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => BlueCandleCandles { - _1, - _2, - _3, - _4, - }, - has_bottle => HasBottle { - True, - False, - }, - rotation => BrownBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => BrownCandleCandles { - _1, - _2, - _3, - _4, - }, - down => Down { - True, - False, - }, - drag => DragDown { - True, - False, - }, - age => CactusAge { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - bites => CakeBites { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - }, - signal_fire => SignalFire { - True, - False, - }, - candles => CandleCandles { - _1, - _2, - _3, - _4, - }, - age => CarrotsAge { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - conditional => Conditional { - True, - False, - }, - age => ChorusFlowerAge { - _0, - _1, - _2, - _3, - _4, - _5, - }, - age => CocoaAge { - _0, - _1, - _2, - }, - mode => Mode { - Save, - Load, - Corner, - Data, - }, - level => ComposterLevel { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - }, - rotation => CreeperHeadRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - rotation => CrimsonSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - rotation => CyanBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => CyanCandleCandles { - _1, - _2, - _3, - _4, - }, - distance => DarkOakLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - stage => DarkOakSaplingStage { - _0, - _1, - }, - rotation => DarkOakSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - inverted => Inverted { - True, - False, - }, - power => DaylightDetectorPower { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - triggered => Triggered { - True, - False, - }, - rotation => DragonHeadRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - eye => HasEye { - True, - False, - }, - moisture => FarmlandMoisture { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - age => FireAge { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - distance => FloweringAzaleaLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - age => FrostedIceAge { - _0, - _1, - _2, - _3, - }, - snowy => Snowy { - True, - False, - }, - rotation => GrayBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => GrayCandleCandles { - _1, - _2, - _3, - _4, - }, - rotation => GreenBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => GreenCandleCandles { - _1, - _2, - _3, - _4, - }, - power => HeavyWeightedPressurePlatePower { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - enabled => Enabled { - True, - False, - }, - orientation => Orientation { - DownEast, - DownNorth, - DownSouth, - DownWest, - UpEast, - UpNorth, - UpSouth, - UpWest, - WestUp, - EastUp, - NorthUp, - SouthUp, - }, - has_record => HasRecord { - True, - False, - }, - distance => JungleLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - stage => JungleSaplingStage { - _0, - _1, - }, - rotation => JungleSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - age => KelpAge { - _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, - }, - hanging => Hanging { - True, - False, - }, - level => LavaLevel { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - has_book => HasBook { - True, - False, - }, - level => LightLevel { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - rotation => LightBlueBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => LightBlueCandleCandles { - _1, - _2, - _3, - _4, - }, - rotation => LightGrayBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => LightGrayCandleCandles { - _1, - _2, - _3, - _4, - }, - power => LightWeightedPressurePlatePower { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - rotation => LimeBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => LimeCandleCandles { - _1, - _2, - _3, - _4, - }, - rotation => MagentaBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => MagentaCandleCandles { - _1, - _2, - _3, - _4, - }, - distance => MangroveLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - age => MangrovePropaguleAge { - _0, - _1, - _2, - _3, - _4, - }, - stage => MangrovePropaguleStage { - _0, - _1, - }, - rotation => MangroveSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - age => MelonStemAge { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - age => NetherWartAge { - _0, - _1, - _2, - _3, - }, - instrument => Instrument { - Harp, - Basedrum, - Snare, - Hat, - Bass, - Flute, - Bell, - Guitar, - Chime, - Xylophone, - IronXylophone, - CowBell, - Didgeridoo, - Bit, - Banjo, - Pling, - }, - note => NoteBlockNote { - _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, - }, - distance => OakLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - stage => OakSaplingStage { - _0, - _1, - }, - rotation => OakSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - rotation => OrangeBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => OrangeCandleCandles { - _1, - _2, - _3, - _4, - }, - rotation => PinkBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => PinkCandleCandles { - _1, - _2, - _3, - _4, - }, - extended => Extended { - True, - False, - }, - short => Short { - True, - False, - }, - rotation => PlayerHeadRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - thickness => Thickness { - TipMerge, - Tip, - Frustum, - Middle, - Base, - }, - vertical_direction => TipDirection { - Up, - Down, - }, - age => PotatoesAge { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - level => PowderSnowCauldronLevel { - _1, - _2, - _3, - }, - age => PumpkinStemAge { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - rotation => PurpleBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => PurpleCandleCandles { - _1, - _2, - _3, - _4, - }, - rotation => RedBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => RedCandleCandles { - _1, - _2, - _3, - _4, - }, - power => RedstoneWirePower { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - delay => RepeaterDelay { - _1, - _2, - _3, - _4, - }, - locked => Locked { - True, - False, - }, - charges => RespawnAnchorCharge { - _0, - _1, - _2, - _3, - _4, - }, - bottom => Bottom { - True, - False, - }, - distance => ScaffoldingDistance { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - bloom => Pulse { - True, - False, - }, - power => SculkSensorPower { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - sculk_sensor_phase => Phase { - Inactive, - Active, - Cooldown, - }, - can_summon => CanSummon { - True, - False, - }, - shrieking => Shrieking { - True, - False, - }, - pickles => SeaPicklePickles { - _1, - _2, - _3, - _4, - }, - rotation => SkeletonSkullRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - layers => SnowLayers { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - }, - distance => SpruceLeavesDistance { - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - stage => SpruceSaplingStage { - _0, - _1, - }, - rotation => SpruceSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - age => SugarCaneAge { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - age => SweetBerryBushAge { - _0, - _1, - _2, - _3, - }, - power => TargetOutputPower { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - unstable => Unstable { - True, - False, - }, - attached => Attached { - True, - False, - }, - disarmed => Disarmed { + "has_bottle" => HasBottle { True, False, }, - eggs => TurtleEggEggs { - _1, - _2, - _3, - _4, - }, - hatch => TurtleEggHatch { - _0, - _1, - _2, - }, - age => TwistingVinesAge { - _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, - }, - rotation => WarpedSignRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - level => WaterLevel { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - level => WaterCauldronLevel { - _1, - _2, - _3, - }, - age => WeepingVinesAge { - _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, - }, - age => WheatAge { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - }, - rotation => WhiteBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => WhiteCandleCandles { - _1, - _2, - _3, - _4, - }, - rotation => WitherSkeletonSkullRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - rotation => YellowBannerRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, - candles => YellowCandleCandles { - _1, - _2, - _3, - _4, - }, - rotation => ZombieHeadRotation { - _0, - _1, - _2, - _3, - _4, - _5, - _6, - _7, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - }, }, Blocks => { - acacia_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - acacia_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - acacia_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - acacia_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - acacia_leaves => BlockBehavior::default(), { - AcaciaLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - acacia_log => BlockBehavior::default(), { - Axis=Y, - }, - acacia_planks => BlockBehavior::default(), { - }, - acacia_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - acacia_sapling => BlockBehavior::default(), { - AcaciaSaplingStage=_0, - }, - acacia_sign => BlockBehavior::default(), { - AcaciaSignRotation=_0, - Waterlogged=False, - }, - acacia_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - acacia_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - acacia_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - acacia_wall_sign => BlockBehavior::default(), { + brain_coral_wall_fan => BlockBehavior::default(), { Facing=North, - Waterlogged=False, - }, - acacia_wood => BlockBehavior::default(), { - Axis=Y, - }, - activator_rail => BlockBehavior::default(), { - Shape=NorthSouth, - Powered=False, - Waterlogged=False, - }, - air => BlockBehavior::default(), { }, - allium => BlockBehavior::default(), { - }, - amethyst_block => BlockBehavior::default(), { - }, - amethyst_cluster => BlockBehavior::default(), { - Waterlogged=False, - Facing=Up, - }, - ancient_debris => BlockBehavior::default(), { - }, - andesite => BlockBehavior::default(), { - }, - andesite_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - andesite_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - andesite_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - anvil => BlockBehavior::default(), { - Facing=North, - }, - attached_melon_stem => BlockBehavior::default(), { - Facing=North, - }, - attached_pumpkin_stem => BlockBehavior::default(), { - Facing=North, - }, - azalea => BlockBehavior::default(), { - }, - azalea_leaves => BlockBehavior::default(), { - AzaleaLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - azure_bluet => BlockBehavior::default(), { - }, - bamboo => BlockBehavior::default(), { - BambooAge=_0, - Leaves=None, - BambooStage=_0, - }, - bamboo_sapling => BlockBehavior::default(), { - }, - barrel => BlockBehavior::default(), { - Facing=North, - Open=False, - }, - barrier => BlockBehavior::default(), { - }, - basalt => BlockBehavior::default(), { - Axis=Y, - }, - beacon => BlockBehavior::default(), { - }, - bedrock => BlockBehavior::default(), { - }, - bee_nest => BlockBehavior::default(), { - BeeNestHoneyLevel=_0, - Facing=North, - }, - beehive => BlockBehavior::default(), { - BeehiveHoneyLevel=_0, - Facing=North, - }, - beetroots => BlockBehavior::default(), { - BeetrootsAge=_0, - }, - bell => BlockBehavior::default(), { - Facing=North, - Attachment=Floor, - Powered=False, - }, - big_dripleaf => BlockBehavior::default(), { - Waterlogged=False, - Facing=North, - Tilt=None, - }, - big_dripleaf_stem => BlockBehavior::default(), { - Waterlogged=False, - Facing=North, - }, - birch_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - birch_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - birch_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - birch_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - birch_leaves => BlockBehavior::default(), { - BirchLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - birch_log => BlockBehavior::default(), { - Axis=Y, - }, - birch_planks => BlockBehavior::default(), { - }, - birch_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - birch_sapling => BlockBehavior::default(), { - BirchSaplingStage=_0, - }, - birch_sign => BlockBehavior::default(), { - BirchSignRotation=_0, - Waterlogged=False, - }, - birch_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - birch_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - birch_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - birch_wall_sign => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - birch_wood => BlockBehavior::default(), { - Axis=Y, - }, - black_banner => BlockBehavior::default(), { - BlackBannerRotation=_0, - }, - black_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - black_candle => BlockBehavior::default(), { - BlackCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - black_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - black_carpet => BlockBehavior::default(), { - }, - black_concrete => BlockBehavior::default(), { - }, - black_concrete_powder => BlockBehavior::default(), { - }, - black_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - black_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - black_stained_glass => BlockBehavior::default(), { - }, - black_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - black_terracotta => BlockBehavior::default(), { - }, - black_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - black_wool => BlockBehavior::default(), { - }, - blackstone => BlockBehavior::default(), { - }, - blackstone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - blackstone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - blackstone_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - blast_furnace => BlockBehavior::default(), { - Facing=North, - Lit=False, - }, - blue_banner => BlockBehavior::default(), { - BlueBannerRotation=_0, - }, - blue_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - blue_candle => BlockBehavior::default(), { - BlueCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - blue_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - blue_carpet => BlockBehavior::default(), { - }, - blue_concrete => BlockBehavior::default(), { - }, - blue_concrete_powder => BlockBehavior::default(), { - }, - blue_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - blue_ice => BlockBehavior::default(), { - }, - blue_orchid => BlockBehavior::default(), { - }, - blue_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - blue_stained_glass => BlockBehavior::default(), { - }, - blue_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - blue_terracotta => BlockBehavior::default(), { - }, - blue_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - blue_wool => BlockBehavior::default(), { - }, - bone_block => BlockBehavior::default(), { - Axis=Y, - }, - bookshelf => BlockBehavior::default(), { - }, - brain_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - brain_coral_block => BlockBehavior::default(), { - }, - brain_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - brain_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - brewing_stand => BlockBehavior::default(), { - HasBottle=False, - HasBottle=False, - HasBottle=False, - }, - brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - bricks => BlockBehavior::default(), { - }, - brown_banner => BlockBehavior::default(), { - BrownBannerRotation=_0, - }, - brown_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - brown_candle => BlockBehavior::default(), { - BrownCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - brown_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - brown_carpet => BlockBehavior::default(), { - }, - brown_concrete => BlockBehavior::default(), { - }, - brown_concrete_powder => BlockBehavior::default(), { - }, - brown_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - brown_mushroom => BlockBehavior::default(), { - }, - brown_mushroom_block => BlockBehavior::default(), { - Up=True, - Down=True, - North=True, - East=True, - South=True, - West=True, - }, - brown_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - brown_stained_glass => BlockBehavior::default(), { - }, - brown_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - brown_terracotta => BlockBehavior::default(), { - }, - brown_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - brown_wool => BlockBehavior::default(), { - }, - bubble_column => BlockBehavior::default(), { - DragDown=True, - }, - bubble_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - bubble_coral_block => BlockBehavior::default(), { - }, - bubble_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - bubble_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - budding_amethyst => BlockBehavior::default(), { - }, - cactus => BlockBehavior::default(), { - CactusAge=_0, - }, - cake => BlockBehavior::default(), { - CakeBites=_0, - }, - calcite => BlockBehavior::default(), { - }, - campfire => BlockBehavior::default(), { - Lit=True, - SignalFire=False, - Waterlogged=False, - Facing=North, - }, - candle => BlockBehavior::default(), { - CandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - candle_cake => BlockBehavior::default(), { - Lit=False, - }, - carrots => BlockBehavior::default(), { - CarrotsAge=_0, - }, - cartography_table => BlockBehavior::default(), { - }, - carved_pumpkin => BlockBehavior::default(), { - Facing=North, - }, - cauldron => BlockBehavior::default(), { - }, - cave_air => BlockBehavior::default(), { - }, - cave_vines => BlockBehavior::default(), { - }, - cave_vines_plant => BlockBehavior::default(), { - }, - chain => BlockBehavior::default(), { - Waterlogged=False, - Axis=Y, - }, - chain_command_block => BlockBehavior::default(), { - Facing=North, - Conditional=False, - }, - chest => BlockBehavior::default(), { - Facing=North, - Type=Single, - Waterlogged=False, - }, - chipped_anvil => BlockBehavior::default(), { - Facing=North, - }, - chiseled_deepslate => BlockBehavior::default(), { - }, - chiseled_nether_bricks => BlockBehavior::default(), { - }, - chiseled_polished_blackstone => BlockBehavior::default(), { - }, - chiseled_quartz_block => BlockBehavior::default(), { - }, - chiseled_red_sandstone => BlockBehavior::default(), { - }, - chiseled_sandstone => BlockBehavior::default(), { - }, - chiseled_stone_bricks => BlockBehavior::default(), { - }, - chorus_flower => BlockBehavior::default(), { - ChorusFlowerAge=_0, - }, - chorus_plant => BlockBehavior::default(), { - North=False, - East=False, - South=False, - West=False, - Up=False, - Down=False, - }, - clay => BlockBehavior::default(), { - }, - coal_block => BlockBehavior::default(), { - }, - coal_ore => BlockBehavior::default(), { - }, - coarse_dirt => BlockBehavior::default(), { - }, - cobbled_deepslate => BlockBehavior::default(), { - }, - cobbled_deepslate_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - cobbled_deepslate_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - cobbled_deepslate_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - cobblestone => BlockBehavior::default(), { - }, - cobblestone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - cobblestone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - cobblestone_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - cobweb => BlockBehavior::default(), { - }, - cocoa => BlockBehavior::default(), { - Facing=North, - CocoaAge=_0, - }, - command_block => BlockBehavior::default(), { - Facing=North, - Conditional=False, - }, - comparator => BlockBehavior::default(), { - Facing=North, - Mode=Compare, - Powered=False, - }, - composter => BlockBehavior::default(), { - ComposterLevel=_0, - }, - conduit => BlockBehavior::default(), { - Waterlogged=True, - }, - copper_block => BlockBehavior::default(), { - }, - copper_ore => BlockBehavior::default(), { - }, - cornflower => BlockBehavior::default(), { - }, - cracked_deepslate_bricks => BlockBehavior::default(), { - }, - cracked_deepslate_tiles => BlockBehavior::default(), { - }, - cracked_nether_bricks => BlockBehavior::default(), { - }, - cracked_polished_blackstone_bricks => BlockBehavior::default(), { - }, - cracked_stone_bricks => BlockBehavior::default(), { - }, - crafting_table => BlockBehavior::default(), { - }, - creeper_head => BlockBehavior::default(), { - CreeperHeadRotation=_0, - }, - creeper_wall_head => BlockBehavior::default(), { - Facing=North, - }, - crimson_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - crimson_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - crimson_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - crimson_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - crimson_fungus => BlockBehavior::default(), { - }, - crimson_hyphae => BlockBehavior::default(), { - Axis=Y, - }, - crimson_nylium => BlockBehavior::default(), { - }, - crimson_planks => BlockBehavior::default(), { - }, - crimson_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - crimson_roots => BlockBehavior::default(), { - }, - crimson_sign => BlockBehavior::default(), { - CrimsonSignRotation=_0, - Waterlogged=False, - }, - crimson_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - crimson_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - crimson_stem => BlockBehavior::default(), { - Axis=Y, - }, - crimson_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - crimson_wall_sign => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - crying_obsidian => BlockBehavior::default(), { - }, - cut_copper => BlockBehavior::default(), { - }, - cut_copper_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - cut_copper_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - cut_red_sandstone => BlockBehavior::default(), { - }, - cut_red_sandstone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - cut_sandstone => BlockBehavior::default(), { - }, - cut_sandstone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - cyan_banner => BlockBehavior::default(), { - CyanBannerRotation=_0, - }, - cyan_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - cyan_candle => BlockBehavior::default(), { - CyanCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - cyan_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - cyan_carpet => BlockBehavior::default(), { - }, - cyan_concrete => BlockBehavior::default(), { - }, - cyan_concrete_powder => BlockBehavior::default(), { - }, - cyan_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - cyan_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - cyan_stained_glass => BlockBehavior::default(), { - }, - cyan_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - cyan_terracotta => BlockBehavior::default(), { - }, - cyan_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - cyan_wool => BlockBehavior::default(), { - }, - damaged_anvil => BlockBehavior::default(), { - Facing=North, - }, - dandelion => BlockBehavior::default(), { - }, - dark_oak_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - dark_oak_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - dark_oak_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - dark_oak_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - dark_oak_leaves => BlockBehavior::default(), { - DarkOakLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - dark_oak_log => BlockBehavior::default(), { - Axis=Y, - }, - dark_oak_planks => BlockBehavior::default(), { - }, - dark_oak_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - dark_oak_sapling => BlockBehavior::default(), { - DarkOakSaplingStage=_0, - }, - dark_oak_sign => BlockBehavior::default(), { - DarkOakSignRotation=_0, - Waterlogged=False, - }, - dark_oak_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - dark_oak_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - dark_oak_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - dark_oak_wall_sign => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - dark_oak_wood => BlockBehavior::default(), { - Axis=Y, - }, - dark_prismarine => BlockBehavior::default(), { - }, - dark_prismarine_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - dark_prismarine_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - daylight_detector => BlockBehavior::default(), { - DaylightDetectorPower=_0, - Inverted=False, - }, - dead_brain_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_brain_coral_block => BlockBehavior::default(), { - }, - dead_brain_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_brain_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - dead_bubble_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_bubble_coral_block => BlockBehavior::default(), { - }, - dead_bubble_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_bubble_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - dead_bush => BlockBehavior::default(), { - }, - dead_fire_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_fire_coral_block => BlockBehavior::default(), { - }, - dead_fire_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_fire_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - dead_horn_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_horn_coral_block => BlockBehavior::default(), { - }, - dead_horn_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_horn_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - dead_tube_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_tube_coral_block => BlockBehavior::default(), { - }, - dead_tube_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - dead_tube_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - deepslate => BlockBehavior::default(), { - Axis=Y, - }, - deepslate_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - deepslate_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - deepslate_brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - deepslate_bricks => BlockBehavior::default(), { - }, - deepslate_coal_ore => BlockBehavior::default(), { - }, - deepslate_copper_ore => BlockBehavior::default(), { - }, - deepslate_diamond_ore => BlockBehavior::default(), { - }, - deepslate_emerald_ore => BlockBehavior::default(), { - }, - deepslate_gold_ore => BlockBehavior::default(), { - }, - deepslate_iron_ore => BlockBehavior::default(), { - }, - deepslate_lapis_ore => BlockBehavior::default(), { - }, - deepslate_redstone_ore => BlockBehavior::default(), { - Lit=False, - }, - deepslate_tile_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - deepslate_tile_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - deepslate_tile_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - deepslate_tiles => BlockBehavior::default(), { - }, - detector_rail => BlockBehavior::default(), { - Shape=NorthSouth, - Powered=False, - Waterlogged=False, - }, - diamond_block => BlockBehavior::default(), { - }, - diamond_ore => BlockBehavior::default(), { - }, - diorite => BlockBehavior::default(), { - }, - diorite_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - diorite_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - diorite_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - dirt => BlockBehavior::default(), { - }, - dirt_path => BlockBehavior::default(), { - }, - dispenser => BlockBehavior::default(), { - Facing=North, - Triggered=False, - }, - dragon_egg => BlockBehavior::default(), { - }, - dragon_head => BlockBehavior::default(), { - DragonHeadRotation=_0, - }, - dragon_wall_head => BlockBehavior::default(), { - Facing=North, - }, - dried_kelp_block => BlockBehavior::default(), { - }, - dripstone_block => BlockBehavior::default(), { - }, - dropper => BlockBehavior::default(), { - Facing=North, - Triggered=False, - }, - emerald_block => BlockBehavior::default(), { - }, - emerald_ore => BlockBehavior::default(), { - }, - enchanting_table => BlockBehavior::default(), { - }, - end_gateway => BlockBehavior::default(), { - }, - end_portal => BlockBehavior::default(), { - }, - end_portal_frame => BlockBehavior::default(), { - Facing=North, - HasEye=False, - }, - end_rod => BlockBehavior::default(), { - Facing=Up, - }, - end_stone => BlockBehavior::default(), { - }, - end_stone_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - end_stone_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - end_stone_brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - end_stone_bricks => BlockBehavior::default(), { - }, - ender_chest => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - exposed_copper => BlockBehavior::default(), { - }, - exposed_cut_copper => BlockBehavior::default(), { - }, - exposed_cut_copper_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - exposed_cut_copper_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - farmland => BlockBehavior::default(), { - FarmlandMoisture=_0, - }, - fern => BlockBehavior::default(), { - }, - fire => BlockBehavior::default(), { - FireAge=_0, - North=False, - East=False, - South=False, - West=False, - Up=False, - }, - fire_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - fire_coral_block => BlockBehavior::default(), { - }, - fire_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - fire_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - fletching_table => BlockBehavior::default(), { - }, - flower_pot => BlockBehavior::default(), { - }, - flowering_azalea => BlockBehavior::default(), { - }, - flowering_azalea_leaves => BlockBehavior::default(), { - FloweringAzaleaLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - frogspawn => BlockBehavior::default(), { - }, - frosted_ice => BlockBehavior::default(), { - FrostedIceAge=_0, - }, - furnace => BlockBehavior::default(), { - Facing=North, - Lit=False, - }, - gilded_blackstone => BlockBehavior::default(), { - }, - glass => BlockBehavior::default(), { - }, - glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - glow_lichen => BlockBehavior::default(), { - }, - glowstone => BlockBehavior::default(), { - }, - gold_block => BlockBehavior::default(), { - }, - gold_ore => BlockBehavior::default(), { - }, - granite => BlockBehavior::default(), { - }, - granite_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - granite_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - granite_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - grass => BlockBehavior::default(), { - }, - grass_block => BlockBehavior::default(), { - Snowy=False, - }, - gravel => BlockBehavior::default(), { - }, - gray_banner => BlockBehavior::default(), { - GrayBannerRotation=_0, - }, - gray_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - gray_candle => BlockBehavior::default(), { - GrayCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - gray_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - gray_carpet => BlockBehavior::default(), { - }, - gray_concrete => BlockBehavior::default(), { - }, - gray_concrete_powder => BlockBehavior::default(), { - }, - gray_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - gray_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - gray_stained_glass => BlockBehavior::default(), { - }, - gray_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - gray_terracotta => BlockBehavior::default(), { - }, - gray_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - gray_wool => BlockBehavior::default(), { - }, - green_banner => BlockBehavior::default(), { - GreenBannerRotation=_0, - }, - green_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - green_candle => BlockBehavior::default(), { - GreenCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - green_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - green_carpet => BlockBehavior::default(), { - }, - green_concrete => BlockBehavior::default(), { - }, - green_concrete_powder => BlockBehavior::default(), { - }, - green_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - green_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - green_stained_glass => BlockBehavior::default(), { - }, - green_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - green_terracotta => BlockBehavior::default(), { - }, - green_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - green_wool => BlockBehavior::default(), { - }, - grindstone => BlockBehavior::default(), { - Facing=North, - Face=Wall, - }, - hanging_roots => BlockBehavior::default(), { - Waterlogged=False, - }, - hay_block => BlockBehavior::default(), { - Axis=Y, - }, - heavy_weighted_pressure_plate => BlockBehavior::default(), { - HeavyWeightedPressurePlatePower=_0, - }, - honey_block => BlockBehavior::default(), { - }, - honeycomb_block => BlockBehavior::default(), { - }, - hopper => BlockBehavior::default(), { - Facing=Down, - Enabled=True, - }, - horn_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - horn_coral_block => BlockBehavior::default(), { - }, - horn_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - horn_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - ice => BlockBehavior::default(), { - }, - infested_chiseled_stone_bricks => BlockBehavior::default(), { - }, - infested_cobblestone => BlockBehavior::default(), { - }, - infested_cracked_stone_bricks => BlockBehavior::default(), { - }, - infested_deepslate => BlockBehavior::default(), { - }, - infested_mossy_stone_bricks => BlockBehavior::default(), { - }, - infested_stone => BlockBehavior::default(), { - }, - infested_stone_bricks => BlockBehavior::default(), { - }, - iron_bars => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - iron_block => BlockBehavior::default(), { - }, - iron_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - iron_ore => BlockBehavior::default(), { - }, - iron_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - jack_o_lantern => BlockBehavior::default(), { - Facing=North, - }, - jigsaw => BlockBehavior::default(), { - Orientation=NorthUp, - }, - jukebox => BlockBehavior::default(), { - HasRecord=False, - }, - jungle_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - jungle_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - jungle_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - jungle_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - jungle_leaves => BlockBehavior::default(), { - JungleLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - jungle_log => BlockBehavior::default(), { - Axis=Y, - }, - jungle_planks => BlockBehavior::default(), { - }, - jungle_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - jungle_sapling => BlockBehavior::default(), { - JungleSaplingStage=_0, - }, - jungle_sign => BlockBehavior::default(), { - JungleSignRotation=_0, - Waterlogged=False, - }, - jungle_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - jungle_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - jungle_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - jungle_wall_sign => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - jungle_wood => BlockBehavior::default(), { - Axis=Y, - }, - kelp => BlockBehavior::default(), { - KelpAge=_0, - }, - kelp_plant => BlockBehavior::default(), { - }, - ladder => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - lantern => BlockBehavior::default(), { - Hanging=False, - Waterlogged=False, - }, - lapis_block => BlockBehavior::default(), { - }, - lapis_ore => BlockBehavior::default(), { - }, - large_amethyst_bud => BlockBehavior::default(), { - Waterlogged=False, - Facing=Up, - }, - large_fern => BlockBehavior::default(), { - Half=Lower, - }, - lava => BlockBehavior::default(), { - LavaLevel=_0, - }, - lava_cauldron => BlockBehavior::default(), { - }, - lectern => BlockBehavior::default(), { - Facing=North, - Powered=False, - HasBook=False, - }, - lever => BlockBehavior::default(), { - Face=Wall, - Facing=North, - Powered=False, - }, - light => BlockBehavior::default(), { - LightLevel=_15, - Waterlogged=False, - }, - light_blue_banner => BlockBehavior::default(), { - LightBlueBannerRotation=_0, - }, - light_blue_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - light_blue_candle => BlockBehavior::default(), { - LightBlueCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - light_blue_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - light_blue_carpet => BlockBehavior::default(), { - }, - light_blue_concrete => BlockBehavior::default(), { - }, - light_blue_concrete_powder => BlockBehavior::default(), { - }, - light_blue_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - light_blue_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - light_blue_stained_glass => BlockBehavior::default(), { - }, - light_blue_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - light_blue_terracotta => BlockBehavior::default(), { - }, - light_blue_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - light_blue_wool => BlockBehavior::default(), { - }, - light_gray_banner => BlockBehavior::default(), { - LightGrayBannerRotation=_0, - }, - light_gray_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - light_gray_candle => BlockBehavior::default(), { - LightGrayCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - light_gray_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - light_gray_carpet => BlockBehavior::default(), { - }, - light_gray_concrete => BlockBehavior::default(), { - }, - light_gray_concrete_powder => BlockBehavior::default(), { - }, - light_gray_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - light_gray_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - light_gray_stained_glass => BlockBehavior::default(), { - }, - light_gray_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - light_gray_terracotta => BlockBehavior::default(), { - }, - light_gray_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - light_gray_wool => BlockBehavior::default(), { - }, - light_weighted_pressure_plate => BlockBehavior::default(), { - LightWeightedPressurePlatePower=_0, - }, - lightning_rod => BlockBehavior::default(), { - Facing=Up, - Powered=False, - Waterlogged=False, - }, - lilac => BlockBehavior::default(), { - Half=Lower, - }, - lily_of_the_valley => BlockBehavior::default(), { - }, - lily_pad => BlockBehavior::default(), { - }, - lime_banner => BlockBehavior::default(), { - LimeBannerRotation=_0, - }, - lime_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - lime_candle => BlockBehavior::default(), { - LimeCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - lime_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - lime_carpet => BlockBehavior::default(), { - }, - lime_concrete => BlockBehavior::default(), { - }, - lime_concrete_powder => BlockBehavior::default(), { - }, - lime_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - lime_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - lime_stained_glass => BlockBehavior::default(), { - }, - lime_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - lime_terracotta => BlockBehavior::default(), { - }, - lime_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - lime_wool => BlockBehavior::default(), { - }, - lodestone => BlockBehavior::default(), { - }, - loom => BlockBehavior::default(), { - Facing=North, - }, - magenta_banner => BlockBehavior::default(), { - MagentaBannerRotation=_0, - }, - magenta_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - magenta_candle => BlockBehavior::default(), { - MagentaCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - magenta_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - magenta_carpet => BlockBehavior::default(), { - }, - magenta_concrete => BlockBehavior::default(), { - }, - magenta_concrete_powder => BlockBehavior::default(), { - }, - magenta_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - magenta_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - magenta_stained_glass => BlockBehavior::default(), { - }, - magenta_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - magenta_terracotta => BlockBehavior::default(), { - }, - magenta_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - magenta_wool => BlockBehavior::default(), { - }, - magma_block => BlockBehavior::default(), { - }, - mangrove_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - mangrove_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - mangrove_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - mangrove_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - mangrove_leaves => BlockBehavior::default(), { - MangroveLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - mangrove_log => BlockBehavior::default(), { - Axis=Y, - }, - mangrove_planks => BlockBehavior::default(), { - }, - mangrove_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - mangrove_propagule => BlockBehavior::default(), { - MangrovePropaguleStage=_0, - MangrovePropaguleAge=_0, - Waterlogged=False, - Hanging=False, - }, - mangrove_roots => BlockBehavior::default(), { - Waterlogged=False, - }, - mangrove_sign => BlockBehavior::default(), { - MangroveSignRotation=_0, - Waterlogged=False, - }, - mangrove_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - mangrove_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - mangrove_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - mangrove_wall_sign => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - mangrove_wood => BlockBehavior::default(), { - Axis=Y, - }, - medium_amethyst_bud => BlockBehavior::default(), { - Waterlogged=False, - Facing=Up, - }, - melon => BlockBehavior::default(), { - }, - melon_stem => BlockBehavior::default(), { - MelonStemAge=_0, - }, - moss_block => BlockBehavior::default(), { - }, - moss_carpet => BlockBehavior::default(), { - }, - mossy_cobblestone => BlockBehavior::default(), { - }, - mossy_cobblestone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - mossy_cobblestone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - mossy_cobblestone_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - mossy_stone_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - mossy_stone_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - mossy_stone_brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - mossy_stone_bricks => BlockBehavior::default(), { - }, - moving_piston => BlockBehavior::default(), { - Facing=North, - Type=Normal, - }, - mud => BlockBehavior::default(), { - }, - mud_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - mud_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - mud_brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - mud_bricks => BlockBehavior::default(), { - }, - muddy_mangrove_roots => BlockBehavior::default(), { - Axis=Y, - }, - mushroom_stem => BlockBehavior::default(), { - Up=True, - Down=True, - North=True, - East=True, - South=True, - West=True, - }, - mycelium => BlockBehavior::default(), { - Snowy=False, - }, - nether_brick_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - nether_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - nether_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - nether_brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - nether_bricks => BlockBehavior::default(), { - }, - nether_gold_ore => BlockBehavior::default(), { - }, - nether_portal => BlockBehavior::default(), { - Axis=X, - }, - nether_quartz_ore => BlockBehavior::default(), { - }, - nether_sprouts => BlockBehavior::default(), { - }, - nether_wart => BlockBehavior::default(), { - NetherWartAge=_0, - }, - nether_wart_block => BlockBehavior::default(), { - }, - netherite_block => BlockBehavior::default(), { - }, - netherrack => BlockBehavior::default(), { - }, - note_block => BlockBehavior::default(), { - Instrument=Harp, - Powered=False, - NoteBlockNote=_0, - }, - oak_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - oak_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - oak_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - oak_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - oak_leaves => BlockBehavior::default(), { - OakLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - oak_log => BlockBehavior::default(), { - Axis=Y, - }, - oak_planks => BlockBehavior::default(), { - }, - oak_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - oak_sapling => BlockBehavior::default(), { - OakSaplingStage=_0, - }, - oak_sign => BlockBehavior::default(), { - OakSignRotation=_0, - Waterlogged=False, - }, - oak_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - oak_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - oak_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - oak_wall_sign => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - oak_wood => BlockBehavior::default(), { - Axis=Y, - }, - observer => BlockBehavior::default(), { - Facing=South, - Powered=False, - }, - obsidian => BlockBehavior::default(), { - }, - ochre_froglight => BlockBehavior::default(), { - Axis=Y, - }, - orange_banner => BlockBehavior::default(), { - OrangeBannerRotation=_0, - }, - orange_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - orange_candle => BlockBehavior::default(), { - OrangeCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - orange_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - orange_carpet => BlockBehavior::default(), { - }, - orange_concrete => BlockBehavior::default(), { - }, - orange_concrete_powder => BlockBehavior::default(), { - }, - orange_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - orange_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - orange_stained_glass => BlockBehavior::default(), { - }, - orange_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - orange_terracotta => BlockBehavior::default(), { - }, - orange_tulip => BlockBehavior::default(), { - }, - orange_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - orange_wool => BlockBehavior::default(), { - }, - oxeye_daisy => BlockBehavior::default(), { - }, - oxidized_copper => BlockBehavior::default(), { - }, - oxidized_cut_copper => BlockBehavior::default(), { - }, - oxidized_cut_copper_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - oxidized_cut_copper_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - packed_ice => BlockBehavior::default(), { - }, - packed_mud => BlockBehavior::default(), { - }, - pearlescent_froglight => BlockBehavior::default(), { - Axis=Y, - }, - peony => BlockBehavior::default(), { - Half=Lower, - }, - petrified_oak_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - pink_banner => BlockBehavior::default(), { - PinkBannerRotation=_0, - }, - pink_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - pink_candle => BlockBehavior::default(), { - PinkCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - pink_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - pink_carpet => BlockBehavior::default(), { - }, - pink_concrete => BlockBehavior::default(), { - }, - pink_concrete_powder => BlockBehavior::default(), { - }, - pink_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - pink_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - pink_stained_glass => BlockBehavior::default(), { - }, - pink_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - pink_terracotta => BlockBehavior::default(), { - }, - pink_tulip => BlockBehavior::default(), { - }, - pink_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - pink_wool => BlockBehavior::default(), { - }, - piston => BlockBehavior::default(), { - Facing=North, - Extended=False, - }, - piston_head => BlockBehavior::default(), { - Facing=North, - Type=Normal, - Short=False, - }, - player_head => BlockBehavior::default(), { - PlayerHeadRotation=_0, - }, - player_wall_head => BlockBehavior::default(), { - Facing=North, - }, - podzol => BlockBehavior::default(), { - Snowy=False, - }, - pointed_dripstone => BlockBehavior::default(), { - TipDirection=Up, - Thickness=Tip, - Waterlogged=False, - }, - polished_andesite => BlockBehavior::default(), { - }, - polished_andesite_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - polished_andesite_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - polished_basalt => BlockBehavior::default(), { - Axis=Y, - }, - polished_blackstone => BlockBehavior::default(), { - }, - polished_blackstone_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - polished_blackstone_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - polished_blackstone_brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - polished_blackstone_bricks => BlockBehavior::default(), { - }, - polished_blackstone_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - polished_blackstone_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - polished_blackstone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - polished_blackstone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - polished_blackstone_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - polished_deepslate => BlockBehavior::default(), { - }, - polished_deepslate_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - polished_deepslate_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - polished_deepslate_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - polished_diorite => BlockBehavior::default(), { - }, - polished_diorite_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - polished_diorite_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - polished_granite => BlockBehavior::default(), { - }, - polished_granite_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - polished_granite_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - poppy => BlockBehavior::default(), { - }, - potatoes => BlockBehavior::default(), { - PotatoesAge=_0, - }, - potted_acacia_sapling => BlockBehavior::default(), { - }, - potted_allium => BlockBehavior::default(), { - }, - potted_azalea_bush => BlockBehavior::default(), { - }, - potted_azure_bluet => BlockBehavior::default(), { - }, - potted_bamboo => BlockBehavior::default(), { - }, - potted_birch_sapling => BlockBehavior::default(), { - }, - potted_blue_orchid => BlockBehavior::default(), { - }, - potted_brown_mushroom => BlockBehavior::default(), { - }, - potted_cactus => BlockBehavior::default(), { - }, - potted_cornflower => BlockBehavior::default(), { - }, - potted_crimson_fungus => BlockBehavior::default(), { - }, - potted_crimson_roots => BlockBehavior::default(), { - }, - potted_dandelion => BlockBehavior::default(), { - }, - potted_dark_oak_sapling => BlockBehavior::default(), { - }, - potted_dead_bush => BlockBehavior::default(), { - }, - potted_fern => BlockBehavior::default(), { - }, - potted_flowering_azalea_bush => BlockBehavior::default(), { - }, - potted_jungle_sapling => BlockBehavior::default(), { - }, - potted_lily_of_the_valley => BlockBehavior::default(), { - }, - potted_mangrove_propagule => BlockBehavior::default(), { - }, - potted_oak_sapling => BlockBehavior::default(), { - }, - potted_orange_tulip => BlockBehavior::default(), { - }, - potted_oxeye_daisy => BlockBehavior::default(), { - }, - potted_pink_tulip => BlockBehavior::default(), { - }, - potted_poppy => BlockBehavior::default(), { - }, - potted_red_mushroom => BlockBehavior::default(), { - }, - potted_red_tulip => BlockBehavior::default(), { - }, - potted_spruce_sapling => BlockBehavior::default(), { - }, - potted_warped_fungus => BlockBehavior::default(), { - }, - potted_warped_roots => BlockBehavior::default(), { - }, - potted_white_tulip => BlockBehavior::default(), { - }, - potted_wither_rose => BlockBehavior::default(), { - }, - powder_snow => BlockBehavior::default(), { - }, - powder_snow_cauldron => BlockBehavior::default(), { - PowderSnowCauldronLevel=_1, - }, - powered_rail => BlockBehavior::default(), { - Shape=NorthSouth, - Powered=False, - Waterlogged=False, - }, - prismarine => BlockBehavior::default(), { - }, - prismarine_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - prismarine_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - prismarine_bricks => BlockBehavior::default(), { - }, - prismarine_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - prismarine_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - prismarine_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - pumpkin => BlockBehavior::default(), { - }, - pumpkin_stem => BlockBehavior::default(), { - PumpkinStemAge=_0, - }, - purple_banner => BlockBehavior::default(), { - PurpleBannerRotation=_0, - }, - purple_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - purple_candle => BlockBehavior::default(), { - PurpleCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - purple_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - purple_carpet => BlockBehavior::default(), { - }, - purple_concrete => BlockBehavior::default(), { - }, - purple_concrete_powder => BlockBehavior::default(), { - }, - purple_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - purple_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - purple_stained_glass => BlockBehavior::default(), { - }, - purple_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - purple_terracotta => BlockBehavior::default(), { - }, - purple_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - purple_wool => BlockBehavior::default(), { - }, - purpur_block => BlockBehavior::default(), { - }, - purpur_pillar => BlockBehavior::default(), { - Axis=Y, - }, - purpur_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - purpur_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - quartz_block => BlockBehavior::default(), { - }, - quartz_bricks => BlockBehavior::default(), { - }, - quartz_pillar => BlockBehavior::default(), { - Axis=Y, - }, - quartz_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - quartz_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - rail => BlockBehavior::default(), { - Shape=NorthSouth, - Waterlogged=False, - }, - raw_copper_block => BlockBehavior::default(), { - }, - raw_gold_block => BlockBehavior::default(), { - }, - raw_iron_block => BlockBehavior::default(), { - }, - red_banner => BlockBehavior::default(), { - RedBannerRotation=_0, - }, - red_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - red_candle => BlockBehavior::default(), { - RedCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - red_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - red_carpet => BlockBehavior::default(), { - }, - red_concrete => BlockBehavior::default(), { - }, - red_concrete_powder => BlockBehavior::default(), { - }, - red_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - red_mushroom => BlockBehavior::default(), { - }, - red_mushroom_block => BlockBehavior::default(), { - Up=True, - Down=True, - North=True, - East=True, - South=True, - West=True, - }, - red_nether_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - red_nether_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - red_nether_brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - red_nether_bricks => BlockBehavior::default(), { - }, - red_sand => BlockBehavior::default(), { - }, - red_sandstone => BlockBehavior::default(), { - }, - red_sandstone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - red_sandstone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - red_sandstone_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - red_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - red_stained_glass => BlockBehavior::default(), { - }, - red_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - red_terracotta => BlockBehavior::default(), { - }, - red_tulip => BlockBehavior::default(), { - }, - red_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - red_wool => BlockBehavior::default(), { - }, - redstone_block => BlockBehavior::default(), { - }, - redstone_lamp => BlockBehavior::default(), { - Lit=False, - }, - redstone_ore => BlockBehavior::default(), { - Lit=False, - }, - redstone_torch => BlockBehavior::default(), { - Lit=True, - }, - redstone_wall_torch => BlockBehavior::default(), { - Facing=North, - Lit=True, - }, - redstone_wire => BlockBehavior::default(), { - North=None, - East=None, - South=None, - West=None, - RedstoneWirePower=_0, - }, - reinforced_deepslate => BlockBehavior::default(), { - }, - repeater => BlockBehavior::default(), { - Facing=North, - RepeaterDelay=_1, - Locked=False, - Powered=False, - }, - repeating_command_block => BlockBehavior::default(), { - Facing=North, - Conditional=False, - }, - respawn_anchor => BlockBehavior::default(), { - RespawnAnchorCharge=_0, - }, - rooted_dirt => BlockBehavior::default(), { - }, - rose_bush => BlockBehavior::default(), { - Half=Lower, - }, - sand => BlockBehavior::default(), { - }, - sandstone => BlockBehavior::default(), { - }, - sandstone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - sandstone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - sandstone_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - scaffolding => BlockBehavior::default(), { - ScaffoldingDistance=_7, - Waterlogged=False, - Bottom=False, - }, - sculk => BlockBehavior::default(), { - }, - sculk_catalyst => BlockBehavior::default(), { - Pulse=False, - }, - sculk_sensor => BlockBehavior::default(), { - Phase=Inactive, - SculkSensorPower=_0, - Waterlogged=False, - }, - sculk_shrieker => BlockBehavior::default(), { - Shrieking=False, - Waterlogged=False, - CanSummon=False, - }, - sculk_vein => BlockBehavior::default(), { - }, - sea_lantern => BlockBehavior::default(), { - }, - sea_pickle => BlockBehavior::default(), { - SeaPicklePickles=_1, - Waterlogged=True, - }, - seagrass => BlockBehavior::default(), { - }, - shroomlight => BlockBehavior::default(), { - }, - shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - skeleton_skull => BlockBehavior::default(), { - SkeletonSkullRotation=_0, - }, - skeleton_wall_skull => BlockBehavior::default(), { - Facing=North, - }, - slime_block => BlockBehavior::default(), { - }, - small_amethyst_bud => BlockBehavior::default(), { - Waterlogged=False, - Facing=Up, - }, - small_dripleaf => BlockBehavior::default(), { - Half=Lower, - Waterlogged=False, - Facing=North, - }, - smithing_table => BlockBehavior::default(), { - }, - smoker => BlockBehavior::default(), { - Facing=North, - Lit=False, - }, - smooth_basalt => BlockBehavior::default(), { - }, - smooth_quartz => BlockBehavior::default(), { - }, - smooth_quartz_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - smooth_quartz_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - smooth_red_sandstone => BlockBehavior::default(), { - }, - smooth_red_sandstone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - smooth_red_sandstone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - smooth_sandstone => BlockBehavior::default(), { - }, - smooth_sandstone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - smooth_sandstone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - smooth_stone => BlockBehavior::default(), { - }, - smooth_stone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - snow => BlockBehavior::default(), { - SnowLayers=_1, - }, - snow_block => BlockBehavior::default(), { - }, - soul_campfire => BlockBehavior::default(), { - Lit=True, - SignalFire=False, - Waterlogged=False, - Facing=North, - }, - soul_fire => BlockBehavior::default(), { - }, - soul_lantern => BlockBehavior::default(), { - Hanging=False, - Waterlogged=False, - }, - soul_sand => BlockBehavior::default(), { - }, - soul_soil => BlockBehavior::default(), { - }, - soul_torch => BlockBehavior::default(), { - }, - soul_wall_torch => BlockBehavior::default(), { - Facing=North, - }, - spawner => BlockBehavior::default(), { - }, - sponge => BlockBehavior::default(), { - }, - spore_blossom => BlockBehavior::default(), { - }, - spruce_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - spruce_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - spruce_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - spruce_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - spruce_leaves => BlockBehavior::default(), { - SpruceLeavesDistance=_7, - Persistent=False, - Waterlogged=False, - }, - spruce_log => BlockBehavior::default(), { - Axis=Y, - }, - spruce_planks => BlockBehavior::default(), { - }, - spruce_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - spruce_sapling => BlockBehavior::default(), { - SpruceSaplingStage=_0, - }, - spruce_sign => BlockBehavior::default(), { - SpruceSignRotation=_0, - Waterlogged=False, - }, - spruce_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - spruce_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - spruce_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - spruce_wall_sign => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - spruce_wood => BlockBehavior::default(), { - Axis=Y, - }, - sticky_piston => BlockBehavior::default(), { - Facing=North, - Extended=False, - }, - stone => BlockBehavior::default(), { - }, - stone_brick_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - stone_brick_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - stone_brick_wall => BlockBehavior::default(), { - Up=True, - NorthWall=None, - EastWall=None, - WestWall=None, - SouthWall=None, - Waterlogged=False, - }, - stone_bricks => BlockBehavior::default(), { - }, - stone_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - stone_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - stone_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - stone_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - stonecutter => BlockBehavior::default(), { - Facing=North, - }, - stripped_acacia_log => BlockBehavior::default(), { - Axis=Y, - }, - stripped_acacia_wood => BlockBehavior::default(), { - Axis=Y, - }, - stripped_birch_log => BlockBehavior::default(), { - Axis=Y, - }, - stripped_birch_wood => BlockBehavior::default(), { - Axis=Y, - }, - stripped_crimson_hyphae => BlockBehavior::default(), { - Axis=Y, - }, - stripped_crimson_stem => BlockBehavior::default(), { - Axis=Y, - }, - stripped_dark_oak_log => BlockBehavior::default(), { - Axis=Y, - }, - stripped_dark_oak_wood => BlockBehavior::default(), { - Axis=Y, - }, - stripped_jungle_log => BlockBehavior::default(), { - Axis=Y, - }, - stripped_jungle_wood => BlockBehavior::default(), { - Axis=Y, - }, - stripped_mangrove_log => BlockBehavior::default(), { - Axis=Y, - }, - stripped_mangrove_wood => BlockBehavior::default(), { - Axis=Y, - }, - stripped_oak_log => BlockBehavior::default(), { - Axis=Y, - }, - stripped_oak_wood => BlockBehavior::default(), { - Axis=Y, - }, - stripped_spruce_log => BlockBehavior::default(), { - Axis=Y, - }, - stripped_spruce_wood => BlockBehavior::default(), { - Axis=Y, - }, - stripped_warped_hyphae => BlockBehavior::default(), { - Axis=Y, - }, - stripped_warped_stem => BlockBehavior::default(), { - Axis=Y, - }, - structure_block => BlockBehavior::default(), { - Mode=Load, - }, - structure_void => BlockBehavior::default(), { - }, - sugar_cane => BlockBehavior::default(), { - SugarCaneAge=_0, - }, - sunflower => BlockBehavior::default(), { - Half=Lower, - }, - sweet_berry_bush => BlockBehavior::default(), { - SweetBerryBushAge=_0, - }, - tall_grass => BlockBehavior::default(), { - Half=Lower, - }, - tall_seagrass => BlockBehavior::default(), { - Half=Lower, - }, - target => BlockBehavior::default(), { - TargetOutputPower=_0, - }, - terracotta => BlockBehavior::default(), { - }, - tinted_glass => BlockBehavior::default(), { - }, - tnt => BlockBehavior::default(), { - Unstable=False, - }, - torch => BlockBehavior::default(), { - }, - trapped_chest => BlockBehavior::default(), { - Facing=North, - Type=Single, - Waterlogged=False, - }, - tripwire => BlockBehavior::default(), { - Powered=False, - Attached=False, - Disarmed=False, - North=False, - East=False, - West=False, - South=False, - }, - tripwire_hook => BlockBehavior::default(), { - Facing=North, - Powered=False, - Attached=False, - }, - tube_coral => BlockBehavior::default(), { - Waterlogged=True, - }, - tube_coral_block => BlockBehavior::default(), { - }, - tube_coral_fan => BlockBehavior::default(), { - Waterlogged=True, - }, - tube_coral_wall_fan => BlockBehavior::default(), { - Facing=North, - Waterlogged=True, - }, - tuff => BlockBehavior::default(), { - }, - turtle_egg => BlockBehavior::default(), { - TurtleEggHatch=_0, - TurtleEggEggs=_1, - }, - twisting_vines => BlockBehavior::default(), { - TwistingVinesAge=_0, - }, - twisting_vines_plant => BlockBehavior::default(), { - }, - verdant_froglight => BlockBehavior::default(), { - Axis=Y, - }, - vine => BlockBehavior::default(), { - Up=False, - North=False, - East=False, - South=False, - West=False, - }, - void_air => BlockBehavior::default(), { - }, - wall_torch => BlockBehavior::default(), { - Facing=North, - }, - warped_button => BlockBehavior::default(), { - Facing=North, - Powered=False, - Face=Wall, - }, - warped_door => BlockBehavior::default(), { - Half=Lower, - Facing=North, - Open=False, - Hinge=Left, - Powered=False, - }, - warped_fence => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - warped_fence_gate => BlockBehavior::default(), { - Facing=North, - Open=False, - Powered=False, - InWall=False, - }, - warped_fungus => BlockBehavior::default(), { - }, - warped_hyphae => BlockBehavior::default(), { - Axis=Y, - }, - warped_nylium => BlockBehavior::default(), { - }, - warped_planks => BlockBehavior::default(), { - }, - warped_pressure_plate => BlockBehavior::default(), { - Powered=False, - }, - warped_roots => BlockBehavior::default(), { - }, - warped_sign => BlockBehavior::default(), { - WarpedSignRotation=_0, - Waterlogged=False, - }, - warped_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - warped_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - warped_stem => BlockBehavior::default(), { - Axis=Y, - }, - warped_trapdoor => BlockBehavior::default(), { - Facing=North, - Open=False, - Half=Bottom, - Powered=False, - Waterlogged=False, - }, - warped_wall_sign => BlockBehavior::default(), { - Facing=North, - Waterlogged=False, - }, - warped_wart_block => BlockBehavior::default(), { - }, - water => BlockBehavior::default(), { - WaterLevel=_0, - }, - water_cauldron => BlockBehavior::default(), { - WaterCauldronLevel=_1, - }, - waxed_copper_block => BlockBehavior::default(), { - }, - waxed_cut_copper => BlockBehavior::default(), { - }, - waxed_cut_copper_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - waxed_cut_copper_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - waxed_exposed_copper => BlockBehavior::default(), { - }, - waxed_exposed_cut_copper => BlockBehavior::default(), { - }, - waxed_exposed_cut_copper_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - waxed_exposed_cut_copper_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - waxed_oxidized_copper => BlockBehavior::default(), { - }, - waxed_oxidized_cut_copper => BlockBehavior::default(), { - }, - waxed_oxidized_cut_copper_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - waxed_oxidized_cut_copper_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - waxed_weathered_copper => BlockBehavior::default(), { - }, - waxed_weathered_cut_copper => BlockBehavior::default(), { - }, - waxed_weathered_cut_copper_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - waxed_weathered_cut_copper_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - weathered_copper => BlockBehavior::default(), { - }, - weathered_cut_copper => BlockBehavior::default(), { - }, - weathered_cut_copper_slab => BlockBehavior::default(), { - Type=Bottom, - Waterlogged=False, - }, - weathered_cut_copper_stairs => BlockBehavior::default(), { - Facing=North, - Half=Bottom, - Shape=Straight, - Waterlogged=False, - }, - weeping_vines => BlockBehavior::default(), { - WeepingVinesAge=_0, - }, - weeping_vines_plant => BlockBehavior::default(), { - }, - wet_sponge => BlockBehavior::default(), { - }, - wheat => BlockBehavior::default(), { - WheatAge=_0, - }, - white_banner => BlockBehavior::default(), { - WhiteBannerRotation=_0, - }, - white_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - white_candle => BlockBehavior::default(), { - WhiteCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - white_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - white_carpet => BlockBehavior::default(), { - }, - white_concrete => BlockBehavior::default(), { - }, - white_concrete_powder => BlockBehavior::default(), { - }, - white_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - white_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - white_stained_glass => BlockBehavior::default(), { - }, - white_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - white_terracotta => BlockBehavior::default(), { - }, - white_tulip => BlockBehavior::default(), { - }, - white_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - white_wool => BlockBehavior::default(), { - }, - wither_rose => BlockBehavior::default(), { - }, - wither_skeleton_skull => BlockBehavior::default(), { - WitherSkeletonSkullRotation=_0, - }, - wither_skeleton_wall_skull => BlockBehavior::default(), { - Facing=North, - }, - yellow_banner => BlockBehavior::default(), { - YellowBannerRotation=_0, - }, - yellow_bed => BlockBehavior::default(), { - Facing=North, - Part=Foot, - Occupied=False, - }, - yellow_candle => BlockBehavior::default(), { - YellowCandleCandles=_1, - Lit=False, - Waterlogged=False, - }, - yellow_candle_cake => BlockBehavior::default(), { - Lit=False, - }, - yellow_carpet => BlockBehavior::default(), { - }, - yellow_concrete => BlockBehavior::default(), { - }, - yellow_concrete_powder => BlockBehavior::default(), { - }, - yellow_glazed_terracotta => BlockBehavior::default(), { - Facing=North, - }, - yellow_shulker_box => BlockBehavior::default(), { - Facing=Up, - }, - yellow_stained_glass => BlockBehavior::default(), { - }, - yellow_stained_glass_pane => BlockBehavior::default(), { - North=False, - East=False, - West=False, - South=False, - Waterlogged=False, - }, - yellow_terracotta => BlockBehavior::default(), { - }, - yellow_wall_banner => BlockBehavior::default(), { - Facing=North, - }, - yellow_wool => BlockBehavior::default(), { - }, - zombie_head => BlockBehavior::default(), { - ZombieHeadRotation=_0, - }, - zombie_wall_head => BlockBehavior::default(), { - Facing=North, + brewing_stand => BlockBehavior::default(), { + HasBottle=False, + HasBottle=False, + HasBottle=False, }, } } - -// #[derive(Debug, Clone, Copy)] -// pub enum Face { -// Floor, -// Wall, -// Ceiling, -// } - -// #[derive(Debug, Clone, Copy)] -// pub enum Facing { -// North, -// South, -// West, -// East, -// } - -// #[derive(Debug, Clone, Copy)] -// pub enum Powered { -// True, -// False, -// } - -// // the underscore makes it more readable, so i think it's fine to allow it -// #[allow(non_camel_case_types)] -// pub enum BlockState { -// AcaciaButton_FloorNorthTrue, -// AcaciaButton_WallNorthTrue, -// AcaciaButton_CeilingNorthTrue, -// } - -// pub trait Block { -// fn behavior(&self) -> BlockBehavior; -// } - -// #[derive(Debug)] -// pub struct AcaciaButtonBlock { -// pub face: properties::Face, -// pub facing: properties::Facing, -// pub powered: properties::Powered, -// } - -// impl Block for AcaciaButtonBlock { -// fn behavior(&self) -> BlockBehavior { -// BlockBehavior { -// has_collision: false, -// } -// } -// } - -// pub struct AcaciaDoorBlock { -// pub facing: properties::Facing, -// // pub half: properties::Half, -// // pub hinge: properties::Hinge, -// // pub open: properties::Open, -// pub powered: properties::Powered, -// } - -// impl From for &dyn Block { -// fn from(b: BlockState) -> Self { -// match b { -// BlockState::AcaciaButton_FloorNorthTrue => &AcaciaButtonBlock { -// face: properties::Face::Floor, -// facing: properties::Facing::North, -// powered: properties::Powered::True, -// }, -// // BlockState::AcaciaButton_WallNorthTrue => todo!(), -// // BlockState::AcaciaButton_CeilingNorthTrue => todo!(), -// _ => todo!(), -// } -// } -// } -// impl From for BlockState { -// fn from(b: AcaciaButtonBlock) -> Self { -// match b { -// AcaciaButtonBlock { -// face: properties::Face::Floor, -// facing: properties::Facing::North, -// powered: properties::Powered::True, -// } => BlockState::AcaciaButton_FloorNorthTrue, -// // AcaciaButtonBlock { -// // face: properties::Face::Wall, -// // facing: properties::Facing::North, -// // powered: properties::Powered::True, -// // } => todo!(), -// // AcaciaButtonBlock { -// // face: properties::Face::Ceiling, -// // facing: properties::Facing::North, -// // powered: properties::Powered::True, -// // } => todo!(), -// _ => todo!(), -// } -// } -// } - -// #[cfg(test)] -// mod tests { -// use super::*; - -// fn test_from_state_to_block() { -// let state = BlockState::AcaciaButton_CeilingSouthFalse; -// let block_state = BlockState::from(state); -// let block: Box = block_state.into(); -// assert_eq!(block.id(), "acacia_button"); -// // downcast block to AcaciaButtonBlock -// // let acacia_button_block = block.try_into::().unwrap(); -// // assert_eq!(acacia_button_block.face, Face::Ceiling); -// // assert_eq!(acacia_button_block.facing, Facing::South); -// // assert_eq!(acacia_button_block.powered, Powered::False); -// } - -// fn test_from_state_to_block_bottom_edge() { -// let state = BlockState::AcaciaButton_FloorNorthTrue; -// let block_state = BlockState::from(state); -// let block: Box = block_state.into(); -// assert_eq!(block.id(), "acacia_button"); -// } -// } -// } \ No newline at end of file diff --git a/codegen/lib/code/blocks.py b/codegen/lib/code/blocks.py index 09f4a85f..5ed16e8e 100644 --- a/codegen/lib/code/blocks.py +++ b/codegen/lib/code/blocks.py @@ -65,14 +65,14 @@ def generate_blocks(blocks_burger: dict, blocks_report: dict, mappings: Mappings # Property codegen new_make_block_states_macro_code.append(' Properties => {') for property_struct_name, property_variants in properties.items(): - # face => Face { + # "face" => Face { # Floor, # Wall, # Ceiling, # }, property_name = property_struct_names_to_names[property_struct_name] new_make_block_states_macro_code.append( - f' {property_name} => {property_struct_name} {{') + f' "{property_name}" => {property_struct_name} {{') for variant in property_variants: new_make_block_states_macro_code.append( -- cgit v1.2.3 From 74c3ae52f84d988b8bf3f0affe143d2cd2d8143a Mon Sep 17 00:00:00 2001 From: mat Date: Thu, 16 Jun 2022 23:38:51 -0500 Subject: azalea-world uses azalea-block --- Cargo.lock | 1 + azalea-block/block-macros/src/lib.rs | 12 +++++++++++ azalea-block/src/lib.rs | 41 ++++++++++++++++++++++++++++++++++++ azalea-world/Cargo.toml | 1 + azalea-world/src/bit_storage.rs | 6 ++++++ azalea-world/src/lib.rs | 21 ++++++++++++------ 6 files changed, 76 insertions(+), 6 deletions(-) (limited to 'Cargo.lock') diff --git a/Cargo.lock b/Cargo.lock index 1ef95311..f3b5df08 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -183,6 +183,7 @@ dependencies = [ name = "azalea-world" version = "0.1.0" dependencies = [ + "azalea-block", "azalea-core", "azalea-nbt", "azalea-protocol", diff --git a/azalea-block/block-macros/src/lib.rs b/azalea-block/block-macros/src/lib.rs index d38062d4..6206bb65 100644 --- a/azalea-block/block-macros/src/lib.rs +++ b/azalea-block/block-macros/src/lib.rs @@ -461,9 +461,12 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { block_structs.extend(block_struct); } + let last_state_id = (state_id - 1) as u32; quote! { #property_enums + #[repr(u32)] + #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum BlockState { #block_state_enum_variants } @@ -479,6 +482,15 @@ pub fn make_block_states(input: TokenStream) -> TokenStream { } } } + + impl BlockState { + /// Returns the highest possible state + #[inline] + pub fn max_state() -> u32 { + #last_state_id + } + } + } .into() } diff --git a/azalea-block/src/lib.rs b/azalea-block/src/lib.rs index 01c86b11..95e8ce37 100644 --- a/azalea-block/src/lib.rs +++ b/azalea-block/src/lib.rs @@ -4,3 +4,44 @@ mod blocks; pub use behavior::BlockBehavior; pub use blocks::*; +use std::mem; + +impl BlockState { + /// Transmutes a u32 to a block state. UB if the value is not a valid block + /// state. + #[inline] + pub unsafe fn from_u32_unsafe(state_id: u32) -> Self { + mem::transmute::(state_id) + } + + #[inline] + pub fn is_valid_state(state_id: u32) -> bool { + state_id <= Self::max_state() + } +} + +impl TryFrom for BlockState { + type Error = (); + + /// Safely converts a state id to a block state. + fn try_from(state_id: u32) -> Result { + if Self::is_valid_state(state_id) { + Ok(unsafe { Self::from_u32_unsafe(state_id) }) + } else { + Err(()) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_from_u32() { + assert_eq!(BlockState::try_from(0).unwrap(), BlockState::Air); + + assert!(BlockState::try_from(BlockState::max_state()).is_ok()); + assert!(BlockState::try_from(BlockState::max_state() + 1).is_err()); + } +} diff --git a/azalea-world/Cargo.toml b/azalea-world/Cargo.toml index e8d81ac3..79e6155d 100644 --- a/azalea-world/Cargo.toml +++ b/azalea-world/Cargo.toml @@ -9,3 +9,4 @@ version = "0.1.0" azalea-core = {path = "../azalea-core"} azalea-nbt = {path = "../azalea-nbt"} azalea-protocol = {path = "../azalea-protocol"} +azalea-block = {path = "../azalea-block"} diff --git a/azalea-world/src/bit_storage.rs b/azalea-world/src/bit_storage.rs index aba52aef..c69cb216 100644 --- a/azalea-world/src/bit_storage.rs +++ b/azalea-world/src/bit_storage.rs @@ -188,6 +188,12 @@ impl BitStorage { let bit_index = (index - cell_index * self.values_per_long as usize) * self.bits; *cell = *cell & !(self.mask << bit_index) | (value & self.mask) << bit_index; } + + /// The number of entries. + #[inline] + pub fn size(&self) -> usize { + self.size + } } #[cfg(test)] diff --git a/azalea-world/src/lib.rs b/azalea-world/src/lib.rs index 766c61f0..8777c0a3 100644 --- a/azalea-world/src/lib.rs +++ b/azalea-world/src/lib.rs @@ -8,6 +8,7 @@ use azalea_core::{BlockPos, ChunkBlockPos, ChunkPos, ChunkSectionBlockPos}; use azalea_protocol::mc_buf::{McBufReadable, McBufWritable}; pub use bit_storage::BitStorage; use palette::PalettedContainer; +use azalea_block::BlockState; use std::{ io::{Read, Write}, ops::{Index, IndexMut}, @@ -57,7 +58,7 @@ impl World { self.storage.view_center = *pos; } - pub fn get_block_state(&self, pos: &BlockPos) -> Option { + pub fn get_block_state(&self, pos: &BlockPos) -> Option { self.storage.get_block_state(pos, self.min_y) } } @@ -122,7 +123,7 @@ impl ChunkStorage { && (chunk_pos.z - self.view_center.z).unsigned_abs() <= self.chunk_radius } - pub fn get_block_state(&self, pos: &BlockPos, min_y: i32) -> Option { + pub fn get_block_state(&self, pos: &BlockPos, min_y: i32) -> Option { let chunk_pos = ChunkPos::from(pos); println!("chunk_pos {:?} block_pos {:?}", chunk_pos, pos); let chunk = &self[&chunk_pos]; @@ -175,7 +176,7 @@ impl Chunk { (y.div_floor(16) - min_section_index) as u32 } - pub fn get(&self, pos: &ChunkBlockPos, min_y: i32) -> u32 { + pub fn get(&self, pos: &ChunkBlockPos, min_y: i32) -> BlockState { let section_index = self.section_index(pos.y, min_y); // TODO: make sure the section exists let section = &self.sections[section_index as usize]; @@ -210,6 +211,14 @@ impl McBufReadable for Section { // "A section has more blocks than what should be possible. This is a bug!" // ); let states = PalettedContainer::read_with_type(buf, &PalettedContainerType::BlockStates)?; + for i in 0..states.storage.size() { + if !BlockState::is_valid_state(states.storage.get(i) as u32) { + return Err(format!( + "Invalid block state {} (index {}) found in section.", + states.storage.get(i), i + )); + } + } let biomes = PalettedContainer::read_with_type(buf, &PalettedContainerType::Biomes)?; Ok(Section { block_count, @@ -229,9 +238,9 @@ impl McBufWritable for Section { } impl Section { - // TODO: return a BlockState instead of a u32 - fn get(&self, pos: ChunkSectionBlockPos) -> u32 { + fn get(&self, pos: ChunkSectionBlockPos) -> BlockState { + // TODO: use the unsafe method and do the check earlier self.states - .get(pos.x as usize, pos.y as usize, pos.z as usize) + .get(pos.x as usize, pos.y as usize, pos.z as usize).try_into().expect("Invalid block state.") } } -- cgit v1.2.3