From f79edb462c3d37b343f4be1a70b8f58a63d8dd07 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 8 Jan 2024 02:34:39 +0100 Subject: [PATCH 01/43] core/common: add better explanation to file meta version definitions --- src/core/common.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/core/common.rs b/src/core/common.rs index 39c8e54..d17056f 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -14,12 +14,21 @@ use crate::{io::fs::FileMetaVersion, resource::Biome, types::*, world::layer}; /// Increase to force regeneration of all output files /// MinedMap processed region data version number +/// +/// Increase when the generation of processed regions from region data changes +/// (usually because of updated resource data) pub const REGION_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); /// MinedMap map tile data version number +/// +/// Increase when the generation of map tiles from processed regions changes +/// (because of code changes in tile generation) pub const MAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); /// MinedMap lightmap data version number +/// +/// Increase when the generation of lightmap tiles from region data changes +/// (usually because of updated resource data) pub const LIGHTMAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); /// Coordinate pair of a generated tile From 0988ebe0951ddeee43c693099a41ab18985b57ce Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 8 Jan 2024 02:35:05 +0100 Subject: [PATCH 02/43] core/tile_mipmapper: fix file meta version for mipmap tiles The meta version should only change when the outputs must be regenerated even if the inputs stay the same. This should never be the case for mipmap tiles, so we separate the meta version from map/lightmap tiles. --- src/core/common.rs | 5 +++++ src/core/tile_mipmapper.rs | 21 +++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/core/common.rs b/src/core/common.rs index d17056f..49c8301 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -31,6 +31,11 @@ pub const MAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); /// (usually because of updated resource data) pub const LIGHTMAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); +/// MinedMap mipmap data version number +/// +/// Increase when the mipmap generation changes (this should not happen) +pub const MIPMAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); + /// Coordinate pair of a generated tile /// /// Each tile corresponds to one Minecraft region file diff --git a/src/core/tile_mipmapper.rs b/src/core/tile_mipmapper.rs index 355bd23..6ea8750 100644 --- a/src/core/tile_mipmapper.rs +++ b/src/core/tile_mipmapper.rs @@ -70,12 +70,8 @@ impl<'a> TileMipmapper<'a> { /// Tile width/height const N: u32 = (BLOCKS_PER_CHUNK * CHUNKS_PER_REGION) as u32; - let version = match kind { - TileKind::Map => REGION_FILE_META_VERSION, - TileKind::Lightmap => LIGHTMAP_FILE_META_VERSION, - }; let output_path = self.config.tile_path(kind, level, coords); - let output_timestamp = fs::read_timestamp(&output_path, version); + let output_timestamp = fs::read_timestamp(&output_path, MIPMAP_FILE_META_VERSION); let sources: Vec<_> = [(0, 0), (0, 1), (1, 0), (1, 1)] .into_iter() @@ -149,11 +145,16 @@ impl<'a> TileMipmapper<'a> { ); } - fs::create_with_timestamp(&output_path, version, input_timestamp, |file| { - image - .write_to(file, image::ImageFormat::Png) - .context("Failed to save image") - })?; + fs::create_with_timestamp( + &output_path, + MIPMAP_FILE_META_VERSION, + input_timestamp, + |file| { + image + .write_to(file, image::ImageFormat::Png) + .context("Failed to save image") + }, + )?; count_processed.send(()).unwrap(); Ok(()) From f78dd795ca87d12c8299a876cebc7ee6c8079bb9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 24 Nov 2023 19:30:45 +0100 Subject: [PATCH 03/43] world/de: add deserialization of sign block entities --- src/world/chunk.rs | 7 ++-- src/world/de.rs | 79 ++++++++++++++++++++++++++++++++++++++++++ src/world/json_text.rs | 7 ++++ src/world/mod.rs | 1 + 4 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 src/world/json_text.rs diff --git a/src/world/chunk.rs b/src/world/chunk.rs index 993a79e..cd3bf4f 100644 --- a/src/world/chunk.rs +++ b/src/world/chunk.rs @@ -60,9 +60,10 @@ impl<'a> Chunk<'a> { let data_version = data.data_version.unwrap_or_default(); match &data.chunk { - de::ChunkVariant::V1_18 { sections } => { - Self::new_v1_18(data_version, sections, block_types, biome_types) - } + de::ChunkVariant::V1_18 { + sections, + block_entities: _, + } => Self::new_v1_18(data_version, sections, block_types, biome_types), de::ChunkVariant::V0 { level } => { Self::new_v0(data_version, level, block_types, biome_types) } diff --git a/src/world/de.rs b/src/world/de.rs index cf1b6b5..7ab8ba7 100644 --- a/src/world/de.rs +++ b/src/world/de.rs @@ -2,6 +2,8 @@ use serde::Deserialize; +use super::json_text::JSONText; + /// Element of the `palette` list of 1.18+ [block states](BlockStatesV1_18) #[derive(Debug, Deserialize)] #[serde(rename_all = "PascalCase")] @@ -104,6 +106,77 @@ pub enum BiomesV0 { ByteArray(fastnbt::ByteArray), } +/// Front/back text of a Minecraft 1.20+ sign block entry +#[derive(Debug, Deserialize)] +pub struct BlockEntitySignV1_20Text { + /// Lines of sign text + pub messages: Vec, + /// Default text color + pub color: Option, +} + +/// A sign (standing or hanging) block entity +#[derive(Debug, Deserialize)] +#[serde(untagged)] +pub enum BlockEntitySign { + /// Pre-1.20 sign block entity + /// + /// Pre-1.20 signs only have front text. + #[serde(rename_all = "PascalCase")] + V0 { + /// Line 1 of the sign text + text1: JSONText, + /// Line 2 of the sign text + text2: JSONText, + /// Line 3 of the sign text + text3: JSONText, + /// Line 4 of the sign text + text4: JSONText, + /// Default text color + color: Option, + }, + /// 1.20+ sign block entity + V1_20 { + /// The sign's front text + front_text: BlockEntitySignV1_20Text, + /// The sign's back text + back_text: BlockEntitySignV1_20Text, + }, +} + +/// Data for different kinds of block entities +#[derive(Debug, Deserialize)] +#[serde(tag = "id")] +pub enum BlockEntityData { + /// Regular sign + /// + /// This includes standing signs and signs attached to the side of blocks + #[serde(rename = "minecraft:sign", alias = "minecraft:standing_sign")] + Sign(BlockEntitySign), + /// Hanging sign + #[serde(rename = "minecraft:hanging_sign")] + HangingSign(BlockEntitySign), + /// Other block entity types not handled by MinedMap + #[serde(other)] + Other, +} + +/// A block entity +/// +/// Block entities were called tile entities pre-1.18 +#[derive(Debug, Deserialize)] +pub struct BlockEntity { + /// Entity global X coordinate + pub x: i32, + /// Entity global Y coordinate + pub y: i32, + /// Entity global Z coordinate + pub z: i32, + /// Kind-specific entity data + #[serde(flatten)] + pub data: BlockEntityData, +} + /// `Level` compound element found in pre-1.18 [chunks](Chunk) #[derive(Debug, Deserialize)] #[serde(rename_all = "PascalCase")] @@ -113,6 +186,9 @@ pub struct LevelV0 { pub sections: Vec, /// Biome data pub biomes: Option, + /// List of block entities + #[serde(default)] + pub tile_entities: Vec, } /// Version-specific part of a [Chunk] compound @@ -123,6 +199,9 @@ pub enum ChunkVariant { V1_18 { /// List of chunk sections sections: Vec, + /// List of block entities + #[serde(default)] + block_entities: Vec, }, /// Pre-1.18 chunk data #[serde(rename_all = "PascalCase")] diff --git a/src/world/json_text.rs b/src/world/json_text.rs new file mode 100644 index 0000000..561725f --- /dev/null +++ b/src/world/json_text.rs @@ -0,0 +1,7 @@ +//! Newtype and helper methods for handling Minecraft Raw JSON Text + +use serde::Deserialize; + +/// Minecraft Raw JSON Text +#[derive(Debug, Deserialize)] +pub struct JSONText(String); diff --git a/src/world/mod.rs b/src/world/mod.rs index 57aa7ed..e3c52ba 100644 --- a/src/world/mod.rs +++ b/src/world/mod.rs @@ -2,5 +2,6 @@ pub mod chunk; pub mod de; +pub mod json_text; pub mod layer; pub mod section; From 61d456846aee3beaad5a77fb0f9fbf5da351eeab Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 25 Nov 2023 12:08:52 +0100 Subject: [PATCH 04/43] world: implement decoding raw JSON text into a linear list of formatted strings --- src/world/json_text.rs | 150 ++++++++++++++++++++++++++++++++++++++++- src/world/mod.rs | 1 + src/world/sign.rs | 88 ++++++++++++++++++++++++ 3 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 src/world/sign.rs diff --git a/src/world/json_text.rs b/src/world/json_text.rs index 561725f..8e53ead 100644 --- a/src/world/json_text.rs +++ b/src/world/json_text.rs @@ -1,7 +1,155 @@ //! Newtype and helper methods for handling Minecraft Raw JSON Text +use std::{collections::VecDeque, sync::Arc}; + use serde::Deserialize; +/// A span of formatted text +/// +/// A [JSONText] consists of a tree of [FormattedText] nodes (canonically +/// represented as a [FormattedTextTree], but other kinds are possible with +/// is handled by [DeserializedText]. +/// +/// Formatting that is not set in a node is inherited from the parent. +#[derive(Debug, Deserialize, Default)] +pub struct FormattedText { + #[serde(default)] + /// Text content + pub text: String, + /// Text color + pub color: Option>, + /// Bold formatting + pub bold: Option, + /// Italic formatting + pub italic: Option, + /// Underlines formatting + pub underlined: Option, + /// Strikethrough formatting + pub strikethrough: Option, + /// Obfuscated formatting + pub obfuscated: Option, +} + +impl FormattedText { + /// Fills in unset formatting fields from a parent node + pub fn inherit(self, parent: &Self) -> Self { + FormattedText { + text: self.text, + color: self.color.or_else(|| parent.color.clone()), + bold: self.bold.or(parent.bold), + italic: self.italic.or(parent.italic), + underlined: self.underlined.or(parent.underlined), + strikethrough: self.strikethrough.or(parent.strikethrough), + obfuscated: self.obfuscated.or(parent.obfuscated), + } + } +} + +/// A tree of [FormattedText] nodes +/// +/// Each node including the root has a `text` and a list of children (`extra`). +#[derive(Debug, Deserialize, Default)] +pub struct FormattedTextTree { + /// Root node content + #[serde(flatten)] + text: FormattedText, + /// List of child trees + #[serde(default)] + extra: VecDeque, +} + +impl From for FormattedTextTree { + fn from(value: String) -> Self { + FormattedTextTree { + text: FormattedText { + text: value, + ..Default::default() + }, + extra: VecDeque::new(), + } + } +} + +/// List of [FormattedText] +#[derive(Debug)] +pub struct FormattedTextList(pub Vec); + +impl FormattedTextList { + /// Returns `true` when [FormattedTextList] does not contain any text + pub fn is_empty(&self) -> bool { + self.0.iter().all(|text| text.text.is_empty()) + } +} + +/// Raw deserialized [JSONText] +/// +/// A [JSONText] can contain various different JSON types. +#[derive(Debug, Deserialize)] +#[serde(untagged)] +pub enum DeserializedText { + /// Unformatted string + String(String), + /// Unformatted number (will be converted to a string) + Number(f32), + /// Unformatted boolean (will be converted to a string) + Boolean(bool), + /// List of [DeserializedText] + /// + /// The tail elements are appended as children of the head element. + List(VecDeque), + /// The canonical [FormattedTextTree] structure + Object(FormattedTextTree), +} + +impl DeserializedText { + /// Converts a [DeserializedText] into the regular [FormattedTextTree] format + /// + /// Most variants are simply converted to strings. A list is handled by + /// appending all tail elements to the `extra` field of the head. + pub fn canonicalize(self) -> FormattedTextTree { + match self { + DeserializedText::Object(obj) => obj, + DeserializedText::String(s) => FormattedTextTree::from(s), + DeserializedText::Number(n) => FormattedTextTree::from(n.to_string()), + DeserializedText::Boolean(b) => FormattedTextTree::from(b.to_string()), + DeserializedText::List(mut list) => { + let mut obj = list + .pop_front() + .map(|t| t.canonicalize()) + .unwrap_or_default(); + obj.extra.append(&mut list); + obj + } + } + } + + /// Converts the tree of [FormattedText] nodes into a linear list by + /// copying formatting flags into each node. + pub fn linearize(self, parent: &FormattedText) -> FormattedTextList { + let obj = self.canonicalize(); + let mut ret = vec![obj.text.inherit(parent)]; + + for extra in obj.extra { + ret.append(&mut extra.linearize(&ret[0]).0); + } + + FormattedTextList(ret) + } +} + +impl Default for DeserializedText { + fn default() -> Self { + DeserializedText::Object(FormattedTextTree::from(String::new())) + } +} + /// Minecraft Raw JSON Text #[derive(Debug, Deserialize)] -pub struct JSONText(String); +pub struct JSONText(pub String); + +impl JSONText { + /// Deserializes a [JSONText] into a [DeserializedText] + pub fn deserialize(&self) -> DeserializedText { + serde_json::from_str(&self.0).unwrap_or_default() + } +} diff --git a/src/world/mod.rs b/src/world/mod.rs index e3c52ba..38d5174 100644 --- a/src/world/mod.rs +++ b/src/world/mod.rs @@ -5,3 +5,4 @@ pub mod de; pub mod json_text; pub mod layer; pub mod section; +pub mod sign; diff --git a/src/world/sign.rs b/src/world/sign.rs new file mode 100644 index 0000000..c13eebe --- /dev/null +++ b/src/world/sign.rs @@ -0,0 +1,88 @@ +//! Processing of sign text + +use std::sync::Arc; + +use super::{ + de, + json_text::{FormattedText, FormattedTextList, JSONText}, +}; + +/// Version-independent reference to (front or back) sign text +#[derive(Debug, Default)] +pub struct RawSignText<'a> { + /// Lines of sign text + /// + /// A regular sign always has 4 lines of text. The back of pre-1.20 + /// signs is represented as a [SignText] without any `messages`. + pub messages: Vec<&'a JSONText>, + /// Sign color + /// + /// Defaults to "black". + pub color: Option<&'a str>, +} + +impl<'a> RawSignText<'a> { + /// Decodes the [RawSignText] into a [SignText] + pub fn decode(&self) -> SignText { + let color = self.color.map(|c| Arc::new(c.to_owned())); + let parent = FormattedText { + color, + ..Default::default() + }; + SignText( + self.messages + .iter() + .map(|message| message.deserialize().linearize(&parent)) + .collect(), + ) + } +} + +impl<'a> From<&'a de::BlockEntitySignV1_20Text> for RawSignText<'a> { + fn from(value: &'a de::BlockEntitySignV1_20Text) -> Self { + RawSignText { + messages: value.messages.iter().collect(), + color: value.color.as_deref(), + } + } +} + +/// Helper methods for [de::BlockEntitySign] +pub trait BlockEntitySignExt { + /// Returns the front and back text of a sign in a version-indepentent format + fn text(&self) -> (RawSignText, RawSignText); +} + +impl BlockEntitySignExt for de::BlockEntitySign { + fn text(&self) -> (RawSignText, RawSignText) { + match self { + de::BlockEntitySign::V0 { + text1, + text2, + text3, + text4, + color, + } => ( + RawSignText { + messages: vec![text1, text2, text3, text4], + color: color.as_deref(), + }, + Default::default(), + ), + de::BlockEntitySign::V1_20 { + front_text, + back_text, + } => (front_text.into(), back_text.into()), + } + } +} + +/// Deserialized and linearized sign text +pub struct SignText(pub Vec); + +impl SignText { + /// Checks if all lines of the sign text are empty + pub fn is_empty(&self) -> bool { + self.0.iter().all(|line| line.is_empty()) + } +} From 638d5046c989f4937c27e1d648b06be328f49242 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 25 Nov 2023 19:07:49 +0100 Subject: [PATCH 05/43] world/chunk: change Chunk into a struct The version-specific part is extracted as an enum ChunkInner. --- src/world/chunk.rs | 63 ++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/src/world/chunk.rs b/src/world/chunk.rs index cd3bf4f..e3ba58a 100644 --- a/src/world/chunk.rs +++ b/src/world/chunk.rs @@ -16,10 +16,9 @@ use crate::{ types::*, }; -/// Chunk data structure wrapping a [de::Chunk] for convenient access to -/// block and biome data +/// Version-specific part of [Chunk] #[derive(Debug)] -pub enum Chunk<'a> { +pub enum ChunkInner<'a> { /// Minecraft v1.18+ chunk with biome data moved into sections V1_18 { /// Section data @@ -50,6 +49,14 @@ pub enum Chunk<'a> { Empty, } +/// Chunk data structure wrapping a [de::Chunk] for convenient access to +/// block and biome data +#[derive(Debug)] +pub struct Chunk<'a> { + /// Version-specific data + inner: ChunkInner<'a>, +} + impl<'a> Chunk<'a> { /// Creates a new [Chunk] from a deserialized [de::Chunk] pub fn new( @@ -59,15 +66,17 @@ impl<'a> Chunk<'a> { ) -> Result<(Self, bool)> { let data_version = data.data_version.unwrap_or_default(); - match &data.chunk { + let (inner, has_unknown) = match &data.chunk { de::ChunkVariant::V1_18 { sections, block_entities: _, - } => Self::new_v1_18(data_version, sections, block_types, biome_types), + } => Self::new_v1_18(data_version, sections, block_types, biome_types)?, de::ChunkVariant::V0 { level } => { - Self::new_v0(data_version, level, block_types, biome_types) + Self::new_v0(data_version, level, block_types, biome_types)? } - } + }; + + Ok((Chunk { inner }, has_unknown)) } /// [Chunk::new] implementation for Minecraft v1.18+ chunks @@ -76,7 +85,7 @@ impl<'a> Chunk<'a> { sections: &'a Vec, block_types: &'a BlockTypes, biome_types: &'a BiomeTypes, - ) -> Result<(Self, bool)> { + ) -> Result<(ChunkInner<'a>, bool)> { let mut section_map = BTreeMap::new(); let mut has_unknown = false; @@ -118,7 +127,7 @@ impl<'a> Chunk<'a> { }; } - let chunk = Chunk::V1_18 { section_map }; + let chunk = ChunkInner::V1_18 { section_map }; Ok((chunk, has_unknown)) } @@ -128,7 +137,7 @@ impl<'a> Chunk<'a> { level: &'a de::LevelV0, block_types: &'a BlockTypes, biome_types: &'a BiomeTypes, - ) -> Result<(Self, bool)> { + ) -> Result<(ChunkInner<'a>, bool)> { let mut section_map_v1_13 = BTreeMap::new(); let mut section_map_v0 = BTreeMap::new(); let mut has_unknown = false; @@ -168,12 +177,12 @@ impl<'a> Chunk<'a> { let biomes = BiomesV0::new(level.biomes.as_ref(), biome_types); let chunk = match (section_map_v1_13.is_empty(), section_map_v0.is_empty()) { - (true, true) => Chunk::Empty, - (false, true) => Chunk::V1_13 { + (true, true) => ChunkInner::Empty, + (false, true) => ChunkInner::V1_13 { section_map: section_map_v1_13, biomes: biomes?, }, - (true, false) => Chunk::V0 { + (true, false) => ChunkInner::V0 { section_map: section_map_v0, biomes: biomes?, }, @@ -187,11 +196,11 @@ impl<'a> Chunk<'a> { /// Returns true if the chunk does not contain any sections pub fn is_empty(&self) -> bool { - match self { - Chunk::V1_18 { section_map } => section_map.is_empty(), - Chunk::V1_13 { section_map, .. } => section_map.is_empty(), - Chunk::V0 { section_map, .. } => section_map.is_empty(), - Chunk::Empty => true, + match &self.inner { + ChunkInner::V1_18 { section_map } => section_map.is_empty(), + ChunkInner::V1_13 { section_map, .. } => section_map.is_empty(), + ChunkInner::V0 { section_map, .. } => section_map.is_empty(), + ChunkInner::Empty => true, } } @@ -199,25 +208,25 @@ impl<'a> Chunk<'a> { pub fn sections(&self) -> SectionIter { use SectionIterInner::*; SectionIter { - inner: match self { - Chunk::V1_18 { section_map } => V1_18 { + inner: match &self.inner { + ChunkInner::V1_18 { section_map } => V1_18 { iter: section_map.iter(), }, - Chunk::V1_13 { + ChunkInner::V1_13 { section_map, biomes, } => V1_13 { iter: section_map.iter(), biomes, }, - Chunk::V0 { + ChunkInner::V0 { section_map, biomes, } => V0 { iter: section_map.iter(), biomes, }, - Chunk::Empty => Empty, + ChunkInner::Empty => Empty, }, } } @@ -253,26 +262,26 @@ impl<'a, T> SectionIterTrait<'a> for T where /// Inner data structure of [SectionIter] #[derive(Debug, Clone)] enum SectionIterInner<'a> { - /// Iterator over sections of [Chunk::V1_18] + /// Iterator over sections of [ChunkInner::V1_18] V1_18 { /// Inner iterator into section map iter: btree_map::Iter<'a, SectionY, (SectionV1_13<'a>, BiomesV1_18<'a>, BlockLight<'a>)>, }, - /// Iterator over sections of [Chunk::V1_13] + /// Iterator over sections of [ChunkInner::V1_13] V1_13 { /// Inner iterator into section map iter: btree_map::Iter<'a, SectionY, (SectionV1_13<'a>, BlockLight<'a>)>, /// Chunk biome data biomes: &'a BiomesV0<'a>, }, - /// Iterator over sections of [Chunk::V0] + /// Iterator over sections of [ChunkInner::V0] V0 { /// Inner iterator into section map iter: btree_map::Iter<'a, SectionY, (SectionV0<'a>, BlockLight<'a>)>, /// Chunk biome data biomes: &'a BiomesV0<'a>, }, - /// Empty iterator over an unpopulated chunk ([Chunk::Empty]) + /// Empty iterator over an unpopulated chunk ([ChunkInner::Empty]) Empty, } From f0e0db63d39fb5731483d6c5a93af950de4433e4 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 25 Nov 2023 20:34:50 +0100 Subject: [PATCH 06/43] world: process sign data, prepare for serialization --- src/world/block_entity.rs | 89 +++++++++++++++++++++++++++++++++++++++ src/world/chunk.rs | 36 ++++++++++++---- src/world/json_text.rs | 12 ++++-- src/world/mod.rs | 1 + src/world/sign.rs | 3 ++ 5 files changed, 130 insertions(+), 11 deletions(-) create mode 100644 src/world/block_entity.rs diff --git a/src/world/block_entity.rs b/src/world/block_entity.rs new file mode 100644 index 0000000..65d95e4 --- /dev/null +++ b/src/world/block_entity.rs @@ -0,0 +1,89 @@ +//! Processing of block entity data + +use serde::{Deserialize, Serialize}; + +use super::{ + de, + sign::{BlockEntitySignExt, SignText}, +}; + +/// Kind of sign block +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum SignKind { + /// Standing or attached sign + Sign, + /// Hanging sign + HangingSign, +} + +/// Processed sign data +#[derive(Debug, Serialize, Deserialize)] +pub struct Sign { + /// The kind of the sign + pub kind: SignKind, + /// The sign's front text + #[serde(skip_serializing_if = "SignText::is_empty", default)] + pub front_text: SignText, + /// The sign's back text + #[serde(skip_serializing_if = "SignText::is_empty", default)] + pub back_text: SignText, +} + +impl Sign { + /// Processes a [de::BlockEntitySign] into a [Sign] + fn new(sign: &de::BlockEntitySign, kind: SignKind) -> Sign { + let (front_text, back_text) = sign.text(); + let front_text = front_text.decode(); + let back_text = back_text.decode(); + Sign { + kind, + front_text, + back_text, + } + } +} + +/// Data for different kinds of [BlockEntity] +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "snake_case")] +pub enum BlockEntityData { + /// A sign block + Sign(Sign), +} + +/// A processed block entity +#[derive(Debug, Serialize, Deserialize)] +pub struct BlockEntity { + /// Global X coordinate + pub x: i32, + /// Global Y coordinate + pub y: i32, + /// Global Z coordinate + pub z: i32, + /// Entity data + #[serde(flatten)] + pub data: BlockEntityData, +} + +impl BlockEntity { + /// Processes a [de::BlockEntity] into a [BlockEntity] + pub fn new(entity: &de::BlockEntity) -> Option { + let data = match &entity.data { + de::BlockEntityData::Sign(sign) => { + BlockEntityData::Sign(Sign::new(sign, SignKind::Sign)) + } + de::BlockEntityData::HangingSign(sign) => { + BlockEntityData::Sign(Sign::new(sign, SignKind::HangingSign)) + } + de::BlockEntityData::Other => return None, + }; + + Some(BlockEntity { + x: entity.x, + y: entity.y, + z: entity.z, + data, + }) + } +} diff --git a/src/world/chunk.rs b/src/world/chunk.rs index e3ba58a..5a8937e 100644 --- a/src/world/chunk.rs +++ b/src/world/chunk.rs @@ -10,7 +10,7 @@ use std::{ use anyhow::{bail, Context, Result}; -use super::{de, section::*}; +use super::{block_entity::BlockEntity, de, section::*}; use crate::{ resource::{BiomeTypes, BlockTypes}, types::*, @@ -55,6 +55,8 @@ pub enum ChunkInner<'a> { pub struct Chunk<'a> { /// Version-specific data inner: ChunkInner<'a>, + /// Unprocessed block entities + block_entities: &'a Vec, } impl<'a> Chunk<'a> { @@ -66,17 +68,27 @@ impl<'a> Chunk<'a> { ) -> Result<(Self, bool)> { let data_version = data.data_version.unwrap_or_default(); - let (inner, has_unknown) = match &data.chunk { + let ((inner, has_unknown), block_entities) = match &data.chunk { de::ChunkVariant::V1_18 { sections, - block_entities: _, - } => Self::new_v1_18(data_version, sections, block_types, biome_types)?, - de::ChunkVariant::V0 { level } => { - Self::new_v0(data_version, level, block_types, biome_types)? - } + block_entities, + } => ( + Self::new_v1_18(data_version, sections, block_types, biome_types)?, + block_entities, + ), + de::ChunkVariant::V0 { level } => ( + Self::new_v0(data_version, level, block_types, biome_types)?, + &level.tile_entities, + ), }; - Ok((Chunk { inner }, has_unknown)) + Ok(( + Chunk { + inner, + block_entities, + }, + has_unknown, + )) } /// [Chunk::new] implementation for Minecraft v1.18+ chunks @@ -230,6 +242,14 @@ impl<'a> Chunk<'a> { }, } } + + /// Processes all of the chunk's block entities + pub fn block_entities(&self) -> Vec { + self.block_entities + .iter() + .filter_map(BlockEntity::new) + .collect() + } } /// Reference to block, biome and block light data of a section diff --git a/src/world/json_text.rs b/src/world/json_text.rs index 8e53ead..a9c1f13 100644 --- a/src/world/json_text.rs +++ b/src/world/json_text.rs @@ -2,7 +2,7 @@ use std::{collections::VecDeque, sync::Arc}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; /// A span of formatted text /// @@ -11,22 +11,28 @@ use serde::Deserialize; /// is handled by [DeserializedText]. /// /// Formatting that is not set in a node is inherited from the parent. -#[derive(Debug, Deserialize, Default)] +#[derive(Debug, Serialize, Deserialize, Default)] pub struct FormattedText { #[serde(default)] /// Text content pub text: String, /// Text color + #[serde(skip_serializing_if = "Option::is_none")] pub color: Option>, /// Bold formatting + #[serde(skip_serializing_if = "Option::is_none")] pub bold: Option, /// Italic formatting + #[serde(skip_serializing_if = "Option::is_none")] pub italic: Option, /// Underlines formatting + #[serde(skip_serializing_if = "Option::is_none")] pub underlined: Option, /// Strikethrough formatting + #[serde(skip_serializing_if = "Option::is_none")] pub strikethrough: Option, /// Obfuscated formatting + #[serde(skip_serializing_if = "Option::is_none")] pub obfuscated: Option, } @@ -71,7 +77,7 @@ impl From for FormattedTextTree { } /// List of [FormattedText] -#[derive(Debug)] +#[derive(Debug, Serialize, Deserialize)] pub struct FormattedTextList(pub Vec); impl FormattedTextList { diff --git a/src/world/mod.rs b/src/world/mod.rs index 38d5174..6426c92 100644 --- a/src/world/mod.rs +++ b/src/world/mod.rs @@ -1,5 +1,6 @@ //! Data structures describing Minecraft save data +pub mod block_entity; pub mod chunk; pub mod de; pub mod json_text; diff --git a/src/world/sign.rs b/src/world/sign.rs index c13eebe..e53be87 100644 --- a/src/world/sign.rs +++ b/src/world/sign.rs @@ -2,6 +2,8 @@ use std::sync::Arc; +use serde::{Deserialize, Serialize}; + use super::{ de, json_text::{FormattedText, FormattedTextList, JSONText}, @@ -77,6 +79,7 @@ impl BlockEntitySignExt for de::BlockEntitySign { } } +#[derive(Debug, Default, Serialize, Deserialize)] /// Deserialized and linearized sign text pub struct SignText(pub Vec); From 5d40d061a40daa8d799552915652744b988a6316 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 12:47:31 +0100 Subject: [PATCH 07/43] io/storage: split out inner part of read/write Allow reusing the read/write logic without requiring control over the file open. --- src/core/region_processor.rs | 2 +- src/core/tile_renderer.rs | 2 +- src/io/storage.rs | 51 ++++++++++++++++++++---------------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/core/region_processor.rs b/src/core/region_processor.rs index 0a8ad0e..04699d3 100644 --- a/src/core/region_processor.rs +++ b/src/core/region_processor.rs @@ -145,7 +145,7 @@ impl<'a> SingleRegionProcessor<'a> { return Ok(()); } - storage::write( + storage::write_file( &self.output_path, &self.processed_region, REGION_FILE_META_VERSION, diff --git a/src/core/tile_renderer.rs b/src/core/tile_renderer.rs index b341076..ce9fed3 100644 --- a/src/core/tile_renderer.rs +++ b/src/core/tile_renderer.rs @@ -105,7 +105,7 @@ impl<'a> TileRenderer<'a> { region_loader .get_or_try_init(|| async { - storage::read(&processed_path).context("Failed to load processed region data") + storage::read_file(&processed_path).context("Failed to load processed region data") }) .await .cloned() diff --git a/src/io/storage.rs b/src/io/storage.rs index 99a8d63..634f082 100644 --- a/src/io/storage.rs +++ b/src/io/storage.rs @@ -14,43 +14,50 @@ use serde::{de::DeserializeOwned, Serialize}; use super::fs; +/// Serializes data and writes it to a writer +pub fn write(writer: &mut W, value: &T) -> Result<()> { + let data = bincode::serialize(value)?; + let len = u32::try_from(data.len())?; + let compressed = zstd::bulk::compress(&data, 1)?; + drop(data); + + writer.write_all(&len.to_be_bytes())?; + writer.write_all(&compressed)?; + + Ok(()) +} + /// Serializes data and stores it in a file /// /// A timestamp is stored in an assiciated metadata file. -pub fn write( +pub fn write_file( path: &Path, value: &T, version: fs::FileMetaVersion, timestamp: SystemTime, ) -> Result<()> { - fs::create_with_timestamp(path, version, timestamp, |file| { - let data = bincode::serialize(value)?; - let len = u32::try_from(data.len())?; - let compressed = zstd::bulk::compress(&data, 1)?; - drop(data); + fs::create_with_timestamp(path, version, timestamp, |file| write(file, value)) +} - file.write_all(&len.to_be_bytes())?; - file.write_all(&compressed)?; +/// Reads data from a reader and deserializes it +pub fn read(reader: &mut R) -> Result { + let mut len_buf = [0u8; 4]; + reader.read_exact(&mut len_buf)?; + let len = usize::try_from(u32::from_be_bytes(len_buf))?; - Ok(()) - }) + let mut compressed = vec![]; + reader.read_to_end(&mut compressed)?; + let data = zstd::bulk::decompress(&compressed, len)?; + drop(compressed); + + Ok(bincode::deserialize(&data)?) } /// Reads data from a file and deserializes it -pub fn read(path: &Path) -> Result { +pub fn read_file(path: &Path) -> Result { (|| -> Result { let mut file = File::open(path)?; - - let mut len_buf = [0u8; 4]; - file.read_exact(&mut len_buf)?; - let len = usize::try_from(u32::from_be_bytes(len_buf))?; - - let mut compressed = vec![]; - file.read_to_end(&mut compressed)?; - let data = zstd::bulk::decompress(&compressed, len)?; - drop(compressed); - - Ok(bincode::deserialize(&data)?) + read(&mut file) })() .with_context(|| format!("Failed to read file {}", path.display())) } From c44f6ab859bfcc8d10592097d4188db11a9a53a4 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 14:12:51 +0100 Subject: [PATCH 08/43] io/storage: add JSON support Bincode can't deal with a number of serde's features that would be desirable if we're using the same Serialize impls for generating JSON data for the viewer. --- src/core/region_processor.rs | 1 + src/core/tile_renderer.rs | 3 ++- src/io/storage.rs | 34 +++++++++++++++++++++++++++------- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/core/region_processor.rs b/src/core/region_processor.rs index 04699d3..52cb165 100644 --- a/src/core/region_processor.rs +++ b/src/core/region_processor.rs @@ -148,6 +148,7 @@ impl<'a> SingleRegionProcessor<'a> { storage::write_file( &self.output_path, &self.processed_region, + storage::Format::Bincode, REGION_FILE_META_VERSION, self.input_timestamp, ) diff --git a/src/core/tile_renderer.rs b/src/core/tile_renderer.rs index ce9fed3..09ad8a1 100644 --- a/src/core/tile_renderer.rs +++ b/src/core/tile_renderer.rs @@ -105,7 +105,8 @@ impl<'a> TileRenderer<'a> { region_loader .get_or_try_init(|| async { - storage::read_file(&processed_path).context("Failed to load processed region data") + storage::read_file(&processed_path, storage::Format::Bincode) + .context("Failed to load processed region data") }) .await .cloned() diff --git a/src/io/storage.rs b/src/io/storage.rs index 634f082..9296166 100644 --- a/src/io/storage.rs +++ b/src/io/storage.rs @@ -14,9 +14,24 @@ use serde::{de::DeserializeOwned, Serialize}; use super::fs; +/// Storage format +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum Format { + /// Encode as Bincode + /// + /// Bincode is more efficient than JSON, but cannot handle many of + /// serde's features like flatten, conditional skipping, ... + Bincode, + /// Encode as JSON + Json, +} + /// Serializes data and writes it to a writer -pub fn write(writer: &mut W, value: &T) -> Result<()> { - let data = bincode::serialize(value)?; +pub fn write(writer: &mut W, value: &T, format: Format) -> Result<()> { + let data = match format { + Format::Bincode => bincode::serialize(value)?, + Format::Json => serde_json::to_vec(value)?, + }; let len = u32::try_from(data.len())?; let compressed = zstd::bulk::compress(&data, 1)?; drop(data); @@ -33,14 +48,15 @@ pub fn write(writer: &mut W, value: &T) -> Result<()> { pub fn write_file( path: &Path, value: &T, + format: Format, version: fs::FileMetaVersion, timestamp: SystemTime, ) -> Result<()> { - fs::create_with_timestamp(path, version, timestamp, |file| write(file, value)) + fs::create_with_timestamp(path, version, timestamp, |file| write(file, value, format)) } /// Reads data from a reader and deserializes it -pub fn read(reader: &mut R) -> Result { +pub fn read(reader: &mut R, format: Format) -> Result { let mut len_buf = [0u8; 4]; reader.read_exact(&mut len_buf)?; let len = usize::try_from(u32::from_be_bytes(len_buf))?; @@ -50,14 +66,18 @@ pub fn read(reader: &mut R) -> Result { let data = zstd::bulk::decompress(&compressed, len)?; drop(compressed); - Ok(bincode::deserialize(&data)?) + let value = match format { + Format::Bincode => bincode::deserialize(&data)?, + Format::Json => serde_json::from_slice(&data)?, + }; + Ok(value) } /// Reads data from a file and deserializes it -pub fn read_file(path: &Path) -> Result { +pub fn read_file(path: &Path, format: Format) -> Result { (|| -> Result { let mut file = File::open(path)?; - read(&mut file) + read(&mut file, format) })() .with_context(|| format!("Failed to read file {}", path.display())) } From 7297c03567e7990520ce9acffe9cb19b517b6ab0 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 25 Nov 2023 21:46:55 +0100 Subject: [PATCH 09/43] core/region_processor: store processed block entities for each region --- src/core/common.rs | 39 ++++++++++++++++- src/core/region_processor.rs | 82 ++++++++++++++++++++++++++++-------- 2 files changed, 101 insertions(+), 20 deletions(-) diff --git a/src/core/common.rs b/src/core/common.rs index 49c8301..cd8fd8f 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -9,7 +9,12 @@ use std::{ use indexmap::IndexSet; use serde::{Deserialize, Serialize}; -use crate::{io::fs::FileMetaVersion, resource::Biome, types::*, world::layer}; +use crate::{ + io::fs::FileMetaVersion, + resource::Biome, + types::*, + world::{block_entity::BlockEntity, layer}, +}; /// Increase to force regeneration of all output files @@ -36,6 +41,11 @@ pub const LIGHTMAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); /// Increase when the mipmap generation changes (this should not happen) pub const MIPMAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); +/// MinedMap processed entity data version number +/// +/// Increase when entity collection changes bacause of code changes. +pub const ENTITIES_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); + /// Coordinate pair of a generated tile /// /// Each tile corresponds to one Minecraft region file @@ -94,6 +104,13 @@ pub struct ProcessedRegion { pub chunks: ChunkArray>>, } +/// Data structure for storing entity data between processing and collection steps +#[derive(Debug, Default, Serialize, Deserialize)] +pub struct ProcessedEntities { + /// List of block entities + pub block_entities: Vec, +} + /// Derives a filename from region coordinates and a file extension /// /// Can be used for input regions, processed data or rendered tiles @@ -122,6 +139,8 @@ pub struct Config { pub output_dir: PathBuf, /// Path for storage of intermediate processed data files pub processed_dir: PathBuf, + /// Path for storage of processed entity data files + pub entities_dir: PathBuf, /// Path of viewer metadata file pub metadata_path: PathBuf, } @@ -137,7 +156,8 @@ impl Config { let region_dir = [&args.input_dir, Path::new("region")].iter().collect(); let level_dat_path = [&args.input_dir, Path::new("level.dat")].iter().collect(); - let processed_dir = [&args.output_dir, Path::new("processed")].iter().collect(); + let processed_dir: PathBuf = [&args.output_dir, Path::new("processed")].iter().collect(); + let entities_dir = [&processed_dir, Path::new("entities")].iter().collect(); let metadata_path = [&args.output_dir, Path::new("info.json")].iter().collect(); Config { @@ -146,6 +166,7 @@ impl Config { level_dat_path, output_dir: args.output_dir.clone(), processed_dir, + entities_dir, metadata_path, } } @@ -162,6 +183,20 @@ impl Config { [&self.processed_dir, Path::new(&filename)].iter().collect() } + /// Constructs the base output path for processed entity data + pub fn entities_dir(&self, level: usize) -> PathBuf { + [&self.entities_dir, Path::new(&level.to_string())] + .iter() + .collect() + } + + /// Constructs the path of a processed entity data file + pub fn entities_path(&self, level: usize, coords: TileCoords) -> PathBuf { + let filename = coord_filename(coords, "bin"); + let dir = self.entities_dir(level); + [Path::new(&dir), Path::new(&filename)].iter().collect() + } + /// Constructs the base output path for a [TileKind] and mipmap level pub fn tile_dir(&self, kind: TileKind, level: usize) -> PathBuf { let prefix = match kind { diff --git a/src/core/region_processor.rs b/src/core/region_processor.rs index 52cb165..f1f8441 100644 --- a/src/core/region_processor.rs +++ b/src/core/region_processor.rs @@ -64,20 +64,28 @@ struct SingleRegionProcessor<'a> { output_path: PathBuf, /// Lightmap output filename lightmap_path: PathBuf, + /// Processed entity output filename + entities_path: PathBuf, /// Timestamp of last modification of input file input_timestamp: SystemTime, /// Timestamp of last modification of processed region output file (if valid) output_timestamp: Option, /// Timestamp of last modification of lightmap output file (if valid) lightmap_timestamp: Option, + /// Timestamp of last modification of entity list output file (if valid) + entities_timestamp: Option, /// True if processed region output file needs to be updated output_needed: bool, /// True if lightmap output file needs to be updated lightmap_needed: bool, + /// True if entity output file needs to be updated + entities_needed: bool, /// Processed region intermediate data processed_region: ProcessedRegion, /// Lightmap intermediate data lightmap: image::GrayAlphaImage, + /// Processed entity intermediate data + entities: ProcessedEntities, /// True if any unknown block or biome types were encountered during processing has_unknown: bool, } @@ -93,14 +101,20 @@ impl<'a> SingleRegionProcessor<'a> { let output_path = processor.config.processed_path(coords); let output_timestamp = fs::read_timestamp(&output_path, REGION_FILE_META_VERSION); + let lightmap_path = processor.config.tile_path(TileKind::Lightmap, 0, coords); let lightmap_timestamp = fs::read_timestamp(&lightmap_path, LIGHTMAP_FILE_META_VERSION); + let entities_path = processor.config.entities_path(0, coords); + let entities_timestamp = fs::read_timestamp(&entities_path, ENTITIES_FILE_META_VERSION); + let output_needed = Some(input_timestamp) > output_timestamp; let lightmap_needed = Some(input_timestamp) > lightmap_timestamp; + let entities_needed = Some(input_timestamp) > entities_timestamp; let processed_region = ProcessedRegion::default(); let lightmap = image::GrayAlphaImage::new(N, N); + let entities = ProcessedEntities::default(); Ok(SingleRegionProcessor { block_types: &processor.block_types, @@ -109,13 +123,17 @@ impl<'a> SingleRegionProcessor<'a> { input_path, output_path, lightmap_path, + entities_path, input_timestamp, output_timestamp, lightmap_timestamp, + entities_timestamp, output_needed, lightmap_needed, + entities_needed, processed_region, lightmap, + entities, has_unknown: false, }) } @@ -174,34 +192,57 @@ impl<'a> SingleRegionProcessor<'a> { ) } + /// Saves processed entity data + /// + /// The timestamp is the time of the last modification of the input region data. + fn save_entities(&self) -> Result<()> { + if !self.entities_needed { + return Ok(()); + } + + storage::write_file( + &self.entities_path, + &self.entities, + storage::Format::Json, + ENTITIES_FILE_META_VERSION, + self.input_timestamp, + ) + } + /// Processes a single chunk fn process_chunk(&mut self, chunk_coords: ChunkCoords, data: world::de::Chunk) -> Result<()> { let (chunk, has_unknown) = world::chunk::Chunk::new(&data, self.block_types, self.biome_types) .with_context(|| format!("Failed to decode chunk {:?}", chunk_coords))?; self.has_unknown |= has_unknown; - let Some(layer::LayerData { - blocks, - biomes, - block_light, - depths, - }) = world::layer::top_layer(&mut self.processed_region.biome_list, &chunk) - .with_context(|| format!("Failed to process chunk {:?}", chunk_coords))? - else { - return Ok(()); - }; - if self.output_needed { - self.processed_region.chunks[chunk_coords] = Some(Box::new(ProcessedChunk { + if self.output_needed || self.lightmap_needed { + if let Some(layer::LayerData { blocks, biomes, + block_light, depths, - })); + }) = world::layer::top_layer(&mut self.processed_region.biome_list, &chunk) + .with_context(|| format!("Failed to process chunk {:?}", chunk_coords))? + { + if self.output_needed { + self.processed_region.chunks[chunk_coords] = Some(Box::new(ProcessedChunk { + blocks, + biomes, + depths, + })); + } + + if self.lightmap_needed { + let chunk_lightmap = Self::render_chunk_lightmap(block_light); + overlay_chunk(&mut self.lightmap, &chunk_lightmap, chunk_coords); + } + } } - if self.lightmap_needed { - let chunk_lightmap = Self::render_chunk_lightmap(block_light); - overlay_chunk(&mut self.lightmap, &chunk_lightmap, chunk_coords); + if self.entities_needed { + let mut block_entities = chunk.block_entities(); + self.entities.block_entities.append(&mut block_entities); } Ok(()) @@ -215,7 +256,7 @@ impl<'a> SingleRegionProcessor<'a> { /// Processes the region fn run(mut self) -> Result { - if !self.output_needed && !self.lightmap_needed { + if !self.output_needed && !self.lightmap_needed && !self.entities_needed { debug!( "Skipping unchanged region r.{}.{}.mca", self.coords.x, self.coords.z @@ -229,7 +270,10 @@ impl<'a> SingleRegionProcessor<'a> { ); if let Err(err) = self.process_chunks() { - if self.output_timestamp.is_some() && self.lightmap_timestamp.is_some() { + if self.output_timestamp.is_some() + && self.lightmap_timestamp.is_some() + && self.entities_timestamp.is_some() + { warn!( "Failed to process region {:?}, using old data: {:?}", self.coords, err @@ -246,6 +290,7 @@ impl<'a> SingleRegionProcessor<'a> { self.save_region()?; self.save_lightmap()?; + self.save_entities()?; Ok(if self.has_unknown { RegionProcessorStatus::OkWithUnknown @@ -313,6 +358,7 @@ impl<'a> RegionProcessor<'a> { pub fn run(self) -> Result> { fs::create_dir_all(&self.config.processed_dir)?; fs::create_dir_all(&self.config.tile_dir(TileKind::Lightmap, 0))?; + fs::create_dir_all(&self.config.entities_dir(0))?; info!("Processing region files..."); From 825cf70e515d84cb20cfb42c4f7afdfc88df2312 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 01:20:09 +0100 Subject: [PATCH 10/43] core: split TileCollector trait out of TileMipmapper Make mipmap-style recursive processing of tiles reusable. --- src/core/mod.rs | 1 + src/core/tile_collector.rs | 107 +++++++++++++++++++ src/core/tile_mipmapper.rs | 205 ++++++++++++++++++------------------- 3 files changed, 206 insertions(+), 107 deletions(-) create mode 100644 src/core/tile_collector.rs diff --git a/src/core/mod.rs b/src/core/mod.rs index 0e77768..e3f2ea3 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -4,6 +4,7 @@ mod common; mod metadata_writer; mod region_group; mod region_processor; +mod tile_collector; mod tile_mipmapper; mod tile_renderer; diff --git a/src/core/tile_collector.rs b/src/core/tile_collector.rs new file mode 100644 index 0000000..dfc6085 --- /dev/null +++ b/src/core/tile_collector.rs @@ -0,0 +1,107 @@ +//! A trait for recursively processing tiles +//! +//! Used for mipmap generation and collecting entity data + +use std::sync::mpsc; + +use anyhow::Result; +use rayon::prelude::*; + +use super::common::*; + +/// Helper to determine if no further mipmap levels are needed +/// +/// If all tile coordinates are -1 or 0, further mipmap levels will not +/// decrease the number of tiles and mipmap generated is considered finished. +fn done(tiles: &TileCoordMap) -> bool { + tiles + .0 + .iter() + .all(|(z, xs)| (-1..=0).contains(z) && xs.iter().all(|x| (-1..=0).contains(x))) +} + +/// Derives the map of populated tile coordinates for the next mipmap level +fn map_coords(tiles: &TileCoordMap) -> TileCoordMap { + let mut ret = TileCoordMap::default(); + + for (&z, xs) in &tiles.0 { + for &x in xs { + let xt = x >> 1; + let zt = z >> 1; + + ret.0.entry(zt).or_default().insert(xt); + } + } + + ret +} + +/// Trait to implement for collecting tiles recursively +pub trait TileCollector: Sync { + /// Return value of [TileCollector::collect_one] + type CollectOutput: Send; + + /// List of level 0 tiles + fn tiles(&self) -> &[TileCoords]; + + /// Called at the beginning of each level of processing + fn prepare(&self, level: usize) -> Result<()>; + + /// Called at the end of each level of processing + fn finish( + &self, + level: usize, + outputs: impl Iterator, + ) -> Result<()>; + + /// Called for each tile coordinate of the level that is currently being generated + fn collect_one( + &self, + level: usize, + coords: TileCoords, + prev: &TileCoordMap, + ) -> Result; + + /// Collects tiles recursively + fn collect_tiles(&self) -> Result> { + let mut tile_stack = { + let mut tile_map = TileCoordMap::default(); + + for &TileCoords { x, z } in self.tiles() { + tile_map.0.entry(z).or_default().insert(x); + } + + vec![tile_map] + }; + + loop { + let level = tile_stack.len(); + let prev = &tile_stack[level - 1]; + if done(prev) { + break; + } + + self.prepare(level)?; + + let next = map_coords(prev); + + let (send, recv) = mpsc::channel(); + + next.0 + .par_iter() + .flat_map(|(&z, xs)| xs.par_iter().map(move |&x| TileCoords { x, z })) + .try_for_each(|coords| { + let output = self.collect_one(level, coords, prev)?; + send.send(output).unwrap(); + anyhow::Ok(()) + })?; + + drop(send); + self.finish(level, recv.into_iter())?; + + tile_stack.push(next); + } + + Ok(tile_stack) + } +} diff --git a/src/core/tile_mipmapper.rs b/src/core/tile_mipmapper.rs index 6ea8750..a372ca5 100644 --- a/src/core/tile_mipmapper.rs +++ b/src/core/tile_mipmapper.rs @@ -1,14 +1,53 @@ //! The [TileMipmapper] -use std::sync::mpsc; +use std::ops::Add; use anyhow::{Context, Result}; -use rayon::prelude::*; use tracing::{debug, info, warn}; -use super::common::*; +use super::{common::*, tile_collector::TileCollector}; use crate::{io::fs, types::*}; +/// Counters for the number of processed and total tiles +/// +/// Used as return of [TileMipmapper::collect_one] +#[derive(Debug, Clone, Copy)] +pub struct MipmapStat { + /// Total number of tiles + total: usize, + /// Processed number of tiles + processed: usize, +} + +impl MipmapStat { + /// Mipmap step return when none of the input files exist + const NOT_FOUND: MipmapStat = MipmapStat { + total: 0, + processed: 0, + }; + /// Mipmap step return when output file is up-to-date + const SKIPPED: MipmapStat = MipmapStat { + total: 1, + processed: 0, + }; + /// Mipmap step return when a new output file has been generated + const PROCESSED: MipmapStat = MipmapStat { + total: 1, + processed: 1, + }; +} + +impl Add for MipmapStat { + type Output = MipmapStat; + + fn add(self, rhs: Self) -> Self::Output { + MipmapStat { + total: self.total + rhs.total, + processed: self.processed + rhs.processed, + } + } +} + /// Generates mipmap tiles from full-resolution tile images pub struct TileMipmapper<'a> { /// Common MinedMap configuration from command line @@ -17,39 +56,63 @@ pub struct TileMipmapper<'a> { regions: &'a [TileCoords], } +impl<'a> TileCollector for TileMipmapper<'a> { + type CollectOutput = MipmapStat; + + fn tiles(&self) -> &[TileCoords] { + self.regions + } + + fn prepare(&self, level: usize) -> Result<()> { + info!("Generating level {} mipmaps...", level); + + fs::create_dir_all(&self.config.tile_dir(TileKind::Map, level))?; + fs::create_dir_all(&self.config.tile_dir(TileKind::Lightmap, level))?; + + Ok(()) + } + + fn finish( + &self, + level: usize, + outputs: impl Iterator, + ) -> Result<()> { + let stat = outputs.fold( + MipmapStat { + total: 0, + processed: 0, + }, + MipmapStat::add, + ); + info!( + "Generated level {} mipmaps ({} processed, {} unchanged)", + level, + stat.processed, + stat.total - stat.processed, + ); + + Ok(()) + } + + fn collect_one( + &self, + level: usize, + coords: TileCoords, + prev: &TileCoordMap, + ) -> Result { + let map_stat = self.render_mipmap::>(TileKind::Map, level, coords, prev)?; + let lightmap_stat = + self.render_mipmap::>(TileKind::Lightmap, level, coords, prev)?; + Ok(map_stat + lightmap_stat) + } +} + impl<'a> TileMipmapper<'a> { /// Constructs a new TileMipmapper pub fn new(config: &'a Config, regions: &'a [TileCoords]) -> Self { TileMipmapper { config, regions } } - /// Helper to determine if no further mipmap levels are needed - /// - /// If all tile coordinates are -1 or 0, further mipmap levels will not - /// decrease the number of tiles and mipmap generated is considered finished. - fn done(tiles: &TileCoordMap) -> bool { - tiles - .0 - .iter() - .all(|(z, xs)| (-1..=0).contains(z) && xs.iter().all(|x| (-1..=0).contains(x))) - } - - /// Derives the map of populated tile coordinates for the next mipmap level - fn map_coords(tiles: &TileCoordMap) -> TileCoordMap { - let mut ret = TileCoordMap::default(); - - for (&z, xs) in &tiles.0 { - for &x in xs { - let xt = x >> 1; - let zt = z >> 1; - - ret.0.entry(zt).or_default().insert(xt); - } - } - - ret - } - /// Renders and saves a single mipmap tile image /// /// Each mipmap tile is rendered by taking 2x2 tiles from the @@ -60,9 +123,7 @@ impl<'a> TileMipmapper<'a> { level: usize, coords: TileCoords, prev: &TileCoordMap, - count_total: &mpsc::Sender<()>, - count_processed: &mpsc::Sender<()>, - ) -> Result<()> + ) -> Result where [P::Subpixel]: image::EncodableLayout, image::ImageBuffer>: Into, @@ -97,11 +158,9 @@ impl<'a> TileMipmapper<'a> { .collect(); let Some(input_timestamp) = sources.iter().map(|(_, _, ts)| *ts).max() else { - return Ok(()); + return Ok(MipmapStat::NOT_FOUND); }; - count_total.send(()).unwrap(); - if Some(input_timestamp) <= output_timestamp { debug!( "Skipping unchanged mipmap tile {}", @@ -110,7 +169,7 @@ impl<'a> TileMipmapper<'a> { .expect("tile path must be in output directory") .display(), ); - return Ok(()); + return Ok(MipmapStat::SKIPPED); } debug!( @@ -156,79 +215,11 @@ impl<'a> TileMipmapper<'a> { }, )?; - count_processed.send(()).unwrap(); - Ok(()) + Ok(MipmapStat::PROCESSED) } /// Runs the mipmap generation pub fn run(self) -> Result> { - let mut tile_stack = { - let mut tile_map = TileCoordMap::default(); - - for &TileCoords { x, z } in self.regions { - tile_map.0.entry(z).or_default().insert(x); - } - - vec![tile_map] - }; - - loop { - let level = tile_stack.len(); - let prev = &tile_stack[level - 1]; - if Self::done(prev) { - break; - } - - info!("Generating level {} mipmaps...", level); - - fs::create_dir_all(&self.config.tile_dir(TileKind::Map, level))?; - fs::create_dir_all(&self.config.tile_dir(TileKind::Lightmap, level))?; - - let next = Self::map_coords(prev); - - let (total_send, total_recv) = mpsc::channel(); - let (processed_send, processed_recv) = mpsc::channel(); - - next.0 - .par_iter() - .flat_map(|(&z, xs)| xs.par_iter().map(move |&x| TileCoords { x, z })) - .try_for_each(|coords| { - self.render_mipmap::>( - TileKind::Map, - level, - coords, - prev, - &total_send, - &processed_send, - )?; - self.render_mipmap::>( - TileKind::Lightmap, - level, - coords, - prev, - &total_send, - &processed_send, - )?; - - anyhow::Ok(()) - })?; - - drop(total_send); - let total = total_recv.into_iter().count(); - - drop(processed_send); - let processed = processed_recv.into_iter().count(); - - info!( - "Generated level {} mipmaps ({} processed, {} unchanged)", - level, - processed, - total - processed, - ); - - tile_stack.push(next); - } - - Ok(tile_stack) + self.collect_tiles() } } From e36ae4601df41bbe0df4b801832a06d99ca9d639 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 12:27:18 +0100 Subject: [PATCH 11/43] world: add Eq + Ord to all block entity types --- src/world/block_entity.rs | 8 ++++---- src/world/json_text.rs | 4 ++-- src/world/sign.rs | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/world/block_entity.rs b/src/world/block_entity.rs index 65d95e4..9e60a23 100644 --- a/src/world/block_entity.rs +++ b/src/world/block_entity.rs @@ -8,7 +8,7 @@ use super::{ }; /// Kind of sign block -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "snake_case")] pub enum SignKind { /// Standing or attached sign @@ -18,7 +18,7 @@ pub enum SignKind { } /// Processed sign data -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct Sign { /// The kind of the sign pub kind: SignKind, @@ -45,7 +45,7 @@ impl Sign { } /// Data for different kinds of [BlockEntity] -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(tag = "type", rename_all = "snake_case")] pub enum BlockEntityData { /// A sign block @@ -53,7 +53,7 @@ pub enum BlockEntityData { } /// A processed block entity -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct BlockEntity { /// Global X coordinate pub x: i32, diff --git a/src/world/json_text.rs b/src/world/json_text.rs index a9c1f13..0f72dcc 100644 --- a/src/world/json_text.rs +++ b/src/world/json_text.rs @@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize}; /// is handled by [DeserializedText]. /// /// Formatting that is not set in a node is inherited from the parent. -#[derive(Debug, Serialize, Deserialize, Default)] +#[derive(Debug, Serialize, Deserialize, Default, PartialEq, Eq, PartialOrd, Ord)] pub struct FormattedText { #[serde(default)] /// Text content @@ -77,7 +77,7 @@ impl From for FormattedTextTree { } /// List of [FormattedText] -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct FormattedTextList(pub Vec); impl FormattedTextList { diff --git a/src/world/sign.rs b/src/world/sign.rs index e53be87..43cac47 100644 --- a/src/world/sign.rs +++ b/src/world/sign.rs @@ -79,7 +79,7 @@ impl BlockEntitySignExt for de::BlockEntitySign { } } -#[derive(Debug, Default, Serialize, Deserialize)] +#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] /// Deserialized and linearized sign text pub struct SignText(pub Vec); From 7740ce0522d3459b7f905346c3b864b2aa75802d Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 12:27:43 +0100 Subject: [PATCH 12/43] core/region_processor: sort processed block entities Make the block entity list more reproducible when the stored chunk order changes. --- src/core/region_processor.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/region_processor.rs b/src/core/region_processor.rs index f1f8441..cff87b7 100644 --- a/src/core/region_processor.rs +++ b/src/core/region_processor.rs @@ -195,11 +195,13 @@ impl<'a> SingleRegionProcessor<'a> { /// Saves processed entity data /// /// The timestamp is the time of the last modification of the input region data. - fn save_entities(&self) -> Result<()> { + fn save_entities(&mut self) -> Result<()> { if !self.entities_needed { return Ok(()); } + self.entities.block_entities.sort_unstable(); + storage::write_file( &self.entities_path, &self.entities, From 0f308788ef7b1579407b5a7f18b153179cf9bb7e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 02:28:11 +0100 Subject: [PATCH 13/43] core: split TileMerger out of TileMipmapper Reusable mipmap-style tile merging --- src/core/mod.rs | 1 + src/core/tile_merger.rs | 97 ++++++++++++++++ src/core/tile_mipmapper.rs | 228 ++++++++++++++++++++----------------- 3 files changed, 220 insertions(+), 106 deletions(-) create mode 100644 src/core/tile_merger.rs diff --git a/src/core/mod.rs b/src/core/mod.rs index e3f2ea3..f892a62 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -5,6 +5,7 @@ mod metadata_writer; mod region_group; mod region_processor; mod tile_collector; +mod tile_merger; mod tile_mipmapper; mod tile_renderer; diff --git a/src/core/tile_merger.rs b/src/core/tile_merger.rs new file mode 100644 index 0000000..3a14390 --- /dev/null +++ b/src/core/tile_merger.rs @@ -0,0 +1,97 @@ +//! Mipmap-style merging of tiles + +use std::{ + fs::File, + io::BufWriter, + path::{Path, PathBuf}, + time::SystemTime, +}; + +use anyhow::Result; +use tracing::warn; + +use super::common::*; +use crate::io::fs; + +/// [TileMerger::merge_tiles] return +#[derive(Debug, Clone, Copy)] +pub enum Stat { + /// None of the input files were found + NotFound, + /// The output file is up-to-date + Skipped, + /// The output file is regenerated + Regenerate, +} + +/// A source file for the [TileMerger] +/// +/// The tuple elements are X and Z coordinate offsets in the range [0, 1], +/// the file path and the time of last change of the input. +pub type Source = ((i32, i32), PathBuf, SystemTime); + +/// Reusable trait for mipmap-style tile merging with change tracking +pub trait TileMerger { + /// [fs::FileMetaVersion] of input and output files + /// + /// The version in the file metadata on disk must match the returned + /// version for the a to be considered up-to-date. + fn file_meta_version(&self) -> fs::FileMetaVersion; + + /// Returns the paths of input and output files + fn tile_path(&self, level: usize, coords: TileCoords) -> PathBuf; + + /// Can be used to log the processing status + fn log(&self, _output_path: &Path, _stat: Stat) {} + + /// Handles the actual merging of source files + fn write_tile(&self, file: &mut BufWriter, sources: &[Source]) -> Result<()>; + + /// Generates a tile at given coordinates and mipmap level + fn merge_tiles(&self, level: usize, coords: TileCoords, prev: &TileCoordMap) -> Result { + let version = self.file_meta_version(); + let output_path = self.tile_path(level, coords); + let output_timestamp = fs::read_timestamp(&output_path, version); + + let sources: Vec<_> = [(0, 0), (0, 1), (1, 0), (1, 1)] + .into_iter() + .filter_map(|(dx, dz)| { + let source_coords = TileCoords { + x: 2 * coords.x + dx, + z: 2 * coords.z + dz, + }; + if !prev.contains(source_coords) { + return None; + } + + let source_path = self.tile_path(level - 1, source_coords); + let timestamp = match fs::modified_timestamp(&source_path) { + Ok(timestamp) => timestamp, + Err(err) => { + warn!("{}", err); + return None; + } + }; + Some(((dx, dz), source_path, timestamp)) + }) + .collect(); + + let Some(input_timestamp) = sources.iter().map(|(_, _, ts)| *ts).max() else { + self.log(&output_path, Stat::NotFound); + return Ok(Stat::NotFound); + }; + + if Some(input_timestamp) <= output_timestamp { + self.log(&output_path, Stat::Skipped); + return Ok(Stat::Skipped); + } + + self.log(&output_path, Stat::Regenerate); + + fs::create_with_timestamp(&output_path, version, input_timestamp, |file| { + self.write_tile(file, &sources) + })?; + + Ok(Stat::Regenerate) + } +} diff --git a/src/core/tile_mipmapper.rs b/src/core/tile_mipmapper.rs index a372ca5..1873cf9 100644 --- a/src/core/tile_mipmapper.rs +++ b/src/core/tile_mipmapper.rs @@ -1,11 +1,15 @@ //! The [TileMipmapper] -use std::ops::Add; +use std::{marker::PhantomData, ops::Add}; use anyhow::{Context, Result}; use tracing::{debug, info, warn}; -use super::{common::*, tile_collector::TileCollector}; +use super::{ + common::*, + tile_collector::TileCollector, + tile_merger::{self, TileMerger}, +}; use crate::{io::fs, types::*}; /// Counters for the number of processed and total tiles @@ -19,22 +23,23 @@ pub struct MipmapStat { processed: usize, } -impl MipmapStat { - /// Mipmap step return when none of the input files exist - const NOT_FOUND: MipmapStat = MipmapStat { - total: 0, - processed: 0, - }; - /// Mipmap step return when output file is up-to-date - const SKIPPED: MipmapStat = MipmapStat { - total: 1, - processed: 0, - }; - /// Mipmap step return when a new output file has been generated - const PROCESSED: MipmapStat = MipmapStat { - total: 1, - processed: 1, - }; +impl From for MipmapStat { + fn from(value: tile_merger::Stat) -> Self { + match value { + tile_merger::Stat::NotFound => MipmapStat { + total: 0, + processed: 0, + }, + tile_merger::Stat::Skipped => MipmapStat { + total: 1, + processed: 0, + }, + tile_merger::Stat::Regenerate => MipmapStat { + total: 1, + processed: 1, + }, + } + } } impl Add for MipmapStat { @@ -48,6 +53,102 @@ impl Add for MipmapStat { } } +/// [TileMerger] for map tile images +struct MapMerger<'a, P> { + /// Common MinedMap configuration from command line + config: &'a Config, + /// Tile kind (map or lightmap) + kind: TileKind, + /// Pixel format type + _pixel: PhantomData

, +} + +impl<'a, P> MapMerger<'a, P> { + /// Creates a new [MapMerger] + fn new(config: &'a Config, kind: TileKind) -> Self { + MapMerger { + config, + kind, + _pixel: PhantomData, + } + } +} + +impl<'a, P: image::PixelWithColorType> TileMerger for MapMerger<'a, P> +where + [P::Subpixel]: image::EncodableLayout, + image::ImageBuffer>: Into, +{ + fn file_meta_version(&self) -> fs::FileMetaVersion { + MIPMAP_FILE_META_VERSION + } + + fn tile_path(&self, level: usize, coords: TileCoords) -> std::path::PathBuf { + self.config.tile_path(self.kind, level, coords) + } + + fn log(&self, output_path: &std::path::Path, stat: super::tile_merger::Stat) { + match stat { + super::tile_merger::Stat::NotFound => {} + super::tile_merger::Stat::Skipped => { + debug!( + "Skipping unchanged mipmap tile {}", + output_path + .strip_prefix(&self.config.output_dir) + .expect("tile path must be in output directory") + .display(), + ); + } + super::tile_merger::Stat::Regenerate => { + debug!( + "Rendering mipmap tile {}", + output_path + .strip_prefix(&self.config.output_dir) + .expect("tile path must be in output directory") + .display(), + ); + } + }; + } + + fn write_tile( + &self, + file: &mut std::io::BufWriter, + sources: &[super::tile_merger::Source], + ) -> Result<()> { + /// Tile width/height + const N: u32 = (BLOCKS_PER_CHUNK * CHUNKS_PER_REGION) as u32; + + let mut image: image::DynamicImage = + image::ImageBuffer::>::new(N, N).into(); + + for ((dx, dz), source_path, _) in sources { + let source = match image::open(source_path) { + Ok(source) => source, + Err(err) => { + warn!( + "Failed to read source image {}: {}", + source_path.display(), + err, + ); + continue; + } + }; + let resized = source.resize(N / 2, N / 2, image::imageops::FilterType::Triangle); + image::imageops::overlay( + &mut image, + &resized, + *dx as i64 * (N / 2) as i64, + *dz as i64 * (N / 2) as i64, + ); + } + + image + .write_to(file, image::ImageFormat::Png) + .context("Failed to save image") + } +} + /// Generates mipmap tiles from full-resolution tile images pub struct TileMipmapper<'a> { /// Common MinedMap configuration from command line @@ -128,94 +229,9 @@ impl<'a> TileMipmapper<'a> { [P::Subpixel]: image::EncodableLayout, image::ImageBuffer>: Into, { - /// Tile width/height - const N: u32 = (BLOCKS_PER_CHUNK * CHUNKS_PER_REGION) as u32; - - let output_path = self.config.tile_path(kind, level, coords); - let output_timestamp = fs::read_timestamp(&output_path, MIPMAP_FILE_META_VERSION); - - let sources: Vec<_> = [(0, 0), (0, 1), (1, 0), (1, 1)] - .into_iter() - .filter_map(|(dx, dz)| { - let source_coords = TileCoords { - x: 2 * coords.x + dx, - z: 2 * coords.z + dz, - }; - if !prev.contains(source_coords) { - return None; - } - - let source_path = self.config.tile_path(kind, level - 1, source_coords); - let timestamp = match fs::modified_timestamp(&source_path) { - Ok(timestamp) => timestamp, - Err(err) => { - warn!("{}", err); - return None; - } - }; - Some(((dx, dz), source_path, timestamp)) - }) - .collect(); - - let Some(input_timestamp) = sources.iter().map(|(_, _, ts)| *ts).max() else { - return Ok(MipmapStat::NOT_FOUND); - }; - - if Some(input_timestamp) <= output_timestamp { - debug!( - "Skipping unchanged mipmap tile {}", - output_path - .strip_prefix(&self.config.output_dir) - .expect("tile path must be in output directory") - .display(), - ); - return Ok(MipmapStat::SKIPPED); - } - - debug!( - "Rendering mipmap tile {}", - output_path - .strip_prefix(&self.config.output_dir) - .expect("tile path must be in output directory") - .display(), - ); - - let mut image: image::DynamicImage = - image::ImageBuffer::>::new(N, N).into(); - - for ((dx, dz), source_path, _) in sources { - let source = match image::open(&source_path) { - Ok(source) => source, - Err(err) => { - warn!( - "Failed to read source image {}: {}", - source_path.display(), - err, - ); - continue; - } - }; - let resized = source.resize(N / 2, N / 2, image::imageops::FilterType::Triangle); - image::imageops::overlay( - &mut image, - &resized, - dx as i64 * (N / 2) as i64, - dz as i64 * (N / 2) as i64, - ); - } - - fs::create_with_timestamp( - &output_path, - MIPMAP_FILE_META_VERSION, - input_timestamp, - |file| { - image - .write_to(file, image::ImageFormat::Png) - .context("Failed to save image") - }, - )?; - - Ok(MipmapStat::PROCESSED) + let merger = MapMerger::

::new(self.config, kind); + let ret = merger.merge_tiles(level, coords, prev)?; + Ok(ret.into()) } /// Runs the mipmap generation From 1143396068b1e0c7310ad49968709508a0934281 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 13:50:05 +0100 Subject: [PATCH 14/43] core: use debug format for logging errors Show the full cause stack. --- src/core/tile_merger.rs | 2 +- src/core/tile_mipmapper.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/tile_merger.rs b/src/core/tile_merger.rs index 3a14390..6f3cc22 100644 --- a/src/core/tile_merger.rs +++ b/src/core/tile_merger.rs @@ -68,7 +68,7 @@ pub trait TileMerger { let timestamp = match fs::modified_timestamp(&source_path) { Ok(timestamp) => timestamp, Err(err) => { - warn!("{}", err); + warn!("{:?}", err); return None; } }; diff --git a/src/core/tile_mipmapper.rs b/src/core/tile_mipmapper.rs index 1873cf9..cd90e20 100644 --- a/src/core/tile_mipmapper.rs +++ b/src/core/tile_mipmapper.rs @@ -127,7 +127,7 @@ where Ok(source) => source, Err(err) => { warn!( - "Failed to read source image {}: {}", + "Failed to read source image {}: {:?}", source_path.display(), err, ); From cde6a4b6e602bfabecdcd00caf9d63e83b0b45dc Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 12:39:51 +0100 Subject: [PATCH 15/43] core: merge entity data for all regions into one file Introduce the EntityCollector, using the TileCollector and TileMerger traits. --- src/core/common.rs | 6 +- src/core/entity_collector.rs | 123 +++++++++++++++++++++++++++++++++++ src/core/mod.rs | 4 ++ 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/core/entity_collector.rs diff --git a/src/core/common.rs b/src/core/common.rs index cd8fd8f..7280be9 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -141,6 +141,8 @@ pub struct Config { pub processed_dir: PathBuf, /// Path for storage of processed entity data files pub entities_dir: PathBuf, + /// Path for storage of the final merged processed entity data file + pub entities_path_final: PathBuf, /// Path of viewer metadata file pub metadata_path: PathBuf, } @@ -157,7 +159,8 @@ impl Config { let region_dir = [&args.input_dir, Path::new("region")].iter().collect(); let level_dat_path = [&args.input_dir, Path::new("level.dat")].iter().collect(); let processed_dir: PathBuf = [&args.output_dir, Path::new("processed")].iter().collect(); - let entities_dir = [&processed_dir, Path::new("entities")].iter().collect(); + let entities_dir: PathBuf = [&processed_dir, Path::new("entities")].iter().collect(); + let entities_path_final = [&entities_dir, Path::new("entities.bin")].iter().collect(); let metadata_path = [&args.output_dir, Path::new("info.json")].iter().collect(); Config { @@ -167,6 +170,7 @@ impl Config { output_dir: args.output_dir.clone(), processed_dir, entities_dir, + entities_path_final, metadata_path, } } diff --git a/src/core/entity_collector.rs b/src/core/entity_collector.rs new file mode 100644 index 0000000..3d9b6ab --- /dev/null +++ b/src/core/entity_collector.rs @@ -0,0 +1,123 @@ +//! The [EntityCollector] + +use std::path::Path; + +use anyhow::{Context, Result}; +use tracing::{info, warn}; + +use super::{common::*, tile_collector::TileCollector, tile_merger::TileMerger}; +use crate::io::{fs, storage}; + +/// Generates mipmap tiles from full-resolution tile images +pub struct EntityCollector<'a> { + /// Common MinedMap configuration from command line + config: &'a Config, + /// List of populated tiles for base mipmap level (level 0) + regions: &'a [TileCoords], +} + +impl<'a> TileMerger for EntityCollector<'a> { + fn file_meta_version(&self) -> fs::FileMetaVersion { + ENTITIES_FILE_META_VERSION + } + + fn tile_path(&self, level: usize, coords: TileCoords) -> std::path::PathBuf { + self.config.entities_path(level, coords) + } + + fn write_tile( + &self, + file: &mut std::io::BufWriter, + sources: &[super::tile_merger::Source], + ) -> Result<()> { + Self::merge_entity_lists(file, sources.iter().map(|source| &source.1)) + } +} + +impl<'a> TileCollector for EntityCollector<'a> { + type CollectOutput = (); + + fn tiles(&self) -> &[TileCoords] { + self.regions + } + + fn prepare(&self, level: usize) -> Result<()> { + fs::create_dir_all(&self.config.entities_dir(level)) + } + + fn finish( + &self, + _level: usize, + _outputs: impl Iterator, + ) -> Result<()> { + Ok(()) + } + + fn collect_one( + &self, + level: usize, + coords: TileCoords, + prev: &TileCoordMap, + ) -> Result { + self.merge_tiles(level, coords, prev)?; + Ok(()) + } +} + +impl<'a> EntityCollector<'a> { + /// Constructs a new EntityCollector + pub fn new(config: &'a Config, regions: &'a [TileCoords]) -> Self { + EntityCollector { config, regions } + } + + /// Merges multiple entity lists into one + fn merge_entity_lists>( + file: &mut std::io::BufWriter, + sources: impl Iterator, + ) -> Result<()> { + let mut output = ProcessedEntities::default(); + + for source_path in sources { + let mut source: ProcessedEntities = + match storage::read_file(source_path.as_ref(), storage::Format::Json) { + Ok(source) => source, + Err(err) => { + warn!( + "Failed to read entity data file {}: {:?}", + source_path.as_ref().display(), + err, + ); + continue; + } + }; + + output.block_entities.append(&mut source.block_entities); + } + + storage::write(file, &output, storage::Format::Json).context("Failed to write entity data") + } + + /// Runs the mipmap generation + pub fn run(self) -> Result<()> { + info!("Collecting entity data..."); + + let tile_stack = self.collect_tiles()?; + + // Final merge + let level = tile_stack.len() - 1; + let tile_map = &tile_stack[level]; + let sources: Vec<_> = [(-1, -1), (-1, 0), (0, -1), (0, 0)] + .into_iter() + .map(|(x, z)| TileCoords { x, z }) + .filter(|&coords| tile_map.contains(coords)) + .map(|coords| self.tile_path(level, coords)) + .collect(); + + fs::create_with_tmpfile(&self.config.entities_path_final, |file| { + Self::merge_entity_lists(file, sources.iter()) + })?; + + info!("Collected entity data."); + Ok(()) + } +} diff --git a/src/core/mod.rs b/src/core/mod.rs index f892a62..61bdb76 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,6 +1,7 @@ //! Core functions of the MinedMap CLI mod common; +mod entity_collector; mod metadata_writer; mod region_group; mod region_processor; @@ -21,6 +22,8 @@ use region_processor::RegionProcessor; use tile_mipmapper::TileMipmapper; use tile_renderer::TileRenderer; +use self::entity_collector::EntityCollector; + /// MinedMap version number const VERSION: &str = git_version!( args = ["--abbrev=7", "--match=v*", "--dirty=-modified"], @@ -77,6 +80,7 @@ pub fn cli() -> Result<()> { let regions = RegionProcessor::new(&config).run()?; TileRenderer::new(&config, &rt, ®ions).run()?; let tiles = TileMipmapper::new(&config, ®ions).run()?; + EntityCollector::new(&config, ®ions).run()?; MetadataWriter::new(&config, &tiles).run()?; Ok(()) From d29c0df25db287a3f9cbd2b4bfad7712428e9c91 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 15:31:57 +0100 Subject: [PATCH 16/43] core/metadata_writer: write entity list for viewer --- src/core/common.rs | 12 +++++++++--- src/core/metadata_writer.rs | 39 +++++++++++++++++++++++++++++++++---- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/core/common.rs b/src/core/common.rs index 7280be9..d961ea9 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -144,7 +144,9 @@ pub struct Config { /// Path for storage of the final merged processed entity data file pub entities_path_final: PathBuf, /// Path of viewer metadata file - pub metadata_path: PathBuf, + pub viewer_info_path: PathBuf, + /// Path of viewer entities file + pub viewer_entities_path: PathBuf, } impl Config { @@ -161,7 +163,10 @@ impl Config { let processed_dir: PathBuf = [&args.output_dir, Path::new("processed")].iter().collect(); let entities_dir: PathBuf = [&processed_dir, Path::new("entities")].iter().collect(); let entities_path_final = [&entities_dir, Path::new("entities.bin")].iter().collect(); - let metadata_path = [&args.output_dir, Path::new("info.json")].iter().collect(); + let viewer_info_path = [&args.output_dir, Path::new("info.json")].iter().collect(); + let viewer_entities_path = [&args.output_dir, Path::new("entities.json")] + .iter() + .collect(); Config { num_threads, @@ -171,7 +176,8 @@ impl Config { processed_dir, entities_dir, entities_path_final, - metadata_path, + viewer_info_path, + viewer_entities_path, } } diff --git a/src/core/metadata_writer.rs b/src/core/metadata_writer.rs index 5783356..caf7726 100644 --- a/src/core/metadata_writer.rs +++ b/src/core/metadata_writer.rs @@ -3,7 +3,11 @@ use anyhow::{Context, Result}; use serde::Serialize; -use crate::{core::common::*, io::fs, world::de}; +use crate::{ + core::common::*, + io::{fs, storage}, + world::{block_entity::BlockEntity, de}, +}; /// Minimum and maximum X and Z tile coordinates for a mipmap level #[derive(Debug, Serialize)] @@ -46,6 +50,13 @@ struct Metadata<'t> { spawn: Spawn, } +/// Viewer entity JSON data structure +#[derive(Debug, Serialize, Default)] +struct Entities { + /// List of signs + signs: Vec, +} + /// The MetadataWriter is used to generate the viewer metadata file pub struct MetadataWriter<'a> { /// Common MinedMap configuration from command line @@ -109,6 +120,19 @@ impl<'a> MetadataWriter<'a> { } } + /// Generates [Entities] data from collected entity lists + fn entities(&self) -> Result { + let data: ProcessedEntities = + storage::read_file(&self.config.entities_path_final, storage::Format::Json) + .context("Failed to read entity data file")?; + + let ret = Entities { + signs: data.block_entities, + }; + + Ok(ret) + } + /// Runs the viewer metadata file generation pub fn run(self) -> Result<()> { let level_dat = self.read_level_dat()?; @@ -122,8 +146,15 @@ impl<'a> MetadataWriter<'a> { metadata.mipmaps.push(Self::mipmap_entry(tile_map)); } - fs::create_with_tmpfile(&self.config.metadata_path, |file| { - serde_json::to_writer(file, &metadata).context("Failed to write metadata") - }) + fs::create_with_tmpfile(&self.config.viewer_info_path, |file| { + serde_json::to_writer(file, &metadata).context("Failed to write info.json") + })?; + + let entities = self.entities()?; + fs::create_with_tmpfile(&self.config.viewer_entities_path, |file| { + serde_json::to_writer(file, &entities).context("Failed to write entities.json") + })?; + + Ok(()) } } From 1874d3082dc35830e9091860391f7043bac21fea Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 29 Dec 2023 21:09:34 +0100 Subject: [PATCH 17/43] resource: fix typo in doc comment --- crates/resource/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/resource/src/lib.rs b/crates/resource/src/lib.rs index a832a58..ad3553f 100644 --- a/crates/resource/src/lib.rs +++ b/crates/resource/src/lib.rs @@ -27,7 +27,7 @@ pub enum BlockFlag { Foliage, /// The block type is birch foliage Birch, - /// The block type is spurce foliage + /// The block type is spruce foliage Spruce, /// The block type is colored using biome water colors Water, From 8814dcff89431cfe4b9935105ee8d0bdf1e194bf Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 30 Dec 2023 01:42:17 +0100 Subject: [PATCH 18/43] resource: split BlockType in Copy and !Copy parts Preparation for actually adding !Copy fields to BlockType. Only the Copy parts are added to the processed data, avoiding .clone() for the most part. --- crates/resource/src/block_color.rs | 10 +- crates/resource/src/block_types.rs | 6048 ++++++++++++++++++---------- crates/resource/src/lib.rs | 30 +- resource/generate.py | 6 +- src/world/layer.rs | 14 +- src/world/section.rs | 8 +- 6 files changed, 4073 insertions(+), 2043 deletions(-) diff --git a/crates/resource/src/block_color.rs b/crates/resource/src/block_color.rs index cffebeb..e95e0ed 100644 --- a/crates/resource/src/block_color.rs +++ b/crates/resource/src/block_color.rs @@ -1,6 +1,6 @@ //! Functions for computations of block colors -use super::{Biome, BlockType, Color, Colorf}; +use super::{Biome, BlockColor, Color, Colorf}; /// Converts an u8 RGB color to a float vector fn color_vec_unscaled(color: Color) -> Colorf { @@ -91,18 +91,18 @@ const BIRCH_COLOR: Colorf = Colorf::new(0.502, 0.655, 0.333); // == color_vec(Co /// Color multiplier for spruce leaves const EVERGREEN_COLOR: Colorf = Colorf::new(0.380, 0.600, 0.380); // == color_vec(Color([97, 153, 97])) -/// Determined if calling [block_color] for a given [BlockType] needs biome information -pub fn needs_biome(block: BlockType) -> bool { +/// Determined if calling [block_color] for a given [BlockColor] needs biome information +pub fn needs_biome(block: BlockColor) -> bool { use super::BlockFlag::*; block.is(Grass) || block.is(Foliage) || block.is(Water) } -/// Determined the block color to display for a given [BlockType] +/// Determined the block color to display for a given [BlockColor] /// /// [needs_biome] must be used to determine whether passing a [Biome] is necessary. /// Will panic if a [Biome] is necessary, but none is passed. -pub fn block_color(block: BlockType, biome: Option<&Biome>, depth: f32) -> Colorf { +pub fn block_color(block: BlockColor, biome: Option<&Biome>, depth: f32) -> Colorf { use super::BlockFlag::*; let get_biome = || biome.expect("needs biome to determine block color"); diff --git a/crates/resource/src/block_types.rs b/crates/resource/src/block_types.rs index a70106c..87d57c8 100644 --- a/crates/resource/src/block_types.rs +++ b/crates/resource/src/block_types.rs @@ -6,5692 +6,7318 @@ pub const BLOCK_TYPES: &[(&str, BlockType)] = &[ ( "acacia_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "acacia_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([167, 95, 60]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([167, 95, 60]), + }, }, ), ( "acacia_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 90, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([168, 90, 50]), + }, }, ), ( "acacia_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 90, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([168, 90, 50]), + }, }, ), ( "acacia_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "acacia_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), - color: Color([149, 148, 148]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), + color: Color([149, 148, 148]), + }, }, ), ( "acacia_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([150, 88, 55]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([150, 88, 55]), + }, }, ), ( "acacia_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 90, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([168, 90, 50]), + }, }, ), ( "acacia_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 90, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([168, 90, 50]), + }, }, ), ( "acacia_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([118, 117, 23]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([118, 117, 23]), + }, }, ), ( "acacia_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 90, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([168, 90, 50]), + }, }, ), ( "acacia_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 90, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([168, 90, 50]), + }, }, ), ( "acacia_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 90, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([168, 90, 50]), + }, }, ), ( "acacia_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([156, 87, 51]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([156, 87, 51]), + }, }, ), ( "acacia_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "acacia_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "acacia_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([103, 96, 86]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([103, 96, 86]), + }, }, ), ( "activator_rail", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 87, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 87, 74]), + }, }, ), ( "air", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "allium", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "amethyst_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([133, 97, 191]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([133, 97, 191]), + }, }, ), ( "amethyst_cluster", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([163, 126, 207]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([163, 126, 207]), + }, }, ), ( "ancient_debris", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([94, 66, 58]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([94, 66, 58]), + }, }, ), ( "andesite", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([136, 136, 136]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([136, 136, 136]), + }, }, ), ( "andesite_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([136, 136, 136]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([136, 136, 136]), + }, }, ), ( "andesite_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([136, 136, 136]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([136, 136, 136]), + }, }, ), ( "andesite_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([136, 136, 136]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([136, 136, 136]), + }, }, ), ( "anvil", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 72, 72]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 72, 72]), + }, }, ), ( "attached_melon_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([141, 142, 141]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([141, 142, 141]), + }, }, ), ( "attached_pumpkin_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([139, 139, 139]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([139, 139, 139]), + }, }, ), ( "azalea", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 124, 47]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 124, 47]), + }, }, ), ( "azalea_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([90, 114, 44]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([90, 114, 44]), + }, }, ), ( "azure_bluet", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "bamboo", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([93, 144, 19]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([93, 144, 19]), + }, }, ), ( "bamboo_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([139, 141, 62]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([139, 141, 62]), + }, }, ), ( "bamboo_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "bamboo_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([191, 171, 81]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([191, 171, 81]), + }, }, ), ( "bamboo_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 173, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 173, 80]), + }, }, ), ( "bamboo_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 173, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 173, 80]), + }, }, ), ( "bamboo_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "bamboo_mosaic", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([190, 170, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([190, 170, 78]), + }, }, ), ( "bamboo_mosaic_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([190, 170, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([190, 170, 78]), + }, }, ), ( "bamboo_mosaic_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([190, 170, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([190, 170, 78]), + }, }, ), ( "bamboo_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 173, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 173, 80]), + }, }, ), ( "bamboo_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 173, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 173, 80]), + }, }, ), ( "bamboo_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "bamboo_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 173, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 173, 80]), + }, }, ), ( "bamboo_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 173, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 173, 80]), + }, }, ), ( "bamboo_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 173, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 173, 80]), + }, }, ), ( "bamboo_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([198, 179, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([198, 179, 85]), + }, }, ), ( "bamboo_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "bamboo_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "barrel", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([134, 100, 58]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([134, 100, 58]), + }, }, ), ( "barrier", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "basalt", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([80, 81, 86]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([80, 81, 86]), + }, }, ), ( "beacon", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 220, 215]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 220, 215]), + }, }, ), ( "bedrock", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([85, 85, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([85, 85, 85]), + }, }, ), ( "bee_nest", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([202, 160, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([202, 160, 74]), + }, }, ), ( "beehive", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([180, 146, 90]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([180, 146, 90]), + }, }, ), ( "beetroots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([93, 91, 30]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([93, 91, 30]), + }, }, ), ( "bell", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([253, 235, 110]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([253, 235, 110]), + }, }, ), ( "big_dripleaf", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([111, 141, 51]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([111, 141, 51]), + }, }, ), ( "big_dripleaf_stem", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "birch_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "birch_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([220, 209, 176]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([220, 209, 176]), + }, }, ), ( "birch_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 175, 121]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 175, 121]), + }, }, ), ( "birch_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 175, 121]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 175, 121]), + }, }, ), ( "birch_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "birch_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Birch}), - color: Color([130, 129, 130]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Birch}), + color: Color([130, 129, 130]), + }, }, ), ( "birch_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 179, 135]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 179, 135]), + }, }, ), ( "birch_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 175, 121]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 175, 121]), + }, }, ), ( "birch_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 175, 121]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 175, 121]), + }, }, ), ( "birch_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 160, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 160, 79]), + }, }, ), ( "birch_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 175, 121]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 175, 121]), + }, }, ), ( "birch_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 175, 121]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 175, 121]), + }, }, ), ( "birch_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 175, 121]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 175, 121]), + }, }, ), ( "birch_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([207, 194, 157]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([207, 194, 157]), + }, }, ), ( "birch_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "birch_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "birch_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([216, 215, 210]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([216, 215, 210]), + }, }, ), ( "black_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "black_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "black_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "black_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "black_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([20, 21, 25]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([20, 21, 25]), + }, }, ), ( "black_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([8, 10, 15]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([8, 10, 15]), + }, }, ), ( "black_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([25, 26, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([25, 26, 31]), + }, }, ), ( "black_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([67, 30, 32]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([67, 30, 32]), + }, }, ), ( "black_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([25, 25, 29]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([25, 25, 29]), + }, }, ), ( "black_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([25, 25, 25]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([25, 25, 25]), + }, }, ), ( "black_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([24, 24, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([24, 24, 24]), + }, }, ), ( "black_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([37, 22, 16]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([37, 22, 16]), + }, }, ), ( "black_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "black_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([20, 21, 25]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([20, 21, 25]), + }, }, ), ( "blackstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([42, 36, 41]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([42, 36, 41]), + }, }, ), ( "blackstone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([42, 36, 41]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([42, 36, 41]), + }, }, ), ( "blackstone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([42, 36, 41]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([42, 36, 41]), + }, }, ), ( "blackstone_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([42, 36, 41]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([42, 36, 41]), + }, }, ), ( "blast_furnace", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([80, 80, 81]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([80, 80, 81]), + }, }, ), ( "blue_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "blue_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "blue_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "blue_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "blue_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 57, 157]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 57, 157]), + }, }, ), ( "blue_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 46, 143]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 46, 143]), + }, }, ), ( "blue_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([70, 73, 166]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([70, 73, 166]), + }, }, ), ( "blue_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([47, 64, 139]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([47, 64, 139]), + }, }, ), ( "blue_ice", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([116, 167, 253]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([116, 167, 253]), + }, }, ), ( "blue_orchid", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "blue_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 45, 140]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 45, 140]), + }, }, ), ( "blue_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([51, 76, 178]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([51, 76, 178]), + }, }, ), ( "blue_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([48, 73, 171]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([48, 73, 171]), + }, }, ), ( "blue_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([74, 59, 91]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([74, 59, 91]), + }, }, ), ( "blue_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "blue_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 57, 157]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 57, 157]), + }, }, ), ( "bone_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([209, 206, 179]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([209, 206, 179]), + }, }, ), ( "bookshelf", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "brain_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "brain_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([207, 91, 159]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([207, 91, 159]), + }, }, ), ( "brain_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "brain_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "brewing_stand", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 100, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 100, 80]), + }, }, ), ( "brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([150, 97, 83]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([150, 97, 83]), + }, }, ), ( "brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([150, 97, 83]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([150, 97, 83]), + }, }, ), ( "brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([150, 97, 83]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([150, 97, 83]), + }, }, ), ( "bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([150, 97, 83]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([150, 97, 83]), + }, }, ), ( "brown_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "brown_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "brown_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "brown_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "brown_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 71, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 71, 40]), + }, }, ), ( "brown_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([96, 59, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([96, 59, 31]), + }, }, ), ( "brown_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 84, 53]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 84, 53]), + }, }, ), ( "brown_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([119, 106, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([119, 106, 85]), + }, }, ), ( "brown_mushroom", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "brown_mushroom_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([149, 111, 81]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([149, 111, 81]), + }, }, ), ( "brown_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([106, 66, 35]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([106, 66, 35]), + }, }, ), ( "brown_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([102, 76, 51]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([102, 76, 51]), + }, }, ), ( "brown_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([97, 73, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([97, 73, 48]), + }, }, ), ( "brown_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([77, 51, 35]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([77, 51, 35]), + }, }, ), ( "brown_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "brown_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 71, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 71, 40]), + }, }, ), ( "bubble_column", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Water}), - color: Color([177, 177, 177]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Water}), + color: Color([177, 177, 177]), + }, }, ), ( "bubble_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "bubble_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([165, 26, 162]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([165, 26, 162]), + }, }, ), ( "bubble_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "bubble_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "budding_amethyst", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([132, 96, 186]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([132, 96, 186]), + }, }, ), ( "cactus", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([85, 127, 43]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([85, 127, 43]), + }, }, ), ( "cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "calcite", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 224, 220]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 224, 220]), + }, }, ), ( "calibrated_sculk_sensor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([27, 79, 100]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([27, 79, 100]), + }, }, ), ( "campfire", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 88, 54]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 88, 54]), + }, }, ), ( "candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "carrots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([81, 124, 37]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([81, 124, 37]), + }, }, ), ( "cartography_table", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([103, 87, 67]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([103, 87, 67]), + }, }, ), ( "carved_pumpkin", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([198, 118, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([198, 118, 24]), + }, }, ), ( "cauldron", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([73, 72, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([73, 72, 74]), + }, }, ), ( "cave_air", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cave_vines", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([90, 109, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([90, 109, 40]), + }, }, ), ( "cave_vines_plant", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([88, 101, 38]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([88, 101, 38]), + }, }, ), ( "chain", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "chain_command_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([131, 161, 147]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([131, 161, 147]), + }, }, ), ( "cherry_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cherry_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 170, 164]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 170, 164]), + }, }, ), ( "cherry_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 178, 172]), + }, }, ), ( "cherry_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 178, 172]), + }, }, ), ( "cherry_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cherry_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([229, 172, 194]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([229, 172, 194]), + }, }, ), ( "cherry_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([185, 141, 137]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([185, 141, 137]), + }, }, ), ( "cherry_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 178, 172]), + }, }, ), ( "cherry_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 178, 172]), + }, }, ), ( "cherry_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cherry_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 178, 172]), + }, }, ), ( "cherry_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 178, 172]), + }, }, ), ( "cherry_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 178, 172]), + }, }, ), ( "cherry_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 178, 172]), + }, }, ), ( "cherry_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cherry_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cherry_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([54, 33, 44]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([54, 33, 44]), + }, }, ), ( "chest", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "chipped_anvil", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 72, 72]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 72, 72]), + }, }, ), ( "chiseled_bookshelf", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([178, 144, 88]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([178, 144, 88]), + }, }, ), ( "chiseled_deepslate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([54, 54, 54]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([54, 54, 54]), + }, }, ), ( "chiseled_nether_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([47, 23, 28]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([47, 23, 28]), + }, }, ), ( "chiseled_polished_blackstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 48, 56]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 48, 56]), + }, }, ), ( "chiseled_quartz_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([231, 226, 218]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([231, 226, 218]), + }, }, ), ( "chiseled_red_sandstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "chiseled_sandstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "chiseled_stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([119, 118, 119]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([119, 118, 119]), + }, }, ), ( "chorus_flower", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([151, 120, 151]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([151, 120, 151]), + }, }, ), ( "chorus_plant", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([93, 57, 93]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([93, 57, 93]), + }, }, ), ( "clay", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 166, 179]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 166, 179]), + }, }, ), ( "coal_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([16, 15, 15]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([16, 15, 15]), + }, }, ), ( "coal_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([105, 105, 105]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([105, 105, 105]), + }, }, ), ( "coarse_dirt", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([119, 85, 59]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([119, 85, 59]), + }, }, ), ( "cobbled_deepslate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([77, 77, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([77, 77, 80]), + }, }, ), ( "cobbled_deepslate_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([77, 77, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([77, 77, 80]), + }, }, ), ( "cobbled_deepslate_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([77, 77, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([77, 77, 80]), + }, }, ), ( "cobbled_deepslate_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([77, 77, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([77, 77, 80]), + }, }, ), ( "cobblestone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 127, 127]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 127, 127]), + }, }, ), ( "cobblestone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 127, 127]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 127, 127]), + }, }, ), ( "cobblestone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 127, 127]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 127, 127]), + }, }, ), ( "cobblestone_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 127, 127]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 127, 127]), + }, }, ), ( "cobweb", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([228, 233, 234]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([228, 233, 234]), + }, }, ), ( "cocoa", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 91, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 91, 40]), + }, }, ), ( "command_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 136, 108]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 136, 108]), + }, }, ), ( "comparator", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([166, 161, 159]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([166, 161, 159]), + }, }, ), ( "composter", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([88, 61, 23]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([88, 61, 23]), + }, }, ), ( "conduit", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([159, 139, 113]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([159, 139, 113]), + }, }, ), ( "copper_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 107, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 107, 79]), + }, }, ), ( "copper_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([124, 125, 120]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([124, 125, 120]), + }, }, ), ( "cornflower", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cracked_deepslate_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([64, 64, 65]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([64, 64, 65]), + }, }, ), ( "cracked_deepslate_tiles", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([52, 52, 52]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([52, 52, 52]), + }, }, ), ( "cracked_nether_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([40, 20, 23]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([40, 20, 23]), + }, }, ), ( "cracked_polished_blackstone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 37, 43]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 37, 43]), + }, }, ), ( "cracked_stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([118, 117, 118]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([118, 117, 118]), + }, }, ), ( "crafting_table", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([119, 73, 42]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([119, 73, 42]), + }, }, ), ( "creeper_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "creeper_wall_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "crimson_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "crimson_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 54, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 54, 79]), + }, }, ), ( "crimson_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 48, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 48, 70]), + }, }, ), ( "crimson_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 48, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 48, 70]), + }, }, ), ( "crimson_fungus", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "crimson_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "crimson_hyphae", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([92, 25, 29]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([92, 25, 29]), + }, }, ), ( "crimson_nylium", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([130, 31, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([130, 31, 31]), + }, }, ), ( "crimson_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 48, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 48, 70]), + }, }, ), ( "crimson_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 48, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 48, 70]), + }, }, ), ( "crimson_roots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([126, 8, 41]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([126, 8, 41]), + }, }, ), ( "crimson_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 48, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 48, 70]), + }, }, ), ( "crimson_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 48, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 48, 70]), + }, }, ), ( "crimson_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 48, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 48, 70]), + }, }, ), ( "crimson_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([112, 49, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([112, 49, 70]), + }, }, ), ( "crimson_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([103, 50, 72]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([103, 50, 72]), + }, }, ), ( "crimson_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "crimson_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "crying_obsidian", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([32, 10, 60]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([32, 10, 60]), + }, }, ), ( "cut_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([191, 106, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([191, 106, 80]), + }, }, ), ( "cut_copper_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([191, 106, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([191, 106, 80]), + }, }, ), ( "cut_copper_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([191, 106, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([191, 106, 80]), + }, }, ), ( "cut_red_sandstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "cut_red_sandstone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "cut_sandstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "cut_sandstone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "cyan_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cyan_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cyan_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cyan_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "cyan_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([21, 137, 145]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([21, 137, 145]), + }, }, ), ( "cyan_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([21, 119, 136]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([21, 119, 136]), + }, }, ), ( "cyan_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([36, 147, 157]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([36, 147, 157]), + }, }, ), ( "cyan_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([52, 118, 125]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([52, 118, 125]), + }, }, ), ( "cyan_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([20, 121, 135]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([20, 121, 135]), + }, }, ), ( "cyan_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([76, 127, 153]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([76, 127, 153]), + }, }, ), ( "cyan_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([73, 122, 147]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([73, 122, 147]), + }, }, ), ( "cyan_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([86, 91, 91]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([86, 91, 91]), + }, }, ), ( "cyan_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "cyan_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([21, 137, 145]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([21, 137, 145]), + }, }, ), ( "damaged_anvil", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 72, 72]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 72, 72]), + }, }, ), ( "dandelion", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dark_oak_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dark_oak_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([76, 51, 25]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([76, 51, 25]), + }, }, ), ( "dark_oak_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 43, 20]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([66, 43, 20]), + }, }, ), ( "dark_oak_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 43, 20]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([66, 43, 20]), + }, }, ), ( "dark_oak_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dark_oak_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), - color: Color([150, 150, 150]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), + color: Color([150, 150, 150]), + }, }, ), ( "dark_oak_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([67, 45, 22]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([67, 45, 22]), + }, }, ), ( "dark_oak_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 43, 20]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([66, 43, 20]), + }, }, ), ( "dark_oak_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 43, 20]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([66, 43, 20]), + }, }, ), ( "dark_oak_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([61, 90, 30]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([61, 90, 30]), + }, }, ), ( "dark_oak_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 43, 20]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([66, 43, 20]), + }, }, ), ( "dark_oak_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 43, 20]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([66, 43, 20]), + }, }, ), ( "dark_oak_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 43, 20]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([66, 43, 20]), + }, }, ), ( "dark_oak_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([75, 49, 23]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([75, 49, 23]), + }, }, ), ( "dark_oak_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dark_oak_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dark_oak_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([60, 46, 26]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([60, 46, 26]), + }, }, ), ( "dark_prismarine", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([51, 91, 75]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([51, 91, 75]), + }, }, ), ( "dark_prismarine_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([51, 91, 75]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([51, 91, 75]), + }, }, ), ( "dark_prismarine_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([51, 91, 75]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([51, 91, 75]), + }, }, ), ( "daylight_detector", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([130, 116, 94]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([130, 116, 94]), + }, }, ), ( "dead_brain_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_brain_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([124, 117, 114]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([124, 117, 114]), + }, }, ), ( "dead_brain_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_brain_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_bubble_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_bubble_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([131, 123, 119]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([131, 123, 119]), + }, }, ), ( "dead_bubble_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_bubble_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_bush", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([107, 78, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([107, 78, 40]), + }, }, ), ( "dead_fire_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_fire_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([131, 123, 119]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([131, 123, 119]), + }, }, ), ( "dead_fire_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_fire_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_horn_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_horn_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([133, 126, 122]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([133, 126, 122]), + }, }, ), ( "dead_horn_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_horn_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_tube_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_tube_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([130, 123, 119]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([130, 123, 119]), + }, }, ), ( "dead_tube_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dead_tube_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "decorated_pot", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([124, 68, 53]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([124, 68, 53]), + }, }, ), ( "deepslate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([80, 80, 82]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([80, 80, 82]), + }, }, ), ( "deepslate_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([70, 70, 71]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([70, 70, 71]), + }, }, ), ( "deepslate_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([70, 70, 71]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([70, 70, 71]), + }, }, ), ( "deepslate_brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([70, 70, 71]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([70, 70, 71]), + }, }, ), ( "deepslate_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([70, 70, 71]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([70, 70, 71]), + }, }, ), ( "deepslate_coal_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([74, 74, 76]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([74, 74, 76]), + }, }, ), ( "deepslate_copper_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([92, 93, 89]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([92, 93, 89]), + }, }, ), ( "deepslate_diamond_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([83, 106, 106]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([83, 106, 106]), + }, }, ), ( "deepslate_emerald_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([78, 104, 87]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([78, 104, 87]), + }, }, ), ( "deepslate_gold_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 102, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 102, 78]), + }, }, ), ( "deepslate_iron_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([106, 99, 94]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([106, 99, 94]), + }, }, ), ( "deepslate_lapis_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 90, 115]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 90, 115]), + }, }, ), ( "deepslate_redstone_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([104, 73, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([104, 73, 74]), + }, }, ), ( "deepslate_tile_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([54, 54, 55]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([54, 54, 55]), + }, }, ), ( "deepslate_tile_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([54, 54, 55]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([54, 54, 55]), + }, }, ), ( "deepslate_tile_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([54, 54, 55]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([54, 54, 55]), + }, }, ), ( "deepslate_tiles", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([54, 54, 55]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([54, 54, 55]), + }, }, ), ( "detector_rail", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([123, 104, 90]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([123, 104, 90]), + }, }, ), ( "diamond_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([98, 237, 228]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([98, 237, 228]), + }, }, ), ( "diamond_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([121, 141, 140]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([121, 141, 140]), + }, }, ), ( "diorite", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([188, 188, 188]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([188, 188, 188]), + }, }, ), ( "diorite_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([188, 188, 188]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([188, 188, 188]), + }, }, ), ( "diorite_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([188, 188, 188]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([188, 188, 188]), + }, }, ), ( "diorite_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([188, 188, 188]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([188, 188, 188]), + }, }, ), ( "dirt", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([134, 96, 67]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([134, 96, 67]), + }, }, ), ( "dirt_path", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([148, 121, 65]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([148, 121, 65]), + }, }, ), ( "dispenser", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 109, 109]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 109, 109]), + }, }, ), ( "dragon_egg", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([12, 9, 15]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([12, 9, 15]), + }, }, ), ( "dragon_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dragon_wall_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "dried_kelp_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([50, 58, 38]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([50, 58, 38]), + }, }, ), ( "dripstone_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([134, 107, 92]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([134, 107, 92]), + }, }, ), ( "dropper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 109, 109]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 109, 109]), + }, }, ), ( "emerald_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([42, 203, 87]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([42, 203, 87]), + }, }, ), ( "emerald_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([108, 136, 115]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([108, 136, 115]), + }, }, ), ( "enchanting_table", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([128, 75, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([128, 75, 85]), + }, }, ), ( "end_gateway", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([15, 10, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([15, 10, 24]), + }, }, ), ( "end_portal", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([15, 10, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([15, 10, 24]), + }, }, ), ( "end_portal_frame", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([91, 120, 97]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([91, 120, 97]), + }, }, ), ( "end_rod", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "end_stone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([219, 222, 158]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([219, 222, 158]), + }, }, ), ( "end_stone_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([218, 224, 162]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([218, 224, 162]), + }, }, ), ( "end_stone_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([218, 224, 162]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([218, 224, 162]), + }, }, ), ( "end_stone_brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([218, 224, 162]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([218, 224, 162]), + }, }, ), ( "end_stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([218, 224, 162]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([218, 224, 162]), + }, }, ), ( "ender_chest", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([15, 10, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([15, 10, 24]), + }, }, ), ( "exposed_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([161, 125, 103]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([161, 125, 103]), + }, }, ), ( "exposed_cut_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 121, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 121, 101]), + }, }, ), ( "exposed_cut_copper_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 121, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 121, 101]), + }, }, ), ( "exposed_cut_copper_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 121, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 121, 101]), + }, }, ), ( "farmland", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([81, 44, 15]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([81, 44, 15]), + }, }, ), ( "fern", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "fire", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([211, 140, 53]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([211, 140, 53]), + }, }, ), ( "fire_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "fire_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([163, 35, 46]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([163, 35, 46]), + }, }, ), ( "fire_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "fire_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "fletching_table", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([197, 180, 133]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([197, 180, 133]), + }, }, ), ( "flower_pot", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([124, 68, 53]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([124, 68, 53]), + }, }, ), ( "flowering_azalea", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([112, 121, 64]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([112, 121, 64]), + }, }, ), ( "flowering_azalea_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 111, 60]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 111, 60]), + }, }, ), ( "frogspawn", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([105, 90, 82]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([105, 90, 82]), + }, }, ), ( "frosted_ice", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([140, 181, 252]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([140, 181, 252]), + }, }, ), ( "furnace", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 109, 109]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 109, 109]), + }, }, ), ( "gilded_blackstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([55, 42, 38]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([55, 42, 38]), + }, }, ), ( "glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([175, 213, 219]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([175, 213, 219]), + }, }, ), ( "glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([170, 210, 217]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([170, 210, 217]), + }, }, ), ( "glow_item_frame", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "glow_lichen", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "glowstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([171, 131, 84]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([171, 131, 84]), + }, }, ), ( "gold_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([246, 208, 61]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([246, 208, 61]), + }, }, ), ( "gold_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([145, 133, 106]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([145, 133, 106]), + }, }, ), ( "granite", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([149, 103, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([149, 103, 85]), + }, }, ), ( "granite_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([149, 103, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([149, 103, 85]), + }, }, ), ( "granite_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([149, 103, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([149, 103, 85]), + }, }, ), ( "granite_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([149, 103, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([149, 103, 85]), + }, }, ), ( "grass", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "grass_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([147, 147, 147]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([147, 147, 147]), + }, }, ), ( "grass_path", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([148, 121, 65]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([148, 121, 65]), + }, }, ), ( "gravel", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([131, 127, 126]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([131, 127, 126]), + }, }, ), ( "gray_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "gray_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "gray_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "gray_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "gray_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([62, 68, 71]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([62, 68, 71]), + }, }, ), ( "gray_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([54, 57, 61]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([54, 57, 61]), + }, }, ), ( "gray_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([76, 81, 84]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([76, 81, 84]), + }, }, ), ( "gray_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([83, 90, 93]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([83, 90, 93]), + }, }, ), ( "gray_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([55, 58, 62]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([55, 58, 62]), + }, }, ), ( "gray_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([76, 76, 76]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([76, 76, 76]), + }, }, ), ( "gray_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([73, 73, 73]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([73, 73, 73]), + }, }, ), ( "gray_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([57, 42, 35]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([57, 42, 35]), + }, }, ), ( "gray_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "gray_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([62, 68, 71]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([62, 68, 71]), + }, }, ), ( "green_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "green_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "green_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "green_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "green_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([84, 109, 27]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([84, 109, 27]), + }, }, ), ( "green_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([73, 91, 36]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([73, 91, 36]), + }, }, ), ( "green_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([97, 119, 44]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([97, 119, 44]), + }, }, ), ( "green_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 142, 67]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 142, 67]), + }, }, ), ( "green_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 100, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 100, 31]), + }, }, ), ( "green_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([102, 127, 51]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([102, 127, 51]), + }, }, ), ( "green_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([97, 122, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([97, 122, 48]), + }, }, ), ( "green_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([76, 83, 42]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([76, 83, 42]), + }, }, ), ( "green_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "green_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([84, 109, 27]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([84, 109, 27]), + }, }, ), ( "grindstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([142, 142, 142]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([142, 142, 142]), + }, }, ), ( "hanging_roots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([161, 115, 91]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([161, 115, 91]), + }, }, ), ( "hay_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([165, 139, 12]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([165, 139, 12]), + }, }, ), ( "heavy_weighted_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([220, 220, 220]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([220, 220, 220]), + }, }, ), ( "honey_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([251, 185, 52]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([251, 185, 52]), + }, }, ), ( "honeycomb_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([229, 148, 29]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([229, 148, 29]), + }, }, ), ( "hopper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([75, 74, 75]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([75, 74, 75]), + }, }, ), ( "horn_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "horn_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([216, 199, 66]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([216, 199, 66]), + }, }, ), ( "horn_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "horn_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "ice", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([145, 183, 253]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([145, 183, 253]), + }, }, ), ( "infested_chiseled_stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([119, 118, 119]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([119, 118, 119]), + }, }, ), ( "infested_cobblestone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 127, 127]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 127, 127]), + }, }, ), ( "infested_cracked_stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([118, 117, 118]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([118, 117, 118]), + }, }, ), ( "infested_deepslate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([80, 80, 82]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([80, 80, 82]), + }, }, ), ( "infested_mossy_stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 121, 105]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 121, 105]), + }, }, ), ( "infested_stone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 125, 125]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 125, 125]), + }, }, ), ( "infested_stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 121, 122]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 121, 122]), + }, }, ), ( "iron_bars", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([136, 139, 135]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([136, 139, 135]), + }, }, ), ( "iron_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([220, 220, 220]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([220, 220, 220]), + }, }, ), ( "iron_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([194, 193, 193]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([194, 193, 193]), + }, }, ), ( "iron_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([136, 129, 122]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([136, 129, 122]), + }, }, ), ( "iron_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([202, 202, 202]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([202, 202, 202]), + }, }, ), ( "item_frame", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "jack_o_lantern", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([214, 152, 52]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([214, 152, 52]), + }, }, ), ( "jigsaw", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([80, 69, 81]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([80, 69, 81]), + }, }, ), ( "jukebox", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([93, 64, 47]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([93, 64, 47]), + }, }, ), ( "jungle_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "jungle_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([163, 119, 84]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([163, 119, 84]), + }, }, ), ( "jungle_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 115, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 115, 80]), + }, }, ), ( "jungle_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 115, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 115, 80]), + }, }, ), ( "jungle_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "jungle_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), - color: Color([156, 154, 143]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), + color: Color([156, 154, 143]), + }, }, ), ( "jungle_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([149, 109, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([149, 109, 70]), + }, }, ), ( "jungle_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 115, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 115, 80]), + }, }, ), ( "jungle_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 115, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 115, 80]), + }, }, ), ( "jungle_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([47, 81, 16]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([47, 81, 16]), + }, }, ), ( "jungle_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 115, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 115, 80]), + }, }, ), ( "jungle_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 115, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 115, 80]), + }, }, ), ( "jungle_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 115, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 115, 80]), + }, }, ), ( "jungle_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([152, 110, 77]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([152, 110, 77]), + }, }, ), ( "jungle_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "jungle_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "jungle_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([85, 67, 25]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([85, 67, 25]), + }, }, ), ( "kelp", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "kelp_plant", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([86, 130, 42]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([86, 130, 42]), + }, }, ), ( "ladder", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "lantern", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([106, 91, 83]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([106, 91, 83]), + }, }, ), ( "lapis_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([30, 67, 140]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([30, 67, 140]), + }, }, ), ( "lapis_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([107, 117, 141]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([107, 117, 141]), + }, }, ), ( "large_amethyst_bud", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "large_fern", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([125, 125, 125]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([125, 125, 125]), + }, }, ), ( "lava", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([212, 90, 18]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([212, 90, 18]), + }, }, ), ( "lava_cauldron", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([73, 72, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([73, 72, 74]), + }, }, ), ( "lectern", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([173, 137, 83]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([173, 137, 83]), + }, }, ), ( "lever", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_blue_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_blue_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_blue_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_blue_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "light_blue_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([58, 175, 217]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([58, 175, 217]), + }, }, ), ( "light_blue_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([35, 137, 198]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([35, 137, 198]), + }, }, ), ( "light_blue_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([74, 180, 213]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([74, 180, 213]), + }, }, ), ( "light_blue_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([94, 164, 208]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([94, 164, 208]), + }, }, ), ( "light_blue_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([49, 163, 212]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([49, 163, 212]), + }, }, ), ( "light_blue_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([102, 153, 216]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([102, 153, 216]), + }, }, ), ( "light_blue_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([97, 147, 208]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([97, 147, 208]), + }, }, ), ( "light_blue_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([113, 108, 137]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([113, 108, 137]), + }, }, ), ( "light_blue_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_blue_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([58, 175, 217]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([58, 175, 217]), + }, }, ), ( "light_gray_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_gray_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_gray_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_gray_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "light_gray_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([142, 142, 134]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([142, 142, 134]), + }, }, ), ( "light_gray_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 125, 115]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 125, 115]), + }, }, ), ( "light_gray_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 154, 148]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 154, 148]), + }, }, ), ( "light_gray_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([144, 166, 167]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([144, 166, 167]), + }, }, ), ( "light_gray_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([124, 124, 115]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([124, 124, 115]), + }, }, ), ( "light_gray_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([153, 153, 153]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([153, 153, 153]), + }, }, ), ( "light_gray_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([147, 147, 147]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([147, 147, 147]), + }, }, ), ( "light_gray_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([135, 106, 97]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([135, 106, 97]), + }, }, ), ( "light_gray_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "light_gray_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([142, 142, 134]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([142, 142, 134]), + }, }, ), ( "light_weighted_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([246, 208, 61]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([246, 208, 61]), + }, }, ), ( "lightning_rod", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "lilac", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 125, 147]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 125, 147]), + }, }, ), ( "lily_of_the_valley", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "lily_pad", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([133, 133, 133]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([133, 133, 133]), + }, }, ), ( "lime_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "lime_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "lime_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "lime_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "lime_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([112, 185, 25]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([112, 185, 25]), + }, }, ), ( "lime_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([94, 168, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([94, 168, 24]), + }, }, ), ( "lime_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 189, 41]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 189, 41]), + }, }, ), ( "lime_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 197, 55]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 197, 55]), + }, }, ), ( "lime_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 172, 23]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 172, 23]), + }, }, ), ( "lime_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 204, 25]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 204, 25]), + }, }, ), ( "lime_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 196, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 196, 24]), + }, }, ), ( "lime_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([103, 117, 52]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([103, 117, 52]), + }, }, ), ( "lime_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "lime_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([112, 185, 25]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([112, 185, 25]), + }, }, ), ( "lodestone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([147, 149, 152]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([147, 149, 152]), + }, }, ), ( "loom", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([142, 119, 91]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([142, 119, 91]), + }, }, ), ( "magenta_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "magenta_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "magenta_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "magenta_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "magenta_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([189, 68, 179]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([189, 68, 179]), + }, }, ), ( "magenta_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([169, 48, 159]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([169, 48, 159]), + }, }, ), ( "magenta_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 83, 184]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 83, 184]), + }, }, ), ( "magenta_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([208, 100, 191]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([208, 100, 191]), + }, }, ), ( "magenta_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([173, 54, 163]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([173, 54, 163]), + }, }, ), ( "magenta_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([178, 76, 216]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([178, 76, 216]), + }, }, ), ( "magenta_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([171, 73, 208]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([171, 73, 208]), + }, }, ), ( "magenta_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([149, 88, 108]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([149, 88, 108]), + }, }, ), ( "magenta_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "magenta_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([189, 68, 179]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([189, 68, 179]), + }, }, ), ( "magma_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([142, 63, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([142, 63, 31]), + }, }, ), ( "mangrove_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "mangrove_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([112, 48, 46]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([112, 48, 46]), + }, }, ), ( "mangrove_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 54, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 54, 48]), + }, }, ), ( "mangrove_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 54, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 54, 48]), + }, }, ), ( "mangrove_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "mangrove_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), - color: Color([129, 128, 128]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), + color: Color([129, 128, 128]), + }, }, ), ( "mangrove_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([102, 48, 42]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([102, 48, 42]), + }, }, ), ( "mangrove_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 54, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 54, 48]), + }, }, ), ( "mangrove_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 54, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 54, 48]), + }, }, ), ( "mangrove_propagule", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([96, 174, 83]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([96, 174, 83]), + }, }, ), ( "mangrove_roots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([74, 59, 38]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([74, 59, 38]), + }, }, ), ( "mangrove_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 54, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 54, 48]), + }, }, ), ( "mangrove_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 54, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 54, 48]), + }, }, ), ( "mangrove_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 54, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 54, 48]), + }, }, ), ( "mangrove_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 46, 42]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 46, 42]), + }, }, ), ( "mangrove_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "mangrove_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "mangrove_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([83, 66, 41]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([83, 66, 41]), + }, }, ), ( "medium_amethyst_bud", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "melon", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([111, 144, 30]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([111, 144, 30]), + }, }, ), ( "melon_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([153, 153, 153]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([153, 153, 153]), + }, }, ), ( "moss_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([89, 109, 45]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([89, 109, 45]), + }, }, ), ( "moss_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([89, 109, 45]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([89, 109, 45]), + }, }, ), ( "mossy_cobblestone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 118, 94]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 118, 94]), + }, }, ), ( "mossy_cobblestone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 118, 94]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 118, 94]), + }, }, ), ( "mossy_cobblestone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 118, 94]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 118, 94]), + }, }, ), ( "mossy_cobblestone_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([110, 118, 94]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([110, 118, 94]), + }, }, ), ( "mossy_stone_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 121, 105]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 121, 105]), + }, }, ), ( "mossy_stone_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 121, 105]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 121, 105]), + }, }, ), ( "mossy_stone_brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 121, 105]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 121, 105]), + }, }, ), ( "mossy_stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 121, 105]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 121, 105]), + }, }, ), ( "moving_piston", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "mud", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([60, 57, 60]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([60, 57, 60]), + }, }, ), ( "mud_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([137, 103, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([137, 103, 79]), + }, }, ), ( "mud_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([137, 103, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([137, 103, 79]), + }, }, ), ( "mud_brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([137, 103, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([137, 103, 79]), + }, }, ), ( "mud_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([137, 103, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([137, 103, 79]), + }, }, ), ( "muddy_mangrove_roots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([70, 58, 45]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([70, 58, 45]), + }, }, ), ( "mushroom_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([203, 196, 185]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([203, 196, 185]), + }, }, ), ( "mycelium", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([111, 98, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([111, 98, 101]), + }, }, ), ( "nether_brick_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 21, 26]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 21, 26]), + }, }, ), ( "nether_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 21, 26]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 21, 26]), + }, }, ), ( "nether_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 21, 26]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 21, 26]), + }, }, ), ( "nether_brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 21, 26]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 21, 26]), + }, }, ), ( "nether_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 21, 26]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 21, 26]), + }, }, ), ( "nether_gold_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 54, 42]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 54, 42]), + }, }, ), ( "nether_portal", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([89, 11, 192]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([89, 11, 192]), + }, }, ), ( "nether_quartz_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 65, 62]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([117, 65, 62]), + }, }, ), ( "nether_sprouts", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([19, 151, 133]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([19, 151, 133]), + }, }, ), ( "nether_wart", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([111, 18, 19]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([111, 18, 19]), + }, }, ), ( "nether_wart_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 2, 2]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 2, 2]), + }, }, ), ( "netherite_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 61, 63]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([66, 61, 63]), + }, }, ), ( "netherrack", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([97, 38, 38]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([97, 38, 38]), + }, }, ), ( "note_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([88, 58, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([88, 58, 40]), + }, }, ), ( "oak_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "oak_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([140, 110, 66]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([140, 110, 66]), + }, }, ), ( "oak_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "oak_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "oak_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "oak_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), - color: Color([144, 144, 144]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), + color: Color([144, 144, 144]), + }, }, ), ( "oak_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([151, 121, 73]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([151, 121, 73]), + }, }, ), ( "oak_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "oak_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "oak_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([77, 106, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([77, 106, 40]), + }, }, ), ( "oak_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "oak_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "oak_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "oak_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([124, 99, 56]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([124, 99, 56]), + }, }, ), ( "oak_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "oak_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "oak_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 85, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 85, 50]), + }, }, ), ( "observer", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([98, 98, 98]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([98, 98, 98]), + }, }, ), ( "obsidian", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([15, 10, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([15, 10, 24]), + }, }, ), ( "ochre_froglight", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([250, 245, 206]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([250, 245, 206]), + }, }, ), ( "orange_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "orange_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "orange_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "orange_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "orange_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([240, 118, 19]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([240, 118, 19]), + }, }, ), ( "orange_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([224, 97, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([224, 97, 0]), + }, }, ), ( "orange_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([227, 131, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([227, 131, 31]), + }, }, ), ( "orange_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 147, 91]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 147, 91]), + }, }, ), ( "orange_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([234, 106, 8]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([234, 106, 8]), + }, }, ), ( "orange_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([216, 127, 51]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([216, 127, 51]), + }, }, ), ( "orange_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([208, 122, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([208, 122, 48]), + }, }, ), ( "orange_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([161, 83, 37]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([161, 83, 37]), + }, }, ), ( "orange_tulip", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "orange_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "orange_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([240, 118, 19]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([240, 118, 19]), + }, }, ), ( "oxeye_daisy", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "oxidized_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([82, 162, 132]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([82, 162, 132]), + }, }, ), ( "oxidized_cut_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 153, 126]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 153, 126]), + }, }, ), ( "oxidized_cut_copper_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 153, 126]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 153, 126]), + }, }, ), ( "oxidized_cut_copper_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 153, 126]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 153, 126]), + }, }, ), ( "packed_ice", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([141, 180, 250]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([141, 180, 250]), + }, }, ), ( "packed_mud", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([142, 106, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([142, 106, 79]), + }, }, ), ( "pearlescent_froglight", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([245, 240, 239]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([245, 240, 239]), + }, }, ), ( "peony", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([129, 126, 139]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([129, 126, 139]), + }, }, ), ( "petrified_oak_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "piglin_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "piglin_wall_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "pink_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "pink_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "pink_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "pink_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "pink_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([237, 141, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([237, 141, 172]), + }, }, ), ( "pink_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([213, 101, 142]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([213, 101, 142]), + }, }, ), ( "pink_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([228, 153, 181]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([228, 153, 181]), + }, }, ), ( "pink_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([235, 154, 181]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([235, 154, 181]), + }, }, ), ( "pink_petals", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "pink_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([230, 121, 157]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([230, 121, 157]), + }, }, ), ( "pink_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([242, 127, 165]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([242, 127, 165]), + }, }, ), ( "pink_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([233, 122, 159]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([233, 122, 159]), + }, }, ), ( "pink_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([161, 78, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([161, 78, 78]), + }, }, ), ( "pink_tulip", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "pink_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "pink_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([237, 141, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([237, 141, 172]), + }, }, ), ( "piston", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 104, 96]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 104, 96]), + }, }, ), ( "piston_head", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([153, 127, 85]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([153, 127, 85]), + }, }, ), ( "pitcher_crop", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 165, 103]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([193, 165, 103]), + }, }, ), ( "pitcher_plant", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 144, 189]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 144, 189]), + }, }, ), ( "player_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "player_wall_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "podzol", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([91, 63, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([91, 63, 24]), + }, }, ), ( "pointed_dripstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([129, 102, 89]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([129, 102, 89]), + }, }, ), ( "polished_andesite", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([132, 134, 133]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([132, 134, 133]), + }, }, ), ( "polished_andesite_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([132, 134, 133]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([132, 134, 133]), + }, }, ), ( "polished_andesite_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([132, 134, 133]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([132, 134, 133]), + }, }, ), ( "polished_basalt", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 98, 100]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 98, 100]), + }, }, ), ( "polished_blackstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 48, 56]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 48, 56]), + }, }, ), ( "polished_blackstone_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([48, 42, 49]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([48, 42, 49]), + }, }, ), ( "polished_blackstone_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([48, 42, 49]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([48, 42, 49]), + }, }, ), ( "polished_blackstone_brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([48, 42, 49]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([48, 42, 49]), + }, }, ), ( "polished_blackstone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([48, 42, 49]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([48, 42, 49]), + }, }, ), ( "polished_blackstone_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "polished_blackstone_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 48, 56]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 48, 56]), + }, }, ), ( "polished_blackstone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 48, 56]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 48, 56]), + }, }, ), ( "polished_blackstone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 48, 56]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 48, 56]), + }, }, ), ( "polished_blackstone_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 48, 56]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 48, 56]), + }, }, ), ( "polished_deepslate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 72, 73]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 72, 73]), + }, }, ), ( "polished_deepslate_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 72, 73]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 72, 73]), + }, }, ), ( "polished_deepslate_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 72, 73]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 72, 73]), + }, }, ), ( "polished_deepslate_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 72, 73]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 72, 73]), + }, }, ), ( "polished_diorite", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 193, 194]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 193, 194]), + }, }, ), ( "polished_diorite_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 193, 194]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 193, 194]), + }, }, ), ( "polished_diorite_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 193, 194]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 193, 194]), + }, }, ), ( "polished_granite", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 106, 89]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 106, 89]), + }, }, ), ( "polished_granite_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 106, 89]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 106, 89]), + }, }, ), ( "polished_granite_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 106, 89]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 106, 89]), + }, }, ), ( "poppy", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "potatoes", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([84, 135, 47]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([84, 135, 47]), + }, }, ), ( "potted_acacia_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([118, 117, 23]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([118, 117, 23]), + }, }, ), ( "potted_allium", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([158, 137, 183]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([158, 137, 183]), + }, }, ), ( "potted_azalea_bush", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 124, 47]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([101, 124, 47]), + }, }, ), ( "potted_azure_bluet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([169, 204, 127]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([169, 204, 127]), + }, }, ), ( "potted_bamboo", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([93, 144, 19]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([93, 144, 19]), + }, }, ), ( "potted_birch_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 160, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 160, 79]), + }, }, ), ( "potted_blue_orchid", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([47, 162, 168]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([47, 162, 168]), + }, }, ), ( "potted_brown_mushroom", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([153, 116, 92]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([153, 116, 92]), + }, }, ), ( "potted_cactus", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([85, 127, 43]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([85, 127, 43]), + }, }, ), ( "potted_cherry_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([164, 117, 143]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([164, 117, 143]), + }, }, ), ( "potted_cornflower", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 121, 146]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 121, 146]), + }, }, ), ( "potted_crimson_fungus", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([141, 44, 29]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([141, 44, 29]), + }, }, ), ( "potted_crimson_roots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 8, 41]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 8, 41]), + }, }, ), ( "potted_dandelion", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([147, 172, 43]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([147, 172, 43]), + }, }, ), ( "potted_dark_oak_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([61, 90, 30]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([61, 90, 30]), + }, }, ), ( "potted_dead_bush", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([107, 78, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([107, 78, 40]), + }, }, ), ( "potted_fern", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([124, 124, 124]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([124, 124, 124]), + }, }, ), ( "potted_flowering_azalea_bush", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([112, 121, 64]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([112, 121, 64]), + }, }, ), ( "potted_jungle_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([47, 81, 16]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([47, 81, 16]), + }, }, ), ( "potted_lily_of_the_valley", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([123, 174, 95]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([123, 174, 95]), + }, }, ), ( "potted_mangrove_propagule", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([96, 174, 83]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([96, 174, 83]), + }, }, ), ( "potted_oak_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([77, 106, 40]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([77, 106, 40]), + }, }, ), ( "potted_orange_tulip", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([93, 142, 30]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([93, 142, 30]), + }, }, ), ( "potted_oxeye_daisy", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([179, 202, 143]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([179, 202, 143]), + }, }, ), ( "potted_pink_tulip", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 157, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 157, 78]), + }, }, ), ( "potted_poppy", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([128, 64, 37]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([128, 64, 37]), + }, }, ), ( "potted_red_mushroom", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([216, 75, 67]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([216, 75, 67]), + }, }, ), ( "potted_red_tulip", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([89, 128, 32]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([89, 128, 32]), + }, }, ), ( "potted_spruce_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 60, 36]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 60, 36]), + }, }, ), ( "potted_torchflower", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([100, 101, 77]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([100, 101, 77]), + }, }, ), ( "potted_warped_fungus", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([74, 109, 87]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([74, 109, 87]), + }, }, ), ( "potted_warped_roots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([20, 136, 123]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([20, 136, 123]), + }, }, ), ( "potted_white_tulip", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([93, 164, 71]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([93, 164, 71]), + }, }, ), ( "potted_wither_rose", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([41, 44, 23]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([41, 44, 23]), + }, }, ), ( "powder_snow", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 253, 253]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 253, 253]), + }, }, ), ( "powder_snow_cauldron", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([73, 72, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([73, 72, 74]), + }, }, ), ( "powered_rail", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([137, 109, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([137, 109, 74]), + }, }, ), ( "prismarine", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 156, 151]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 156, 151]), + }, }, ), ( "prismarine_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 171, 158]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 171, 158]), + }, }, ), ( "prismarine_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 171, 158]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 171, 158]), + }, }, ), ( "prismarine_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 171, 158]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 171, 158]), + }, }, ), ( "prismarine_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 156, 151]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 156, 151]), + }, }, ), ( "prismarine_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 156, 151]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 156, 151]), + }, }, ), ( "prismarine_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([99, 156, 151]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([99, 156, 151]), + }, }, ), ( "pumpkin", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([198, 118, 24]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([198, 118, 24]), + }, }, ), ( "pumpkin_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([154, 154, 154]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([154, 154, 154]), + }, }, ), ( "purple_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "purple_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "purple_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "purple_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "purple_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([121, 42, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([121, 42, 172]), + }, }, ), ( "purple_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([100, 31, 156]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([100, 31, 156]), + }, }, ), ( "purple_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([131, 55, 177]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([131, 55, 177]), + }, }, ), ( "purple_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 47, 152]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 47, 152]), + }, }, ), ( "purple_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([103, 32, 156]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([103, 32, 156]), + }, }, ), ( "purple_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([127, 63, 178]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([127, 63, 178]), + }, }, ), ( "purple_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 61, 171]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 61, 171]), + }, }, ), ( "purple_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([118, 70, 86]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([118, 70, 86]), + }, }, ), ( "purple_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "purple_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([121, 42, 172]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([121, 42, 172]), + }, }, ), ( "purpur_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([169, 125, 169]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([169, 125, 169]), + }, }, ), ( "purpur_pillar", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([171, 129, 171]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([171, 129, 171]), + }, }, ), ( "purpur_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([169, 125, 169]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([169, 125, 169]), + }, }, ), ( "purpur_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([169, 125, 169]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([169, 125, 169]), + }, }, ), ( "quartz_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([235, 229, 222]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([235, 229, 222]), + }, }, ), ( "quartz_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([234, 229, 221]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([234, 229, 221]), + }, }, ), ( "quartz_pillar", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([235, 230, 224]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([235, 230, 224]), + }, }, ), ( "quartz_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([235, 229, 222]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([235, 229, 222]), + }, }, ), ( "quartz_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([235, 229, 222]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([235, 229, 222]), + }, }, ), ( "rail", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 111, 88]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 111, 88]), + }, }, ), ( "raw_copper_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 105, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 105, 79]), + }, }, ), ( "raw_gold_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([221, 169, 46]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([221, 169, 46]), + }, }, ), ( "raw_iron_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([166, 135, 107]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([166, 135, 107]), + }, }, ), ( "red_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "red_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "red_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "red_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "red_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 39, 34]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 39, 34]), + }, }, ), ( "red_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([142, 32, 32]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([142, 32, 32]), + }, }, ), ( "red_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 54, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([168, 54, 50]), + }, }, ), ( "red_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 59, 53]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 59, 53]), + }, }, ), ( "red_mushroom", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "red_mushroom_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([200, 46, 45]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([200, 46, 45]), + }, }, ), ( "red_nether_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([69, 7, 9]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([69, 7, 9]), + }, }, ), ( "red_nether_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([69, 7, 9]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([69, 7, 9]), + }, }, ), ( "red_nether_brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([69, 7, 9]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([69, 7, 9]), + }, }, ), ( "red_nether_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([69, 7, 9]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([69, 7, 9]), + }, }, ), ( "red_sand", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([190, 102, 33]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([190, 102, 33]), + }, }, ), ( "red_sandstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "red_sandstone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "red_sandstone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "red_sandstone_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "red_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([140, 31, 30]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([140, 31, 30]), + }, }, ), ( "red_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([153, 51, 51]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([153, 51, 51]), + }, }, ), ( "red_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([147, 48, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([147, 48, 48]), + }, }, ), ( "red_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([143, 61, 46]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([143, 61, 46]), + }, }, ), ( "red_tulip", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "red_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "red_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 39, 34]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 39, 34]), + }, }, ), ( "redstone_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([175, 24, 5]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([175, 24, 5]), + }, }, ), ( "redstone_lamp", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([95, 54, 30]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([95, 54, 30]), + }, }, ), ( "redstone_ore", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([140, 109, 109]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([140, 109, 109]), + }, }, ), ( "redstone_torch", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "redstone_wall_torch", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "redstone_wire", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([175, 24, 5]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([175, 24, 5]), + }, }, ), ( "reinforced_deepslate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([80, 82, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([80, 82, 78]), + }, }, ), ( "repeater", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 157, 156]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 157, 156]), + }, }, ), ( "repeating_command_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([129, 111, 176]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([129, 111, 176]), + }, }, ), ( "respawn_anchor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([75, 26, 144]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([75, 26, 144]), + }, }, ), ( "rooted_dirt", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([144, 103, 76]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([144, 103, 76]), + }, }, ), ( "rose_bush", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([131, 66, 37]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([131, 66, 37]), + }, }, ), ( "sand", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([219, 207, 163]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([219, 207, 163]), + }, }, ), ( "sandstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "sandstone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "sandstone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "sandstone_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "scaffolding", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([170, 131, 73]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([170, 131, 73]), + }, }, ), ( "sculk", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([12, 29, 36]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([12, 29, 36]), + }, }, ), ( "sculk_catalyst", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([15, 31, 38]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([15, 31, 38]), + }, }, ), ( "sculk_sensor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([7, 70, 84]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([7, 70, 84]), + }, }, ), ( "sculk_shrieker", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([198, 205, 169]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([198, 205, 169]), + }, }, ), ( "sculk_vein", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([7, 48, 57]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([7, 48, 57]), + }, }, ), ( "sea_lantern", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([172, 199, 190]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([172, 199, 190]), + }, }, ), ( "sea_pickle", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([90, 97, 39]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([90, 97, 39]), + }, }, ), ( "seagrass", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( @@ -5704,1366 +7330,1756 @@ pub const BLOCK_TYPES: &[(&str, BlockType)] = &[ ( "shroomlight", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([240, 146, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([240, 146, 70]), + }, }, ), ( "shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([139, 96, 139]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([139, 96, 139]), + }, }, ), ( "sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "skeleton_skull", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "skeleton_wall_skull", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "slime_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([111, 192, 91]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([111, 192, 91]), + }, }, ), ( "small_amethyst_bud", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "small_dripleaf", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "smithing_table", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([57, 58, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([57, 58, 70]), + }, }, ), ( "smoker", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([85, 83, 81]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([85, 83, 81]), + }, }, ), ( "smooth_basalt", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 72, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 72, 78]), + }, }, ), ( "smooth_quartz", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([235, 229, 222]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([235, 229, 222]), + }, }, ), ( "smooth_quartz_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([235, 229, 222]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([235, 229, 222]), + }, }, ), ( "smooth_quartz_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([235, 229, 222]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([235, 229, 222]), + }, }, ), ( "smooth_red_sandstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "smooth_red_sandstone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "smooth_red_sandstone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([181, 97, 31]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([181, 97, 31]), + }, }, ), ( "smooth_sandstone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "smooth_sandstone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "smooth_sandstone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([223, 214, 170]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([223, 214, 170]), + }, }, ), ( "smooth_stone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([158, 158, 158]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([158, 158, 158]), + }, }, ), ( "smooth_stone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([158, 158, 158]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([158, 158, 158]), + }, }, ), ( "sniffer_egg", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([135, 105, 67]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([135, 105, 67]), + }, }, ), ( "snow", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([249, 254, 254]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([249, 254, 254]), + }, }, ), ( "snow_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([249, 254, 254]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([249, 254, 254]), + }, }, ), ( "soul_campfire", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([80, 204, 208]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([80, 204, 208]), + }, }, ), ( "soul_fire", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([51, 192, 197]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([51, 192, 197]), + }, }, ), ( "soul_lantern", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([71, 99, 114]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([71, 99, 114]), + }, }, ), ( "soul_sand", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([81, 62, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([81, 62, 50]), + }, }, ), ( "soul_soil", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([75, 57, 46]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([75, 57, 46]), + }, }, ), ( "soul_torch", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "soul_wall_torch", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "spawner", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([36, 46, 62]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([36, 46, 62]), + }, }, ), ( "sponge", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([195, 192, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([195, 192, 74]), + }, }, ), ( "spore_blossom", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([206, 96, 158]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([206, 96, 158]), + }, }, ), ( "spruce_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "spruce_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([106, 80, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([106, 80, 48]), + }, }, ), ( "spruce_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 84, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 84, 48]), + }, }, ), ( "spruce_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 84, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 84, 48]), + }, }, ), ( "spruce_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "spruce_leaves", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Spruce}), - color: Color([126, 126, 126]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Spruce}), + color: Color([126, 126, 126]), + }, }, ), ( "spruce_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([108, 80, 46]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([108, 80, 46]), + }, }, ), ( "spruce_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 84, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 84, 48]), + }, }, ), ( "spruce_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 84, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 84, 48]), + }, }, ), ( "spruce_sapling", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 60, 36]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 60, 36]), + }, }, ), ( "spruce_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 84, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 84, 48]), + }, }, ), ( "spruce_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 84, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 84, 48]), + }, }, ), ( "spruce_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 84, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([114, 84, 48]), + }, }, ), ( "spruce_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([103, 79, 47]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([103, 79, 47]), + }, }, ), ( "spruce_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "spruce_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "spruce_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([58, 37, 16]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([58, 37, 16]), + }, }, ), ( "sticky_piston", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 104, 96]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 104, 96]), + }, }, ), ( "stone", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 125, 125]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 125, 125]), + }, }, ), ( "stone_brick_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 121, 122]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 121, 122]), + }, }, ), ( "stone_brick_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 121, 122]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 121, 122]), + }, }, ), ( "stone_brick_wall", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 121, 122]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 121, 122]), + }, }, ), ( "stone_bricks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([122, 121, 122]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([122, 121, 122]), + }, }, ), ( "stone_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "stone_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 125, 125]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 125, 125]), + }, }, ), ( "stone_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 125, 125]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 125, 125]), + }, }, ), ( "stone_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([125, 125, 125]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([125, 125, 125]), + }, }, ), ( "stonecutter", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([123, 118, 111]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([123, 118, 111]), + }, }, ), ( "stripped_acacia_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([166, 91, 51]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([166, 91, 51]), + }, }, ), ( "stripped_acacia_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([174, 92, 59]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([174, 92, 59]), + }, }, ), ( "stripped_bamboo_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([178, 158, 72]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([178, 158, 72]), + }, }, ), ( "stripped_birch_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([191, 171, 116]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([191, 171, 116]), + }, }, ), ( "stripped_birch_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([196, 176, 118]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([196, 176, 118]), + }, }, ), ( "stripped_cherry_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([221, 164, 157]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([221, 164, 157]), + }, }, ), ( "stripped_cherry_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([215, 145, 148]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([215, 145, 148]), + }, }, ), ( "stripped_crimson_hyphae", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([137, 57, 90]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([137, 57, 90]), + }, }, ), ( "stripped_crimson_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([121, 56, 82]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([121, 56, 82]), + }, }, ), ( "stripped_dark_oak_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([65, 44, 22]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([65, 44, 22]), + }, }, ), ( "stripped_dark_oak_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([72, 56, 36]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([72, 56, 36]), + }, }, ), ( "stripped_jungle_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([165, 122, 81]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([165, 122, 81]), + }, }, ), ( "stripped_jungle_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([171, 132, 84]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([171, 132, 84]), + }, }, ), ( "stripped_mangrove_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 43, 43]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 43, 43]), + }, }, ), ( "stripped_mangrove_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([119, 54, 47]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([119, 54, 47]), + }, }, ), ( "stripped_oak_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 129, 77]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([160, 129, 77]), + }, }, ), ( "stripped_oak_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([177, 144, 86]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([177, 144, 86]), + }, }, ), ( "stripped_spruce_log", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([105, 80, 46]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([105, 80, 46]), + }, }, ), ( "stripped_spruce_wood", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([115, 89, 52]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([115, 89, 52]), + }, }, ), ( "stripped_warped_hyphae", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([57, 150, 147]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([57, 150, 147]), + }, }, ), ( "stripped_warped_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([52, 128, 124]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([52, 128, 124]), + }, }, ), ( "structure_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([88, 74, 90]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([88, 74, 90]), + }, }, ), ( "structure_void", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "sugar_cane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([148, 192, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([148, 192, 101]), + }, }, ), ( "sunflower", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([246, 196, 54]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([246, 196, 54]), + }, }, ), ( "suspicious_gravel", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([129, 125, 124]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([129, 125, 124]), + }, }, ), ( "suspicious_sand", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([217, 204, 159]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([217, 204, 159]), + }, }, ), ( "sweet_berry_bush", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([68, 77, 50]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([68, 77, 50]), + }, }, ), ( "tall_grass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([151, 149, 151]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([151, 149, 151]), + }, }, ), ( "tall_seagrass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([59, 139, 14]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([59, 139, 14]), + }, }, ), ( "target", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 170, 157]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([226, 170, 157]), + }, }, ), ( "terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([152, 94, 67]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([152, 94, 67]), + }, }, ), ( "tinted_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 38, 46]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 38, 46]), + }, }, ), ( "tnt", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([142, 62, 53]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([142, 62, 53]), + }, }, ), ( "torch", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "torchflower", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "torchflower_crop", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "trapped_chest", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([162, 130, 78]), + }, }, ), ( "tripwire", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "tripwire_hook", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "tube_coral", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "tube_coral_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([49, 87, 206]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([49, 87, 206]), + }, }, ), ( "tube_coral_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "tube_coral_wall_fan", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "tuff", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([108, 109, 102]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([108, 109, 102]), + }, }, ), ( "turtle_egg", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([228, 226, 191]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([228, 226, 191]), + }, }, ), ( "twisting_vines", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([20, 143, 124]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([20, 143, 124]), + }, }, ), ( "twisting_vines_plant", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([20, 135, 122]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([20, 135, 122]), + }, }, ), ( "verdant_froglight", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([229, 244, 228]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([229, 244, 228]), + }, }, ), ( "vine", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Grass}), - color: Color([116, 116, 116]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Grass}), + color: Color([116, 116, 116]), + }, }, ), ( "void_air", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "wall_torch", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "warped_button", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "warped_door", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([44, 126, 120]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([44, 126, 120]), + }, }, ), ( "warped_fence", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 104, 99]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 104, 99]), + }, }, ), ( "warped_fence_gate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 104, 99]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 104, 99]), + }, }, ), ( "warped_fungus", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "warped_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "warped_hyphae", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([58, 58, 77]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([58, 58, 77]), + }, }, ), ( "warped_nylium", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 114, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 114, 101]), + }, }, ), ( "warped_planks", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 104, 99]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 104, 99]), + }, }, ), ( "warped_pressure_plate", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 104, 99]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 104, 99]), + }, }, ), ( "warped_roots", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([20, 138, 124]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([20, 138, 124]), + }, }, ), ( "warped_sign", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 104, 99]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 104, 99]), + }, }, ), ( "warped_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 104, 99]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 104, 99]), + }, }, ), ( "warped_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 104, 99]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([43, 104, 99]), + }, }, ), ( "warped_stem", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([53, 109, 110]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([53, 109, 110]), + }, }, ), ( "warped_trapdoor", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([47, 119, 111]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([47, 119, 111]), + }, }, ), ( "warped_wall_hanging_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "warped_wall_sign", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "warped_wart_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([22, 119, 121]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([22, 119, 121]), + }, }, ), ( "water", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque|Water}), - color: Color([177, 177, 177]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque|Water}), + color: Color([177, 177, 177]), + }, }, ), ( "water_cauldron", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([73, 72, 74]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([73, 72, 74]), + }, }, ), ( "waxed_copper_block", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 107, 79]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([192, 107, 79]), + }, }, ), ( "waxed_cut_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([191, 106, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([191, 106, 80]), + }, }, ), ( "waxed_cut_copper_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([191, 106, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([191, 106, 80]), + }, }, ), ( "waxed_cut_copper_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([191, 106, 80]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([191, 106, 80]), + }, }, ), ( "waxed_exposed_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([161, 125, 103]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([161, 125, 103]), + }, }, ), ( "waxed_exposed_cut_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 121, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 121, 101]), + }, }, ), ( "waxed_exposed_cut_copper_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 121, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 121, 101]), + }, }, ), ( "waxed_exposed_cut_copper_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([154, 121, 101]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([154, 121, 101]), + }, }, ), ( "waxed_oxidized_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([82, 162, 132]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([82, 162, 132]), + }, }, ), ( "waxed_oxidized_cut_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 153, 126]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 153, 126]), + }, }, ), ( "waxed_oxidized_cut_copper_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 153, 126]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 153, 126]), + }, }, ), ( "waxed_oxidized_cut_copper_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([79, 153, 126]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([79, 153, 126]), + }, }, ), ( "waxed_weathered_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([108, 153, 110]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([108, 153, 110]), + }, }, ), ( "waxed_weathered_cut_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 145, 107]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 145, 107]), + }, }, ), ( "waxed_weathered_cut_copper_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 145, 107]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 145, 107]), + }, }, ), ( "waxed_weathered_cut_copper_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 145, 107]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 145, 107]), + }, }, ), ( "weathered_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([108, 153, 110]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([108, 153, 110]), + }, }, ), ( "weathered_cut_copper", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 145, 107]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 145, 107]), + }, }, ), ( "weathered_cut_copper_slab", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 145, 107]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 145, 107]), + }, }, ), ( "weathered_cut_copper_stairs", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([109, 145, 107]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([109, 145, 107]), + }, }, ), ( "weeping_vines", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([104, 1, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([104, 1, 0]), + }, }, ), ( "weeping_vines_plant", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([132, 16, 12]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([132, 16, 12]), + }, }, ), ( "wet_sponge", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([171, 181, 70]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([171, 181, 70]), + }, }, ), ( "wheat", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([166, 151, 73]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([166, 151, 73]), + }, }, ), ( "white_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "white_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "white_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "white_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "white_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([233, 236, 236]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([233, 236, 236]), + }, }, ), ( "white_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([207, 213, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([207, 213, 214]), + }, }, ), ( "white_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([225, 227, 227]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([225, 227, 227]), + }, }, ), ( "white_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([188, 212, 202]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([188, 212, 202]), + }, }, ), ( "white_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([215, 220, 221]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([215, 220, 221]), + }, }, ), ( "white_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([255, 255, 255]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([255, 255, 255]), + }, }, ), ( "white_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([246, 246, 246]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([246, 246, 246]), + }, }, ), ( "white_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([209, 178, 161]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([209, 178, 161]), + }, }, ), ( "white_tulip", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "white_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "white_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([233, 236, 236]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([233, 236, 236]), + }, }, ), ( "wither_rose", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "wither_skeleton_skull", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "wither_skeleton_wall_skull", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "yellow_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "yellow_bed", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "yellow_candle", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "yellow_candle_cake", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 222, 214]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 222, 214]), + }, }, ), ( "yellow_carpet", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 197, 39]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 197, 39]), + }, }, ), ( "yellow_concrete", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([240, 175, 21]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([240, 175, 21]), + }, }, ), ( "yellow_concrete_powder", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([232, 199, 54]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([232, 199, 54]), + }, }, ), ( "yellow_glazed_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([234, 192, 88]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([234, 192, 88]), + }, }, ), ( "yellow_shulker_box", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 188, 29]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 188, 29]), + }, }, ), ( "yellow_stained_glass", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([229, 229, 51]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([229, 229, 51]), + }, }, ), ( "yellow_stained_glass_pane", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([221, 221, 48]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([221, 221, 48]), + }, }, ), ( "yellow_terracotta", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([186, 133, 35]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([186, 133, 35]), + }, }, ), ( "yellow_wall_banner", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "yellow_wool", BlockType { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([248, 197, 39]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{Opaque}), + color: Color([248, 197, 39]), + }, }, ), ( "zombie_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ( "zombie_wall_head", BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, }, ), ]; diff --git a/crates/resource/src/lib.rs b/crates/resource/src/lib.rs index ad3553f..676b92b 100644 --- a/crates/resource/src/lib.rs +++ b/crates/resource/src/lib.rs @@ -42,21 +42,28 @@ pub type Colorf = glam::Vec3; /// A block type specification #[derive(Debug, Clone, Copy, Serialize, Deserialize)] -pub struct BlockType { +pub struct BlockColor { /// Bit set of [BlockFlag]s describing special properties of the block type pub flags: BitFlags, /// Base color of the block type pub color: Color, } -impl BlockType { - /// Checks whether a block type has a given [BlockFlag] set +impl BlockColor { + /// Checks whether a block color has a given [BlockFlag] set #[inline] pub fn is(&self, flag: BlockFlag) -> bool { self.flags.contains(flag) } } +/// A block type specification +#[derive(Debug, Clone)] +pub struct BlockType { + /// Determines the rendered color of the block type + pub block_color: BlockColor, +} + /// Used to look up standard Minecraft block types #[derive(Debug)] pub struct BlockTypes { @@ -70,10 +77,15 @@ impl Default for BlockTypes { fn default() -> Self { let block_type_map: HashMap<_, _> = block_types::BLOCK_TYPES .iter() - .map(|(k, v)| (String::from(*k), *v)) + .map(|(k, v)| (String::from(*k), v.clone())) .collect(); let legacy_block_types = Box::new(legacy_block_types::LEGACY_BLOCK_TYPES.map(|inner| { - inner.map(|id| *block_type_map.get(id).expect("Unknown legacy block type")) + inner.map(|id| { + block_type_map + .get(id) + .expect("Unknown legacy block type") + .clone() + }) })); BlockTypes { @@ -86,15 +98,15 @@ impl Default for BlockTypes { impl BlockTypes { /// Resolves a Minecraft 1.13+ string block type ID #[inline] - pub fn get(&self, id: &str) -> Option { + pub fn get(&self, id: &str) -> Option<&BlockType> { let suffix = id.strip_prefix("minecraft:")?; - self.block_type_map.get(suffix).copied() + self.block_type_map.get(suffix) } /// Resolves a Minecraft pre-1.13 numeric block type ID #[inline] - pub fn get_legacy(&self, id: u8, data: u8) -> Option { - Some(self.legacy_block_types[id as usize][data as usize]) + pub fn get_legacy(&self, id: u8, data: u8) -> Option<&BlockType> { + Some(&self.legacy_block_types[id as usize][data as usize]) } } diff --git a/resource/generate.py b/resource/generate.py index 73bb91d..2e6cf21 100755 --- a/resource/generate.py +++ b/resource/generate.py @@ -36,11 +36,13 @@ with open(sys.argv[2], 'w') as f: flags.append('Water') flags = 'make_bitflags!(BlockFlag::{' + '|'.join(flags) + '})' - print('\t("%s", BlockType { flags: %s, color: Color([%u, %u, %u]) }),' % ( - name, + print('\t("%s", BlockType { ' % name, file=f) + print('\t\tblock_color: BlockColor { flags: %s, color: Color([%u, %u, %u]) },' % ( flags, info['color']['r'], info['color']['g'], info['color']['b'], ), file=f) + print('}),', file=f) + print('];', file=f) diff --git a/src/world/layer.rs b/src/world/layer.rs index ce88107..576dfa4 100644 --- a/src/world/layer.rs +++ b/src/world/layer.rs @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; use super::chunk::{Chunk, SectionIterItem}; use crate::{ - resource::{Biome, BlockFlag, BlockType}, + resource::{Biome, BlockColor, BlockFlag}, types::*, }; @@ -31,8 +31,8 @@ impl BlockHeight { } } -/// Array optionally storing a [BlockType] for each coordinate of a chunk -pub type BlockArray = LayerBlockArray>; +/// Array optionally storing a [BlockColor] for each coordinate of a chunk +pub type BlockArray = LayerBlockArray>; /// Array optionally storing a biome index for each coordinate of a chunk /// @@ -49,7 +49,7 @@ pub type DepthArray = LayerBlockArray>; /// References to LayerData entries for a single coordinate pair struct LayerEntry<'a> { /// The block type of the referenced entry - block: &'a mut Option, + block: &'a mut Option, /// The biome type of the referenced entry biome: &'a mut Option, /// The block light of the referenced entry @@ -86,7 +86,7 @@ impl<'a> LayerEntry<'a> { let Some(block_type) = section .section .block_at(coords)? - .filter(|block_type| block_type.is(BlockFlag::Opaque)) + .filter(|block_type| block_type.block_color.is(BlockFlag::Opaque)) else { if self.is_empty() { *self.block_light = section.block_light.block_light_at(coords); @@ -96,7 +96,7 @@ impl<'a> LayerEntry<'a> { }; if self.is_empty() { - *self.block = Some(block_type); + *self.block = Some(block_type.block_color); if let Some(biome) = section.biomes.biome_at(section.y, coords)? { let (biome_index, _) = biome_list.insert_full(*biome); *self.biome = NonZeroU16::new( @@ -107,7 +107,7 @@ impl<'a> LayerEntry<'a> { } } - if block_type.is(BlockFlag::Water) { + if block_type.block_color.is(BlockFlag::Water) { return Ok(false); } diff --git a/src/world/section.rs b/src/world/section.rs index 97e0061..62b510b 100644 --- a/src/world/section.rs +++ b/src/world/section.rs @@ -44,7 +44,7 @@ fn palette_bits(len: usize, min: u8, max: u8) -> Option { /// Trait for common functions of [SectionV1_13] and [SectionV0] pub trait Section: Debug { /// Returns the [BlockType] at a coordinate tuple inside the section - fn block_at(&self, coords: SectionBlockCoords) -> Result>; + fn block_at(&self, coords: SectionBlockCoords) -> Result>; } /// Minecraft v1.13+ section block data @@ -53,7 +53,7 @@ pub struct SectionV1_13<'a> { /// Packed block type data block_states: Option<&'a [i64]>, /// List of block types indexed by entries encoded in *block_states* - palette: Vec>, + palette: Vec>, /// Number of bits per block in *block_states* bits: u8, /// Set to true if packed block entries in *block_states* are aligned to i64 @@ -146,7 +146,7 @@ impl<'a> SectionV1_13<'a> { } impl<'a> Section for SectionV1_13<'a> { - fn block_at(&self, coords: SectionBlockCoords) -> Result> { + fn block_at(&self, coords: SectionBlockCoords) -> Result> { let index = self.palette_index_at(coords); Ok(*self .palette @@ -189,7 +189,7 @@ impl<'a> SectionV0<'a> { } impl<'a> Section for SectionV0<'a> { - fn block_at(&self, coords: SectionBlockCoords) -> Result> { + fn block_at(&self, coords: SectionBlockCoords) -> Result> { let offset = coords.offset(); let block = self.blocks[offset] as u8; From abf87e75ee377ba64c32cb19e44b8d7746f51190 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 29 Dec 2023 20:54:26 +0100 Subject: [PATCH 19/43] resource: add sign material to block types --- crates/resource/src/block_types.rs | 3035 ++++++++++++++++++---------- crates/resource/src/lib.rs | 22 +- resource/blocks.json | 182 +- resource/extract.py | 9 +- resource/generate.py | 9 +- 5 files changed, 2207 insertions(+), 1050 deletions(-) diff --git a/crates/resource/src/block_types.rs b/crates/resource/src/block_types.rs index 87d57c8..f9ec70d 100644 --- a/crates/resource/src/block_types.rs +++ b/crates/resource/src/block_types.rs @@ -2,9084 +2,10095 @@ use enumflags2::make_bitflags; use super::*; -pub const BLOCK_TYPES: &[(&str, BlockType)] = &[ +pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ ( "acacia_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "acacia_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([167, 95, 60]), }, + sign_material: None, }, ), ( "acacia_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([168, 90, 50]), }, + sign_material: None, }, ), ( "acacia_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([168, 90, 50]), }, + sign_material: None, }, ), ( "acacia_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("acacia"), }, ), ( "acacia_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), color: Color([149, 148, 148]), }, + sign_material: None, }, ), ( "acacia_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([150, 88, 55]), }, + sign_material: None, }, ), ( "acacia_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([168, 90, 50]), }, + sign_material: None, }, ), ( "acacia_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([168, 90, 50]), }, + sign_material: None, }, ), ( "acacia_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([118, 117, 23]), }, + sign_material: None, }, ), ( "acacia_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([168, 90, 50]), }, + sign_material: Some("acacia"), }, ), ( "acacia_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([168, 90, 50]), }, + sign_material: None, }, ), ( "acacia_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([168, 90, 50]), }, + sign_material: None, }, ), ( "acacia_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([156, 87, 51]), }, + sign_material: None, }, ), ( "acacia_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("acacia"), }, ), ( "acacia_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("acacia"), }, ), ( "acacia_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([103, 96, 86]), }, + sign_material: None, }, ), ( "activator_rail", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 87, 74]), }, + sign_material: None, }, ), ( "air", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "allium", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "amethyst_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([133, 97, 191]), }, + sign_material: None, }, ), ( "amethyst_cluster", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([163, 126, 207]), }, + sign_material: None, }, ), ( "ancient_debris", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([94, 66, 58]), }, + sign_material: None, }, ), ( "andesite", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([136, 136, 136]), }, + sign_material: None, }, ), ( "andesite_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([136, 136, 136]), }, + sign_material: None, }, ), ( "andesite_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([136, 136, 136]), }, + sign_material: None, }, ), ( "andesite_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([136, 136, 136]), }, + sign_material: None, }, ), ( "anvil", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 72, 72]), }, + sign_material: None, }, ), ( "attached_melon_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([141, 142, 141]), }, + sign_material: None, }, ), ( "attached_pumpkin_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([139, 139, 139]), }, + sign_material: None, }, ), ( "azalea", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 124, 47]), }, + sign_material: None, }, ), ( "azalea_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([90, 114, 44]), }, + sign_material: None, }, ), ( "azure_bluet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "bamboo", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([93, 144, 19]), }, + sign_material: None, }, ), ( "bamboo_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([139, 141, 62]), }, + sign_material: None, }, ), ( "bamboo_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "bamboo_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([191, 171, 81]), }, + sign_material: None, }, ), ( "bamboo_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 173, 80]), }, + sign_material: None, }, ), ( "bamboo_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 173, 80]), }, + sign_material: None, }, ), ( "bamboo_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("bamboo"), }, ), ( "bamboo_mosaic", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([190, 170, 78]), }, + sign_material: None, }, ), ( "bamboo_mosaic_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([190, 170, 78]), }, + sign_material: None, }, ), ( "bamboo_mosaic_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([190, 170, 78]), }, + sign_material: None, }, ), ( "bamboo_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 173, 80]), }, + sign_material: None, }, ), ( "bamboo_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 173, 80]), }, + sign_material: None, }, ), ( "bamboo_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "bamboo_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 173, 80]), }, + sign_material: Some("bamboo"), }, ), ( "bamboo_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 173, 80]), }, + sign_material: None, }, ), ( "bamboo_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 173, 80]), }, + sign_material: None, }, ), ( "bamboo_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([198, 179, 85]), }, + sign_material: None, }, ), ( "bamboo_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("bamboo"), }, ), ( "bamboo_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("bamboo"), }, ), ( "barrel", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([134, 100, 58]), }, + sign_material: None, }, ), ( "barrier", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "basalt", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([80, 81, 86]), }, + sign_material: None, }, ), ( "beacon", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 220, 215]), }, + sign_material: None, }, ), ( "bedrock", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([85, 85, 85]), }, + sign_material: None, }, ), ( "bee_nest", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([202, 160, 74]), }, + sign_material: None, }, ), ( "beehive", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([180, 146, 90]), }, + sign_material: None, }, ), ( "beetroots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([93, 91, 30]), }, + sign_material: None, }, ), ( "bell", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([253, 235, 110]), }, + sign_material: None, }, ), ( "big_dripleaf", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([111, 141, 51]), }, + sign_material: None, }, ), ( "big_dripleaf_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "birch_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "birch_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([220, 209, 176]), }, + sign_material: None, }, ), ( "birch_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 175, 121]), }, + sign_material: None, }, ), ( "birch_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 175, 121]), }, + sign_material: None, }, ), ( "birch_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("birch"), }, ), ( "birch_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Birch}), color: Color([130, 129, 130]), }, + sign_material: None, }, ), ( "birch_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 179, 135]), }, + sign_material: None, }, ), ( "birch_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 175, 121]), }, + sign_material: None, }, ), ( "birch_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 175, 121]), }, + sign_material: None, }, ), ( "birch_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 160, 79]), }, + sign_material: None, }, ), ( "birch_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 175, 121]), }, + sign_material: Some("birch"), }, ), ( "birch_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 175, 121]), }, + sign_material: None, }, ), ( "birch_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 175, 121]), }, + sign_material: None, }, ), ( "birch_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([207, 194, 157]), }, + sign_material: None, }, ), ( "birch_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("birch"), }, ), ( "birch_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("birch"), }, ), ( "birch_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([216, 215, 210]), }, + sign_material: None, }, ), ( "black_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "black_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "black_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "black_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "black_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([20, 21, 25]), }, + sign_material: None, }, ), ( "black_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([8, 10, 15]), }, + sign_material: None, }, ), ( "black_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([25, 26, 31]), }, + sign_material: None, }, ), ( "black_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([67, 30, 32]), }, + sign_material: None, }, ), ( "black_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([25, 25, 29]), }, + sign_material: None, }, ), ( "black_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([25, 25, 25]), }, + sign_material: None, }, ), ( "black_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([24, 24, 24]), }, + sign_material: None, }, ), ( "black_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([37, 22, 16]), }, + sign_material: None, }, ), ( "black_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "black_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([20, 21, 25]), }, + sign_material: None, }, ), ( "blackstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([42, 36, 41]), }, + sign_material: None, }, ), ( "blackstone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([42, 36, 41]), }, + sign_material: None, }, ), ( "blackstone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([42, 36, 41]), }, + sign_material: None, }, ), ( "blackstone_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([42, 36, 41]), }, + sign_material: None, }, ), ( "blast_furnace", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([80, 80, 81]), }, + sign_material: None, }, ), ( "blue_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "blue_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "blue_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "blue_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "blue_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 57, 157]), }, + sign_material: None, }, ), ( "blue_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 46, 143]), }, + sign_material: None, }, ), ( "blue_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([70, 73, 166]), }, + sign_material: None, }, ), ( "blue_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([47, 64, 139]), }, + sign_material: None, }, ), ( "blue_ice", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([116, 167, 253]), }, + sign_material: None, }, ), ( "blue_orchid", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "blue_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 45, 140]), }, + sign_material: None, }, ), ( "blue_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([51, 76, 178]), }, + sign_material: None, }, ), ( "blue_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([48, 73, 171]), }, + sign_material: None, }, ), ( "blue_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([74, 59, 91]), }, + sign_material: None, }, ), ( "blue_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "blue_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 57, 157]), }, + sign_material: None, }, ), ( "bone_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([209, 206, 179]), }, + sign_material: None, }, ), ( "bookshelf", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "brain_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "brain_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([207, 91, 159]), }, + sign_material: None, }, ), ( "brain_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "brain_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "brewing_stand", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 100, 80]), }, + sign_material: None, }, ), ( "brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([150, 97, 83]), }, + sign_material: None, }, ), ( "brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([150, 97, 83]), }, + sign_material: None, }, ), ( "brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([150, 97, 83]), }, + sign_material: None, }, ), ( "bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([150, 97, 83]), }, + sign_material: None, }, ), ( "brown_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "brown_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "brown_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "brown_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "brown_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 71, 40]), }, + sign_material: None, }, ), ( "brown_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([96, 59, 31]), }, + sign_material: None, }, ), ( "brown_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 84, 53]), }, + sign_material: None, }, ), ( "brown_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([119, 106, 85]), }, + sign_material: None, }, ), ( "brown_mushroom", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "brown_mushroom_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([149, 111, 81]), }, + sign_material: None, }, ), ( "brown_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([106, 66, 35]), }, + sign_material: None, }, ), ( "brown_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([102, 76, 51]), }, + sign_material: None, }, ), ( "brown_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([97, 73, 48]), }, + sign_material: None, }, ), ( "brown_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([77, 51, 35]), }, + sign_material: None, }, ), ( "brown_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "brown_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 71, 40]), }, + sign_material: None, }, ), ( "bubble_column", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Water}), color: Color([177, 177, 177]), }, + sign_material: None, }, ), ( "bubble_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "bubble_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([165, 26, 162]), }, + sign_material: None, }, ), ( "bubble_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "bubble_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "budding_amethyst", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([132, 96, 186]), }, + sign_material: None, }, ), ( "cactus", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([85, 127, 43]), }, + sign_material: None, }, ), ( "cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "calcite", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 224, 220]), }, + sign_material: None, }, ), ( "calibrated_sculk_sensor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([27, 79, 100]), }, + sign_material: None, }, ), ( "campfire", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 88, 54]), }, + sign_material: None, }, ), ( "candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "carrots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([81, 124, 37]), }, + sign_material: None, }, ), ( "cartography_table", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([103, 87, 67]), }, + sign_material: None, }, ), ( "carved_pumpkin", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([198, 118, 24]), }, + sign_material: None, }, ), ( "cauldron", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([73, 72, 74]), }, + sign_material: None, }, ), ( "cave_air", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "cave_vines", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([90, 109, 40]), }, + sign_material: None, }, ), ( "cave_vines_plant", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([88, 101, 38]), }, + sign_material: None, }, ), ( "chain", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "chain_command_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([131, 161, 147]), }, + sign_material: None, }, ), ( "cherry_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "cherry_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 170, 164]), }, + sign_material: None, }, ), ( "cherry_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 178, 172]), }, + sign_material: None, }, ), ( "cherry_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 178, 172]), }, + sign_material: None, }, ), ( "cherry_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("cherry"), }, ), ( "cherry_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([229, 172, 194]), }, + sign_material: None, }, ), ( "cherry_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([185, 141, 137]), }, + sign_material: None, }, ), ( "cherry_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 178, 172]), }, + sign_material: None, }, ), ( "cherry_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 178, 172]), }, + sign_material: None, }, ), ( "cherry_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "cherry_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 178, 172]), }, + sign_material: Some("cherry"), }, ), ( "cherry_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 178, 172]), }, + sign_material: None, }, ), ( "cherry_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 178, 172]), }, + sign_material: None, }, ), ( "cherry_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 178, 172]), }, + sign_material: None, }, ), ( "cherry_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("cherry"), }, ), ( "cherry_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("cherry"), }, ), ( "cherry_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([54, 33, 44]), }, + sign_material: None, }, ), ( "chest", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "chipped_anvil", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 72, 72]), }, + sign_material: None, }, ), ( "chiseled_bookshelf", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([178, 144, 88]), }, + sign_material: None, }, ), ( "chiseled_deepslate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([54, 54, 54]), }, + sign_material: None, }, ), ( "chiseled_nether_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([47, 23, 28]), }, + sign_material: None, }, ), ( "chiseled_polished_blackstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 48, 56]), }, + sign_material: None, }, ), ( "chiseled_quartz_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([231, 226, 218]), }, + sign_material: None, }, ), ( "chiseled_red_sandstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "chiseled_sandstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "chiseled_stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([119, 118, 119]), }, + sign_material: None, }, ), ( "chorus_flower", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([151, 120, 151]), }, + sign_material: None, }, ), ( "chorus_plant", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([93, 57, 93]), }, + sign_material: None, }, ), ( "clay", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 166, 179]), }, + sign_material: None, }, ), ( "coal_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([16, 15, 15]), }, + sign_material: None, }, ), ( "coal_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([105, 105, 105]), }, + sign_material: None, }, ), ( "coarse_dirt", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([119, 85, 59]), }, + sign_material: None, }, ), ( "cobbled_deepslate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([77, 77, 80]), }, + sign_material: None, }, ), ( "cobbled_deepslate_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([77, 77, 80]), }, + sign_material: None, }, ), ( "cobbled_deepslate_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([77, 77, 80]), }, + sign_material: None, }, ), ( "cobbled_deepslate_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([77, 77, 80]), }, + sign_material: None, }, ), ( "cobblestone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 127, 127]), }, + sign_material: None, }, ), ( "cobblestone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 127, 127]), }, + sign_material: None, }, ), ( "cobblestone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 127, 127]), }, + sign_material: None, }, ), ( "cobblestone_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 127, 127]), }, + sign_material: None, }, ), ( "cobweb", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([228, 233, 234]), }, + sign_material: None, }, ), ( "cocoa", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 91, 40]), }, + sign_material: None, }, ), ( "command_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 136, 108]), }, + sign_material: None, }, ), ( "comparator", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([166, 161, 159]), }, + sign_material: None, }, ), ( "composter", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([88, 61, 23]), }, + sign_material: None, }, ), ( "conduit", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([159, 139, 113]), }, + sign_material: None, }, ), ( "copper_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 107, 79]), }, + sign_material: None, }, ), ( "copper_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([124, 125, 120]), }, + sign_material: None, }, ), ( "cornflower", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "cracked_deepslate_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([64, 64, 65]), }, + sign_material: None, }, ), ( "cracked_deepslate_tiles", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([52, 52, 52]), }, + sign_material: None, }, ), ( "cracked_nether_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([40, 20, 23]), }, + sign_material: None, }, ), ( "cracked_polished_blackstone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 37, 43]), }, + sign_material: None, }, ), ( "cracked_stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([118, 117, 118]), }, + sign_material: None, }, ), ( "crafting_table", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([119, 73, 42]), }, + sign_material: None, }, ), ( "creeper_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "creeper_wall_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "crimson_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "crimson_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 54, 79]), }, + sign_material: None, }, ), ( "crimson_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 48, 70]), }, + sign_material: None, }, ), ( "crimson_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 48, 70]), }, + sign_material: None, }, ), ( "crimson_fungus", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "crimson_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("crimson"), }, ), ( "crimson_hyphae", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([92, 25, 29]), }, + sign_material: None, }, ), ( "crimson_nylium", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([130, 31, 31]), }, + sign_material: None, }, ), ( "crimson_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 48, 70]), }, + sign_material: None, }, ), ( "crimson_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 48, 70]), }, + sign_material: None, }, ), ( "crimson_roots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([126, 8, 41]), }, + sign_material: None, }, ), ( "crimson_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 48, 70]), }, + sign_material: Some("crimson"), }, ), ( "crimson_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 48, 70]), }, + sign_material: None, }, ), ( "crimson_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 48, 70]), }, + sign_material: None, }, ), ( "crimson_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([112, 49, 70]), }, + sign_material: None, }, ), ( "crimson_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([103, 50, 72]), }, + sign_material: None, }, ), ( "crimson_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("crimson"), }, ), ( "crimson_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("crimson"), }, ), ( "crying_obsidian", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([32, 10, 60]), }, + sign_material: None, }, ), ( "cut_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([191, 106, 80]), }, + sign_material: None, }, ), ( "cut_copper_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([191, 106, 80]), }, + sign_material: None, }, ), ( "cut_copper_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([191, 106, 80]), }, + sign_material: None, }, ), ( "cut_red_sandstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "cut_red_sandstone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "cut_sandstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "cut_sandstone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "cyan_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "cyan_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "cyan_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "cyan_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "cyan_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([21, 137, 145]), }, + sign_material: None, }, ), ( "cyan_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([21, 119, 136]), }, + sign_material: None, }, ), ( "cyan_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([36, 147, 157]), }, + sign_material: None, }, ), ( "cyan_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([52, 118, 125]), }, + sign_material: None, }, ), ( "cyan_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([20, 121, 135]), }, + sign_material: None, }, ), ( "cyan_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([76, 127, 153]), }, + sign_material: None, }, ), ( "cyan_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([73, 122, 147]), }, + sign_material: None, }, ), ( "cyan_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([86, 91, 91]), }, + sign_material: None, }, ), ( "cyan_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "cyan_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([21, 137, 145]), }, + sign_material: None, }, ), ( "damaged_anvil", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 72, 72]), }, + sign_material: None, }, ), ( "dandelion", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dark_oak_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dark_oak_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([76, 51, 25]), }, + sign_material: None, }, ), ( "dark_oak_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([66, 43, 20]), }, + sign_material: None, }, ), ( "dark_oak_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([66, 43, 20]), }, + sign_material: None, }, ), ( "dark_oak_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("dark_oak"), }, ), ( "dark_oak_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), color: Color([150, 150, 150]), }, + sign_material: None, }, ), ( "dark_oak_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([67, 45, 22]), }, + sign_material: None, }, ), ( "dark_oak_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([66, 43, 20]), }, + sign_material: None, }, ), ( "dark_oak_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([66, 43, 20]), }, + sign_material: None, }, ), ( "dark_oak_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([61, 90, 30]), }, + sign_material: None, }, ), ( "dark_oak_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([66, 43, 20]), }, + sign_material: Some("dark_oak"), }, ), ( "dark_oak_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([66, 43, 20]), }, + sign_material: None, }, ), ( "dark_oak_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([66, 43, 20]), }, + sign_material: None, }, ), ( "dark_oak_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([75, 49, 23]), }, + sign_material: None, }, ), ( "dark_oak_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("dark_oak"), }, ), ( "dark_oak_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("dark_oak"), }, ), ( "dark_oak_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([60, 46, 26]), }, + sign_material: None, }, ), ( "dark_prismarine", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([51, 91, 75]), }, + sign_material: None, }, ), ( "dark_prismarine_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([51, 91, 75]), }, + sign_material: None, }, ), ( "dark_prismarine_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([51, 91, 75]), }, + sign_material: None, }, ), ( "daylight_detector", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([130, 116, 94]), }, + sign_material: None, }, ), ( "dead_brain_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_brain_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([124, 117, 114]), }, + sign_material: None, }, ), ( "dead_brain_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_brain_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_bubble_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_bubble_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([131, 123, 119]), }, + sign_material: None, }, ), ( "dead_bubble_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_bubble_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_bush", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([107, 78, 40]), }, + sign_material: None, }, ), ( "dead_fire_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_fire_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([131, 123, 119]), }, + sign_material: None, }, ), ( "dead_fire_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_fire_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_horn_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_horn_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([133, 126, 122]), }, + sign_material: None, }, ), ( "dead_horn_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_horn_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_tube_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_tube_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([130, 123, 119]), }, + sign_material: None, }, ), ( "dead_tube_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dead_tube_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "decorated_pot", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([124, 68, 53]), }, + sign_material: None, }, ), ( "deepslate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([80, 80, 82]), }, + sign_material: None, }, ), ( "deepslate_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([70, 70, 71]), }, + sign_material: None, }, ), ( "deepslate_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([70, 70, 71]), }, + sign_material: None, }, ), ( "deepslate_brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([70, 70, 71]), }, + sign_material: None, }, ), ( "deepslate_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([70, 70, 71]), }, + sign_material: None, }, ), ( "deepslate_coal_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([74, 74, 76]), }, + sign_material: None, }, ), ( "deepslate_copper_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([92, 93, 89]), }, + sign_material: None, }, ), ( "deepslate_diamond_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([83, 106, 106]), }, + sign_material: None, }, ), ( "deepslate_emerald_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([78, 104, 87]), }, + sign_material: None, }, ), ( "deepslate_gold_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 102, 78]), }, + sign_material: None, }, ), ( "deepslate_iron_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([106, 99, 94]), }, + sign_material: None, }, ), ( "deepslate_lapis_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 90, 115]), }, + sign_material: None, }, ), ( "deepslate_redstone_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([104, 73, 74]), }, + sign_material: None, }, ), ( "deepslate_tile_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([54, 54, 55]), }, + sign_material: None, }, ), ( "deepslate_tile_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([54, 54, 55]), }, + sign_material: None, }, ), ( "deepslate_tile_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([54, 54, 55]), }, + sign_material: None, }, ), ( "deepslate_tiles", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([54, 54, 55]), }, + sign_material: None, }, ), ( "detector_rail", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([123, 104, 90]), }, + sign_material: None, }, ), ( "diamond_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([98, 237, 228]), }, + sign_material: None, }, ), ( "diamond_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([121, 141, 140]), }, + sign_material: None, }, ), ( "diorite", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([188, 188, 188]), }, + sign_material: None, }, ), ( "diorite_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([188, 188, 188]), }, + sign_material: None, }, ), ( "diorite_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([188, 188, 188]), }, + sign_material: None, }, ), ( "diorite_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([188, 188, 188]), }, + sign_material: None, }, ), ( "dirt", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([134, 96, 67]), }, + sign_material: None, }, ), ( "dirt_path", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([148, 121, 65]), }, + sign_material: None, }, ), ( "dispenser", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 109, 109]), }, + sign_material: None, }, ), ( "dragon_egg", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([12, 9, 15]), }, + sign_material: None, }, ), ( "dragon_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dragon_wall_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "dried_kelp_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([50, 58, 38]), }, + sign_material: None, }, ), ( "dripstone_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([134, 107, 92]), }, + sign_material: None, }, ), ( "dropper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 109, 109]), }, + sign_material: None, }, ), ( "emerald_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([42, 203, 87]), }, + sign_material: None, }, ), ( "emerald_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([108, 136, 115]), }, + sign_material: None, }, ), ( "enchanting_table", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([128, 75, 85]), }, + sign_material: None, }, ), ( "end_gateway", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([15, 10, 24]), }, + sign_material: None, }, ), ( "end_portal", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([15, 10, 24]), }, + sign_material: None, }, ), ( "end_portal_frame", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([91, 120, 97]), }, + sign_material: None, }, ), ( "end_rod", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "end_stone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([219, 222, 158]), }, + sign_material: None, }, ), ( "end_stone_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([218, 224, 162]), }, + sign_material: None, }, ), ( "end_stone_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([218, 224, 162]), }, + sign_material: None, }, ), ( "end_stone_brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([218, 224, 162]), }, + sign_material: None, }, ), ( "end_stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([218, 224, 162]), }, + sign_material: None, }, ), ( "ender_chest", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([15, 10, 24]), }, + sign_material: None, }, ), ( "exposed_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([161, 125, 103]), }, + sign_material: None, }, ), ( "exposed_cut_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 121, 101]), }, + sign_material: None, }, ), ( "exposed_cut_copper_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 121, 101]), }, + sign_material: None, }, ), ( "exposed_cut_copper_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 121, 101]), }, + sign_material: None, }, ), ( "farmland", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([81, 44, 15]), }, + sign_material: None, }, ), ( "fern", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "fire", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([211, 140, 53]), }, + sign_material: None, }, ), ( "fire_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "fire_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([163, 35, 46]), }, + sign_material: None, }, ), ( "fire_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "fire_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "fletching_table", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([197, 180, 133]), }, + sign_material: None, }, ), ( "flower_pot", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([124, 68, 53]), }, + sign_material: None, }, ), ( "flowering_azalea", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([112, 121, 64]), }, + sign_material: None, }, ), ( "flowering_azalea_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 111, 60]), }, + sign_material: None, }, ), ( "frogspawn", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([105, 90, 82]), }, + sign_material: None, }, ), ( "frosted_ice", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([140, 181, 252]), }, + sign_material: None, }, ), ( "furnace", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 109, 109]), }, + sign_material: None, }, ), ( "gilded_blackstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([55, 42, 38]), }, + sign_material: None, }, ), ( "glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([175, 213, 219]), }, + sign_material: None, }, ), ( "glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([170, 210, 217]), }, + sign_material: None, }, ), ( "glow_item_frame", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "glow_lichen", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "glowstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([171, 131, 84]), }, + sign_material: None, }, ), ( "gold_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([246, 208, 61]), }, + sign_material: None, }, ), ( "gold_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([145, 133, 106]), }, + sign_material: None, }, ), ( "granite", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([149, 103, 85]), }, + sign_material: None, }, ), ( "granite_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([149, 103, 85]), }, + sign_material: None, }, ), ( "granite_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([149, 103, 85]), }, + sign_material: None, }, ), ( "granite_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([149, 103, 85]), }, + sign_material: None, }, ), ( "grass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "grass_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([147, 147, 147]), }, + sign_material: None, }, ), ( "grass_path", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([148, 121, 65]), }, + sign_material: None, }, ), ( "gravel", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([131, 127, 126]), }, + sign_material: None, }, ), ( "gray_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "gray_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "gray_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "gray_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "gray_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([62, 68, 71]), }, + sign_material: None, }, ), ( "gray_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([54, 57, 61]), }, + sign_material: None, }, ), ( "gray_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([76, 81, 84]), }, + sign_material: None, }, ), ( "gray_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([83, 90, 93]), }, + sign_material: None, }, ), ( "gray_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([55, 58, 62]), }, + sign_material: None, }, ), ( "gray_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([76, 76, 76]), }, + sign_material: None, }, ), ( "gray_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([73, 73, 73]), }, + sign_material: None, }, ), ( "gray_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([57, 42, 35]), }, + sign_material: None, }, ), ( "gray_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "gray_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([62, 68, 71]), }, + sign_material: None, }, ), ( "green_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "green_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "green_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "green_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "green_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([84, 109, 27]), }, + sign_material: None, }, ), ( "green_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([73, 91, 36]), }, + sign_material: None, }, ), ( "green_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([97, 119, 44]), }, + sign_material: None, }, ), ( "green_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 142, 67]), }, + sign_material: None, }, ), ( "green_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 100, 31]), }, + sign_material: None, }, ), ( "green_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([102, 127, 51]), }, + sign_material: None, }, ), ( "green_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([97, 122, 48]), }, + sign_material: None, }, ), ( "green_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([76, 83, 42]), }, + sign_material: None, }, ), ( "green_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "green_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([84, 109, 27]), }, + sign_material: None, }, ), ( "grindstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([142, 142, 142]), }, + sign_material: None, }, ), ( "hanging_roots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([161, 115, 91]), }, + sign_material: None, }, ), ( "hay_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([165, 139, 12]), }, + sign_material: None, }, ), ( "heavy_weighted_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([220, 220, 220]), }, + sign_material: None, }, ), ( "honey_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([251, 185, 52]), }, + sign_material: None, }, ), ( "honeycomb_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([229, 148, 29]), }, + sign_material: None, }, ), ( "hopper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([75, 74, 75]), }, + sign_material: None, }, ), ( "horn_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "horn_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([216, 199, 66]), }, + sign_material: None, }, ), ( "horn_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "horn_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "ice", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([145, 183, 253]), }, + sign_material: None, }, ), ( "infested_chiseled_stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([119, 118, 119]), }, + sign_material: None, }, ), ( "infested_cobblestone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 127, 127]), }, + sign_material: None, }, ), ( "infested_cracked_stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([118, 117, 118]), }, + sign_material: None, }, ), ( "infested_deepslate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([80, 80, 82]), }, + sign_material: None, }, ), ( "infested_mossy_stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 121, 105]), }, + sign_material: None, }, ), ( "infested_stone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 125, 125]), }, + sign_material: None, }, ), ( "infested_stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 121, 122]), }, + sign_material: None, }, ), ( "iron_bars", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([136, 139, 135]), }, + sign_material: None, }, ), ( "iron_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([220, 220, 220]), }, + sign_material: None, }, ), ( "iron_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([194, 193, 193]), }, + sign_material: None, }, ), ( "iron_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([136, 129, 122]), }, + sign_material: None, }, ), ( "iron_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([202, 202, 202]), }, + sign_material: None, }, ), ( "item_frame", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "jack_o_lantern", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([214, 152, 52]), }, + sign_material: None, }, ), ( "jigsaw", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([80, 69, 81]), }, + sign_material: None, }, ), ( "jukebox", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([93, 64, 47]), }, + sign_material: None, }, ), ( "jungle_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "jungle_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([163, 119, 84]), }, + sign_material: None, }, ), ( "jungle_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 115, 80]), }, + sign_material: None, }, ), ( "jungle_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 115, 80]), }, + sign_material: None, }, ), ( "jungle_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("jungle"), }, ), ( "jungle_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), color: Color([156, 154, 143]), }, + sign_material: None, }, ), ( "jungle_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([149, 109, 70]), }, + sign_material: None, }, ), ( "jungle_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 115, 80]), }, + sign_material: None, }, ), ( "jungle_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 115, 80]), }, + sign_material: None, }, ), ( "jungle_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([47, 81, 16]), }, + sign_material: None, }, ), ( "jungle_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 115, 80]), }, + sign_material: Some("jungle"), }, ), ( "jungle_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 115, 80]), }, + sign_material: None, }, ), ( "jungle_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 115, 80]), }, + sign_material: None, }, ), ( "jungle_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([152, 110, 77]), }, + sign_material: None, }, ), ( "jungle_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("jungle"), }, ), ( "jungle_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("jungle"), }, ), ( "jungle_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([85, 67, 25]), }, + sign_material: None, }, ), ( "kelp", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "kelp_plant", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([86, 130, 42]), }, + sign_material: None, }, ), ( "ladder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "lantern", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([106, 91, 83]), }, + sign_material: None, }, ), ( "lapis_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([30, 67, 140]), }, + sign_material: None, }, ), ( "lapis_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([107, 117, 141]), }, + sign_material: None, }, ), ( "large_amethyst_bud", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "large_fern", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([125, 125, 125]), }, + sign_material: None, }, ), ( "lava", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([212, 90, 18]), }, + sign_material: None, }, ), ( "lava_cauldron", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([73, 72, 74]), }, + sign_material: None, }, ), ( "lectern", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([173, 137, 83]), }, + sign_material: None, }, ), ( "lever", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_blue_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_blue_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_blue_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_blue_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "light_blue_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([58, 175, 217]), }, + sign_material: None, }, ), ( "light_blue_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([35, 137, 198]), }, + sign_material: None, }, ), ( "light_blue_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([74, 180, 213]), }, + sign_material: None, }, ), ( "light_blue_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([94, 164, 208]), }, + sign_material: None, }, ), ( "light_blue_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([49, 163, 212]), }, + sign_material: None, }, ), ( "light_blue_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([102, 153, 216]), }, + sign_material: None, }, ), ( "light_blue_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([97, 147, 208]), }, + sign_material: None, }, ), ( "light_blue_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([113, 108, 137]), }, + sign_material: None, }, ), ( "light_blue_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_blue_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([58, 175, 217]), }, + sign_material: None, }, ), ( "light_gray_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_gray_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_gray_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_gray_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "light_gray_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([142, 142, 134]), }, + sign_material: None, }, ), ( "light_gray_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 125, 115]), }, + sign_material: None, }, ), ( "light_gray_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 154, 148]), }, + sign_material: None, }, ), ( "light_gray_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([144, 166, 167]), }, + sign_material: None, }, ), ( "light_gray_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([124, 124, 115]), }, + sign_material: None, }, ), ( "light_gray_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([153, 153, 153]), }, + sign_material: None, }, ), ( "light_gray_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([147, 147, 147]), }, + sign_material: None, }, ), ( "light_gray_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([135, 106, 97]), }, + sign_material: None, }, ), ( "light_gray_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "light_gray_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([142, 142, 134]), }, + sign_material: None, }, ), ( "light_weighted_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([246, 208, 61]), }, + sign_material: None, }, ), ( "lightning_rod", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "lilac", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 125, 147]), }, + sign_material: None, }, ), ( "lily_of_the_valley", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "lily_pad", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([133, 133, 133]), }, + sign_material: None, }, ), ( "lime_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "lime_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "lime_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "lime_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "lime_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([112, 185, 25]), }, + sign_material: None, }, ), ( "lime_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([94, 168, 24]), }, + sign_material: None, }, ), ( "lime_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 189, 41]), }, + sign_material: None, }, ), ( "lime_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 197, 55]), }, + sign_material: None, }, ), ( "lime_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 172, 23]), }, + sign_material: None, }, ), ( "lime_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 204, 25]), }, + sign_material: None, }, ), ( "lime_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 196, 24]), }, + sign_material: None, }, ), ( "lime_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([103, 117, 52]), }, + sign_material: None, }, ), ( "lime_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "lime_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([112, 185, 25]), }, + sign_material: None, }, ), ( "lodestone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([147, 149, 152]), }, + sign_material: None, }, ), ( "loom", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([142, 119, 91]), }, + sign_material: None, }, ), ( "magenta_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "magenta_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "magenta_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "magenta_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "magenta_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([189, 68, 179]), }, + sign_material: None, }, ), ( "magenta_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([169, 48, 159]), }, + sign_material: None, }, ), ( "magenta_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 83, 184]), }, + sign_material: None, }, ), ( "magenta_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([208, 100, 191]), }, + sign_material: None, }, ), ( "magenta_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([173, 54, 163]), }, + sign_material: None, }, ), ( "magenta_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([178, 76, 216]), }, + sign_material: None, }, ), ( "magenta_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([171, 73, 208]), }, + sign_material: None, }, ), ( "magenta_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([149, 88, 108]), }, + sign_material: None, }, ), ( "magenta_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "magenta_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([189, 68, 179]), }, + sign_material: None, }, ), ( "magma_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([142, 63, 31]), }, + sign_material: None, }, ), ( "mangrove_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "mangrove_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([112, 48, 46]), }, + sign_material: None, }, ), ( "mangrove_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 54, 48]), }, + sign_material: None, }, ), ( "mangrove_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 54, 48]), }, + sign_material: None, }, ), ( "mangrove_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("mangrove"), }, ), ( "mangrove_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), color: Color([129, 128, 128]), }, + sign_material: None, }, ), ( "mangrove_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([102, 48, 42]), }, + sign_material: None, }, ), ( "mangrove_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 54, 48]), }, + sign_material: None, }, ), ( "mangrove_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 54, 48]), }, + sign_material: None, }, ), ( "mangrove_propagule", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([96, 174, 83]), }, + sign_material: None, }, ), ( "mangrove_roots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([74, 59, 38]), }, + sign_material: None, }, ), ( "mangrove_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 54, 48]), }, + sign_material: Some("mangrove"), }, ), ( "mangrove_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 54, 48]), }, + sign_material: None, }, ), ( "mangrove_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 54, 48]), }, + sign_material: None, }, ), ( "mangrove_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 46, 42]), }, + sign_material: None, }, ), ( "mangrove_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("mangrove"), }, ), ( "mangrove_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("mangrove"), }, ), ( "mangrove_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([83, 66, 41]), }, + sign_material: None, }, ), ( "medium_amethyst_bud", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "melon", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([111, 144, 30]), }, + sign_material: None, }, ), ( "melon_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([153, 153, 153]), }, + sign_material: None, }, ), ( "moss_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([89, 109, 45]), }, + sign_material: None, }, ), ( "moss_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([89, 109, 45]), }, + sign_material: None, }, ), ( "mossy_cobblestone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 118, 94]), }, + sign_material: None, }, ), ( "mossy_cobblestone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 118, 94]), }, + sign_material: None, }, ), ( "mossy_cobblestone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 118, 94]), }, + sign_material: None, }, ), ( "mossy_cobblestone_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([110, 118, 94]), }, + sign_material: None, }, ), ( "mossy_stone_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 121, 105]), }, + sign_material: None, }, ), ( "mossy_stone_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 121, 105]), }, + sign_material: None, }, ), ( "mossy_stone_brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 121, 105]), }, + sign_material: None, }, ), ( "mossy_stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 121, 105]), }, + sign_material: None, }, ), ( "moving_piston", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "mud", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([60, 57, 60]), }, + sign_material: None, }, ), ( "mud_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([137, 103, 79]), }, + sign_material: None, }, ), ( "mud_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([137, 103, 79]), }, + sign_material: None, }, ), ( "mud_brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([137, 103, 79]), }, + sign_material: None, }, ), ( "mud_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([137, 103, 79]), }, + sign_material: None, }, ), ( "muddy_mangrove_roots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([70, 58, 45]), }, + sign_material: None, }, ), ( "mushroom_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([203, 196, 185]), }, + sign_material: None, }, ), ( "mycelium", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([111, 98, 101]), }, + sign_material: None, }, ), ( "nether_brick_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 21, 26]), }, + sign_material: None, }, ), ( "nether_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 21, 26]), }, + sign_material: None, }, ), ( "nether_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 21, 26]), }, + sign_material: None, }, ), ( "nether_brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 21, 26]), }, + sign_material: None, }, ), ( "nether_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 21, 26]), }, + sign_material: None, }, ), ( "nether_gold_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 54, 42]), }, + sign_material: None, }, ), ( "nether_portal", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([89, 11, 192]), }, + sign_material: None, }, ), ( "nether_quartz_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([117, 65, 62]), }, + sign_material: None, }, ), ( "nether_sprouts", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([19, 151, 133]), }, + sign_material: None, }, ), ( "nether_wart", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([111, 18, 19]), }, + sign_material: None, }, ), ( "nether_wart_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 2, 2]), }, + sign_material: None, }, ), ( "netherite_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([66, 61, 63]), }, + sign_material: None, }, ), ( "netherrack", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([97, 38, 38]), }, + sign_material: None, }, ), ( "note_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([88, 58, 40]), }, + sign_material: None, }, ), ( "oak_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "oak_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([140, 110, 66]), }, + sign_material: None, }, ), ( "oak_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "oak_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "oak_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("oak"), }, ), ( "oak_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Foliage}), color: Color([144, 144, 144]), }, + sign_material: None, }, ), ( "oak_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([151, 121, 73]), }, + sign_material: None, }, ), ( "oak_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "oak_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "oak_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([77, 106, 40]), }, + sign_material: None, }, ), ( "oak_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: Some("oak"), }, ), ( "oak_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "oak_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "oak_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([124, 99, 56]), }, + sign_material: None, }, ), ( "oak_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("oak"), }, ), ( "oak_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("oak"), }, ), ( "oak_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 85, 50]), }, + sign_material: None, }, ), ( "observer", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([98, 98, 98]), }, + sign_material: None, }, ), ( "obsidian", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([15, 10, 24]), }, + sign_material: None, }, ), ( "ochre_froglight", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([250, 245, 206]), }, + sign_material: None, }, ), ( "orange_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "orange_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "orange_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "orange_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "orange_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([240, 118, 19]), }, + sign_material: None, }, ), ( "orange_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([224, 97, 0]), }, + sign_material: None, }, ), ( "orange_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([227, 131, 31]), }, + sign_material: None, }, ), ( "orange_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 147, 91]), }, + sign_material: None, }, ), ( "orange_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([234, 106, 8]), }, + sign_material: None, }, ), ( "orange_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([216, 127, 51]), }, + sign_material: None, }, ), ( "orange_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([208, 122, 48]), }, + sign_material: None, }, ), ( "orange_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([161, 83, 37]), }, + sign_material: None, }, ), ( "orange_tulip", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "orange_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "orange_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([240, 118, 19]), }, + sign_material: None, }, ), ( "oxeye_daisy", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "oxidized_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([82, 162, 132]), }, + sign_material: None, }, ), ( "oxidized_cut_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 153, 126]), }, + sign_material: None, }, ), ( "oxidized_cut_copper_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 153, 126]), }, + sign_material: None, }, ), ( "oxidized_cut_copper_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 153, 126]), }, + sign_material: None, }, ), ( "packed_ice", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([141, 180, 250]), }, + sign_material: None, }, ), ( "packed_mud", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([142, 106, 79]), }, + sign_material: None, }, ), ( "pearlescent_froglight", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([245, 240, 239]), }, + sign_material: None, }, ), ( "peony", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([129, 126, 139]), }, + sign_material: None, }, ), ( "petrified_oak_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "piglin_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "piglin_wall_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "pink_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "pink_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "pink_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "pink_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "pink_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([237, 141, 172]), }, + sign_material: None, }, ), ( "pink_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([213, 101, 142]), }, + sign_material: None, }, ), ( "pink_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([228, 153, 181]), }, + sign_material: None, }, ), ( "pink_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([235, 154, 181]), }, + sign_material: None, }, ), ( "pink_petals", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "pink_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([230, 121, 157]), }, + sign_material: None, }, ), ( "pink_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([242, 127, 165]), }, + sign_material: None, }, ), ( "pink_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([233, 122, 159]), }, + sign_material: None, }, ), ( "pink_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([161, 78, 78]), }, + sign_material: None, }, ), ( "pink_tulip", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "pink_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "pink_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([237, 141, 172]), }, + sign_material: None, }, ), ( "piston", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 104, 96]), }, + sign_material: None, }, ), ( "piston_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([153, 127, 85]), }, + sign_material: None, }, ), ( "pitcher_crop", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([193, 165, 103]), }, + sign_material: None, }, ), ( "pitcher_plant", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 144, 189]), }, + sign_material: None, }, ), ( "player_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "player_wall_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "podzol", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([91, 63, 24]), }, + sign_material: None, }, ), ( "pointed_dripstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([129, 102, 89]), }, + sign_material: None, }, ), ( "polished_andesite", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([132, 134, 133]), }, + sign_material: None, }, ), ( "polished_andesite_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([132, 134, 133]), }, + sign_material: None, }, ), ( "polished_andesite_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([132, 134, 133]), }, + sign_material: None, }, ), ( "polished_basalt", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 98, 100]), }, + sign_material: None, }, ), ( "polished_blackstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 48, 56]), }, + sign_material: None, }, ), ( "polished_blackstone_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([48, 42, 49]), }, + sign_material: None, }, ), ( "polished_blackstone_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([48, 42, 49]), }, + sign_material: None, }, ), ( "polished_blackstone_brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([48, 42, 49]), }, + sign_material: None, }, ), ( "polished_blackstone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([48, 42, 49]), }, + sign_material: None, }, ), ( "polished_blackstone_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "polished_blackstone_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 48, 56]), }, + sign_material: None, }, ), ( "polished_blackstone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 48, 56]), }, + sign_material: None, }, ), ( "polished_blackstone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 48, 56]), }, + sign_material: None, }, ), ( "polished_blackstone_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 48, 56]), }, + sign_material: None, }, ), ( "polished_deepslate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 72, 73]), }, + sign_material: None, }, ), ( "polished_deepslate_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 72, 73]), }, + sign_material: None, }, ), ( "polished_deepslate_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 72, 73]), }, + sign_material: None, }, ), ( "polished_deepslate_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 72, 73]), }, + sign_material: None, }, ), ( "polished_diorite", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 193, 194]), }, + sign_material: None, }, ), ( "polished_diorite_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 193, 194]), }, + sign_material: None, }, ), ( "polished_diorite_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 193, 194]), }, + sign_material: None, }, ), ( "polished_granite", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 106, 89]), }, + sign_material: None, }, ), ( "polished_granite_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 106, 89]), }, + sign_material: None, }, ), ( "polished_granite_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 106, 89]), }, + sign_material: None, }, ), ( "poppy", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "potatoes", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([84, 135, 47]), }, + sign_material: None, }, ), ( "potted_acacia_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([118, 117, 23]), }, + sign_material: None, }, ), ( "potted_allium", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([158, 137, 183]), }, + sign_material: None, }, ), ( "potted_azalea_bush", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([101, 124, 47]), }, + sign_material: None, }, ), ( "potted_azure_bluet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([169, 204, 127]), }, + sign_material: None, }, ), ( "potted_bamboo", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([93, 144, 19]), }, + sign_material: None, }, ), ( "potted_birch_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 160, 79]), }, + sign_material: None, }, ), ( "potted_blue_orchid", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([47, 162, 168]), }, + sign_material: None, }, ), ( "potted_brown_mushroom", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([153, 116, 92]), }, + sign_material: None, }, ), ( "potted_cactus", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([85, 127, 43]), }, + sign_material: None, }, ), ( "potted_cherry_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([164, 117, 143]), }, + sign_material: None, }, ), ( "potted_cornflower", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 121, 146]), }, + sign_material: None, }, ), ( "potted_crimson_fungus", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([141, 44, 29]), }, + sign_material: None, }, ), ( "potted_crimson_roots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 8, 41]), }, + sign_material: None, }, ), ( "potted_dandelion", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([147, 172, 43]), }, + sign_material: None, }, ), ( "potted_dark_oak_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([61, 90, 30]), }, + sign_material: None, }, ), ( "potted_dead_bush", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([107, 78, 40]), }, + sign_material: None, }, ), ( "potted_fern", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([124, 124, 124]), }, + sign_material: None, }, ), ( "potted_flowering_azalea_bush", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([112, 121, 64]), }, + sign_material: None, }, ), ( "potted_jungle_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([47, 81, 16]), }, + sign_material: None, }, ), ( "potted_lily_of_the_valley", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([123, 174, 95]), }, + sign_material: None, }, ), ( "potted_mangrove_propagule", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([96, 174, 83]), }, + sign_material: None, }, ), ( "potted_oak_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([77, 106, 40]), }, + sign_material: None, }, ), ( "potted_orange_tulip", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([93, 142, 30]), }, + sign_material: None, }, ), ( "potted_oxeye_daisy", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([179, 202, 143]), }, + sign_material: None, }, ), ( "potted_pink_tulip", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 157, 78]), }, + sign_material: None, }, ), ( "potted_poppy", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([128, 64, 37]), }, + sign_material: None, }, ), ( "potted_red_mushroom", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([216, 75, 67]), }, + sign_material: None, }, ), ( "potted_red_tulip", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([89, 128, 32]), }, + sign_material: None, }, ), ( "potted_spruce_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 60, 36]), }, + sign_material: None, }, ), ( "potted_torchflower", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([100, 101, 77]), }, + sign_material: None, }, ), ( "potted_warped_fungus", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([74, 109, 87]), }, + sign_material: None, }, ), ( "potted_warped_roots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([20, 136, 123]), }, + sign_material: None, }, ), ( "potted_white_tulip", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([93, 164, 71]), }, + sign_material: None, }, ), ( "potted_wither_rose", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([41, 44, 23]), }, + sign_material: None, }, ), ( "powder_snow", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 253, 253]), }, + sign_material: None, }, ), ( "powder_snow_cauldron", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([73, 72, 74]), }, + sign_material: None, }, ), ( "powered_rail", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([137, 109, 74]), }, + sign_material: None, }, ), ( "prismarine", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 156, 151]), }, + sign_material: None, }, ), ( "prismarine_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 171, 158]), }, + sign_material: None, }, ), ( "prismarine_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 171, 158]), }, + sign_material: None, }, ), ( "prismarine_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 171, 158]), }, + sign_material: None, }, ), ( "prismarine_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 156, 151]), }, + sign_material: None, }, ), ( "prismarine_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 156, 151]), }, + sign_material: None, }, ), ( "prismarine_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([99, 156, 151]), }, + sign_material: None, }, ), ( "pumpkin", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([198, 118, 24]), }, + sign_material: None, }, ), ( "pumpkin_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([154, 154, 154]), }, + sign_material: None, }, ), ( "purple_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "purple_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "purple_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "purple_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "purple_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([121, 42, 172]), }, + sign_material: None, }, ), ( "purple_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([100, 31, 156]), }, + sign_material: None, }, ), ( "purple_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([131, 55, 177]), }, + sign_material: None, }, ), ( "purple_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 47, 152]), }, + sign_material: None, }, ), ( "purple_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([103, 32, 156]), }, + sign_material: None, }, ), ( "purple_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([127, 63, 178]), }, + sign_material: None, }, ), ( "purple_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 61, 171]), }, + sign_material: None, }, ), ( "purple_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([118, 70, 86]), }, + sign_material: None, }, ), ( "purple_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "purple_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([121, 42, 172]), }, + sign_material: None, }, ), ( "purpur_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([169, 125, 169]), }, + sign_material: None, }, ), ( "purpur_pillar", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([171, 129, 171]), }, + sign_material: None, }, ), ( "purpur_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([169, 125, 169]), }, + sign_material: None, }, ), ( "purpur_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([169, 125, 169]), }, + sign_material: None, }, ), ( "quartz_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([235, 229, 222]), }, + sign_material: None, }, ), ( "quartz_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([234, 229, 221]), }, + sign_material: None, }, ), ( "quartz_pillar", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([235, 230, 224]), }, + sign_material: None, }, ), ( "quartz_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([235, 229, 222]), }, + sign_material: None, }, ), ( "quartz_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([235, 229, 222]), }, + sign_material: None, }, ), ( "rail", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 111, 88]), }, + sign_material: None, }, ), ( "raw_copper_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 105, 79]), }, + sign_material: None, }, ), ( "raw_gold_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([221, 169, 46]), }, + sign_material: None, }, ), ( "raw_iron_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([166, 135, 107]), }, + sign_material: None, }, ), ( "red_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "red_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "red_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "red_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "red_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 39, 34]), }, + sign_material: None, }, ), ( "red_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([142, 32, 32]), }, + sign_material: None, }, ), ( "red_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([168, 54, 50]), }, + sign_material: None, }, ), ( "red_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 59, 53]), }, + sign_material: None, }, ), ( "red_mushroom", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "red_mushroom_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([200, 46, 45]), }, + sign_material: None, }, ), ( "red_nether_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([69, 7, 9]), }, + sign_material: None, }, ), ( "red_nether_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([69, 7, 9]), }, + sign_material: None, }, ), ( "red_nether_brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([69, 7, 9]), }, + sign_material: None, }, ), ( "red_nether_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([69, 7, 9]), }, + sign_material: None, }, ), ( "red_sand", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([190, 102, 33]), }, + sign_material: None, }, ), ( "red_sandstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "red_sandstone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "red_sandstone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "red_sandstone_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "red_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([140, 31, 30]), }, + sign_material: None, }, ), ( "red_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([153, 51, 51]), }, + sign_material: None, }, ), ( "red_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([147, 48, 48]), }, + sign_material: None, }, ), ( "red_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([143, 61, 46]), }, + sign_material: None, }, ), ( "red_tulip", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "red_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "red_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 39, 34]), }, + sign_material: None, }, ), ( "redstone_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([175, 24, 5]), }, + sign_material: None, }, ), ( "redstone_lamp", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([95, 54, 30]), }, + sign_material: None, }, ), ( "redstone_ore", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([140, 109, 109]), }, + sign_material: None, }, ), ( "redstone_torch", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "redstone_wall_torch", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "redstone_wire", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([175, 24, 5]), }, + sign_material: None, }, ), ( "reinforced_deepslate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([80, 82, 78]), }, + sign_material: None, }, ), ( "repeater", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 157, 156]), }, + sign_material: None, }, ), ( "repeating_command_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([129, 111, 176]), }, + sign_material: None, }, ), ( "respawn_anchor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([75, 26, 144]), }, + sign_material: None, }, ), ( "rooted_dirt", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([144, 103, 76]), }, + sign_material: None, }, ), ( "rose_bush", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([131, 66, 37]), }, + sign_material: None, }, ), ( "sand", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([219, 207, 163]), }, + sign_material: None, }, ), ( "sandstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "sandstone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "sandstone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "sandstone_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "scaffolding", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([170, 131, 73]), }, + sign_material: None, }, ), ( "sculk", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([12, 29, 36]), }, + sign_material: None, }, ), ( "sculk_catalyst", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([15, 31, 38]), }, + sign_material: None, }, ), ( "sculk_sensor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([7, 70, 84]), }, + sign_material: None, }, ), ( "sculk_shrieker", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([198, 205, 169]), }, + sign_material: None, }, ), ( "sculk_vein", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([7, 48, 57]), }, + sign_material: None, }, ), ( "sea_lantern", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([172, 199, 190]), }, + sign_material: None, }, ), ( "sea_pickle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([90, 97, 39]), }, + sign_material: None, }, ), ( "seagrass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "short_grass", - BlockType { - flags: make_bitflags!(BlockFlag::{}), - color: Color([0, 0, 0]), + ConstBlockType { + block_color: BlockColor { + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), + }, + sign_material: None, }, ), ( "shroomlight", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([240, 146, 70]), }, + sign_material: None, }, ), ( "shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([139, 96, 139]), }, + sign_material: None, }, ), ( "sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: Some("oak"), }, ), ( "skeleton_skull", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "skeleton_wall_skull", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "slime_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([111, 192, 91]), }, + sign_material: None, }, ), ( "small_amethyst_bud", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "small_dripleaf", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "smithing_table", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([57, 58, 70]), }, + sign_material: None, }, ), ( "smoker", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([85, 83, 81]), }, + sign_material: None, }, ), ( "smooth_basalt", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 72, 78]), }, + sign_material: None, }, ), ( "smooth_quartz", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([235, 229, 222]), }, + sign_material: None, }, ), ( "smooth_quartz_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([235, 229, 222]), }, + sign_material: None, }, ), ( "smooth_quartz_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([235, 229, 222]), }, + sign_material: None, }, ), ( "smooth_red_sandstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "smooth_red_sandstone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "smooth_red_sandstone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([181, 97, 31]), }, + sign_material: None, }, ), ( "smooth_sandstone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "smooth_sandstone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "smooth_sandstone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([223, 214, 170]), }, + sign_material: None, }, ), ( "smooth_stone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([158, 158, 158]), }, + sign_material: None, }, ), ( "smooth_stone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([158, 158, 158]), }, + sign_material: None, }, ), ( "sniffer_egg", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([135, 105, 67]), }, + sign_material: None, }, ), ( "snow", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([249, 254, 254]), }, + sign_material: None, }, ), ( "snow_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([249, 254, 254]), }, + sign_material: None, }, ), ( "soul_campfire", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([80, 204, 208]), }, + sign_material: None, }, ), ( "soul_fire", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([51, 192, 197]), }, + sign_material: None, }, ), ( "soul_lantern", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([71, 99, 114]), }, + sign_material: None, }, ), ( "soul_sand", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([81, 62, 50]), }, + sign_material: None, }, ), ( "soul_soil", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([75, 57, 46]), }, + sign_material: None, }, ), ( "soul_torch", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "soul_wall_torch", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "spawner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([36, 46, 62]), }, + sign_material: None, }, ), ( "sponge", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([195, 192, 74]), }, + sign_material: None, }, ), ( "spore_blossom", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([206, 96, 158]), }, + sign_material: None, }, ), ( "spruce_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "spruce_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([106, 80, 48]), }, + sign_material: None, }, ), ( "spruce_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 84, 48]), }, + sign_material: None, }, ), ( "spruce_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 84, 48]), }, + sign_material: None, }, ), ( "spruce_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("spruce"), }, ), ( "spruce_leaves", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Spruce}), color: Color([126, 126, 126]), }, + sign_material: None, }, ), ( "spruce_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([108, 80, 46]), }, + sign_material: None, }, ), ( "spruce_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 84, 48]), }, + sign_material: None, }, ), ( "spruce_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 84, 48]), }, + sign_material: None, }, ), ( "spruce_sapling", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 60, 36]), }, + sign_material: None, }, ), ( "spruce_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 84, 48]), }, + sign_material: Some("spruce"), }, ), ( "spruce_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 84, 48]), }, + sign_material: None, }, ), ( "spruce_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([114, 84, 48]), }, + sign_material: None, }, ), ( "spruce_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([103, 79, 47]), }, + sign_material: None, }, ), ( "spruce_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("spruce"), }, ), ( "spruce_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("spruce"), }, ), ( "spruce_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([58, 37, 16]), }, + sign_material: None, }, ), ( "sticky_piston", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 104, 96]), }, + sign_material: None, }, ), ( "stone", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 125, 125]), }, + sign_material: None, }, ), ( "stone_brick_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 121, 122]), }, + sign_material: None, }, ), ( "stone_brick_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 121, 122]), }, + sign_material: None, }, ), ( "stone_brick_wall", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 121, 122]), }, + sign_material: None, }, ), ( "stone_bricks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([122, 121, 122]), }, + sign_material: None, }, ), ( "stone_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "stone_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 125, 125]), }, + sign_material: None, }, ), ( "stone_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 125, 125]), }, + sign_material: None, }, ), ( "stone_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([125, 125, 125]), }, + sign_material: None, }, ), ( "stonecutter", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([123, 118, 111]), }, + sign_material: None, }, ), ( "stripped_acacia_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([166, 91, 51]), }, + sign_material: None, }, ), ( "stripped_acacia_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([174, 92, 59]), }, + sign_material: None, }, ), ( "stripped_bamboo_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([178, 158, 72]), }, + sign_material: None, }, ), ( "stripped_birch_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([191, 171, 116]), }, + sign_material: None, }, ), ( "stripped_birch_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([196, 176, 118]), }, + sign_material: None, }, ), ( "stripped_cherry_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([221, 164, 157]), }, + sign_material: None, }, ), ( "stripped_cherry_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([215, 145, 148]), }, + sign_material: None, }, ), ( "stripped_crimson_hyphae", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([137, 57, 90]), }, + sign_material: None, }, ), ( "stripped_crimson_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([121, 56, 82]), }, + sign_material: None, }, ), ( "stripped_dark_oak_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([65, 44, 22]), }, + sign_material: None, }, ), ( "stripped_dark_oak_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([72, 56, 36]), }, + sign_material: None, }, ), ( "stripped_jungle_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([165, 122, 81]), }, + sign_material: None, }, ), ( "stripped_jungle_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([171, 132, 84]), }, + sign_material: None, }, ), ( "stripped_mangrove_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 43, 43]), }, + sign_material: None, }, ), ( "stripped_mangrove_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([119, 54, 47]), }, + sign_material: None, }, ), ( "stripped_oak_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([160, 129, 77]), }, + sign_material: None, }, ), ( "stripped_oak_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([177, 144, 86]), }, + sign_material: None, }, ), ( "stripped_spruce_log", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([105, 80, 46]), }, + sign_material: None, }, ), ( "stripped_spruce_wood", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([115, 89, 52]), }, + sign_material: None, }, ), ( "stripped_warped_hyphae", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([57, 150, 147]), }, + sign_material: None, }, ), ( "stripped_warped_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([52, 128, 124]), }, + sign_material: None, }, ), ( "structure_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([88, 74, 90]), }, + sign_material: None, }, ), ( "structure_void", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "sugar_cane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([148, 192, 101]), }, + sign_material: None, }, ), ( "sunflower", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([246, 196, 54]), }, + sign_material: None, }, ), ( "suspicious_gravel", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([129, 125, 124]), }, + sign_material: None, }, ), ( "suspicious_sand", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([217, 204, 159]), }, + sign_material: None, }, ), ( "sweet_berry_bush", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([68, 77, 50]), }, + sign_material: None, }, ), ( "tall_grass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([151, 149, 151]), }, + sign_material: None, }, ), ( "tall_seagrass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([59, 139, 14]), }, + sign_material: None, }, ), ( "target", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([226, 170, 157]), }, + sign_material: None, }, ), ( "terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([152, 94, 67]), }, + sign_material: None, }, ), ( "tinted_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 38, 46]), }, + sign_material: None, }, ), ( "tnt", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([142, 62, 53]), }, + sign_material: None, }, ), ( "torch", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "torchflower", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "torchflower_crop", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "trapped_chest", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([162, 130, 78]), }, + sign_material: None, }, ), ( "tripwire", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "tripwire_hook", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "tube_coral", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "tube_coral_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([49, 87, 206]), }, + sign_material: None, }, ), ( "tube_coral_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "tube_coral_wall_fan", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "tuff", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([108, 109, 102]), }, + sign_material: None, }, ), ( "turtle_egg", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([228, 226, 191]), }, + sign_material: None, }, ), ( "twisting_vines", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([20, 143, 124]), }, + sign_material: None, }, ), ( "twisting_vines_plant", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([20, 135, 122]), }, + sign_material: None, }, ), ( "verdant_froglight", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([229, 244, 228]), }, + sign_material: None, }, ), ( "vine", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Grass}), color: Color([116, 116, 116]), }, + sign_material: None, }, ), ( "void_air", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("oak"), }, ), ( "wall_torch", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "warped_button", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "warped_door", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([44, 126, 120]), }, + sign_material: None, }, ), ( "warped_fence", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 104, 99]), }, + sign_material: None, }, ), ( "warped_fence_gate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 104, 99]), }, + sign_material: None, }, ), ( "warped_fungus", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "warped_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("warped"), }, ), ( "warped_hyphae", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([58, 58, 77]), }, + sign_material: None, }, ), ( "warped_nylium", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 114, 101]), }, + sign_material: None, }, ), ( "warped_planks", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 104, 99]), }, + sign_material: None, }, ), ( "warped_pressure_plate", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 104, 99]), }, + sign_material: None, }, ), ( "warped_roots", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([20, 138, 124]), }, + sign_material: None, }, ), ( "warped_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 104, 99]), }, + sign_material: Some("warped"), }, ), ( "warped_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 104, 99]), }, + sign_material: None, }, ), ( "warped_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([43, 104, 99]), }, + sign_material: None, }, ), ( "warped_stem", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([53, 109, 110]), }, + sign_material: None, }, ), ( "warped_trapdoor", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([47, 119, 111]), }, + sign_material: None, }, ), ( "warped_wall_hanging_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("warped"), }, ), ( "warped_wall_sign", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: Some("warped"), }, ), ( "warped_wart_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([22, 119, 121]), }, + sign_material: None, }, ), ( "water", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque|Water}), color: Color([177, 177, 177]), }, + sign_material: None, }, ), ( "water_cauldron", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([73, 72, 74]), }, + sign_material: None, }, ), ( "waxed_copper_block", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([192, 107, 79]), }, + sign_material: None, }, ), ( "waxed_cut_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([191, 106, 80]), }, + sign_material: None, }, ), ( "waxed_cut_copper_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([191, 106, 80]), }, + sign_material: None, }, ), ( "waxed_cut_copper_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([191, 106, 80]), }, + sign_material: None, }, ), ( "waxed_exposed_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([161, 125, 103]), }, + sign_material: None, }, ), ( "waxed_exposed_cut_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 121, 101]), }, + sign_material: None, }, ), ( "waxed_exposed_cut_copper_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 121, 101]), }, + sign_material: None, }, ), ( "waxed_exposed_cut_copper_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([154, 121, 101]), }, + sign_material: None, }, ), ( "waxed_oxidized_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([82, 162, 132]), }, + sign_material: None, }, ), ( "waxed_oxidized_cut_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 153, 126]), }, + sign_material: None, }, ), ( "waxed_oxidized_cut_copper_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 153, 126]), }, + sign_material: None, }, ), ( "waxed_oxidized_cut_copper_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([79, 153, 126]), }, + sign_material: None, }, ), ( "waxed_weathered_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([108, 153, 110]), }, + sign_material: None, }, ), ( "waxed_weathered_cut_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 145, 107]), }, + sign_material: None, }, ), ( "waxed_weathered_cut_copper_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 145, 107]), }, + sign_material: None, }, ), ( "waxed_weathered_cut_copper_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 145, 107]), }, + sign_material: None, }, ), ( "weathered_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([108, 153, 110]), }, + sign_material: None, }, ), ( "weathered_cut_copper", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 145, 107]), }, + sign_material: None, }, ), ( "weathered_cut_copper_slab", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 145, 107]), }, + sign_material: None, }, ), ( "weathered_cut_copper_stairs", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([109, 145, 107]), }, + sign_material: None, }, ), ( "weeping_vines", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([104, 1, 0]), }, + sign_material: None, }, ), ( "weeping_vines_plant", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([132, 16, 12]), }, + sign_material: None, }, ), ( "wet_sponge", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([171, 181, 70]), }, + sign_material: None, }, ), ( "wheat", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([166, 151, 73]), }, + sign_material: None, }, ), ( "white_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "white_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "white_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "white_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "white_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([233, 236, 236]), }, + sign_material: None, }, ), ( "white_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([207, 213, 214]), }, + sign_material: None, }, ), ( "white_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([225, 227, 227]), }, + sign_material: None, }, ), ( "white_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([188, 212, 202]), }, + sign_material: None, }, ), ( "white_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([215, 220, 221]), }, + sign_material: None, }, ), ( "white_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([255, 255, 255]), }, + sign_material: None, }, ), ( "white_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([246, 246, 246]), }, + sign_material: None, }, ), ( "white_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([209, 178, 161]), }, + sign_material: None, }, ), ( "white_tulip", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "white_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "white_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([233, 236, 236]), }, + sign_material: None, }, ), ( "wither_rose", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "wither_skeleton_skull", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "wither_skeleton_wall_skull", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "yellow_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "yellow_bed", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "yellow_candle", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "yellow_candle_cake", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 222, 214]), }, + sign_material: None, }, ), ( "yellow_carpet", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 197, 39]), }, + sign_material: None, }, ), ( "yellow_concrete", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([240, 175, 21]), }, + sign_material: None, }, ), ( "yellow_concrete_powder", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([232, 199, 54]), }, + sign_material: None, }, ), ( "yellow_glazed_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([234, 192, 88]), }, + sign_material: None, }, ), ( "yellow_shulker_box", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 188, 29]), }, + sign_material: None, }, ), ( "yellow_stained_glass", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([229, 229, 51]), }, + sign_material: None, }, ), ( "yellow_stained_glass_pane", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([221, 221, 48]), }, + sign_material: None, }, ), ( "yellow_terracotta", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([186, 133, 35]), }, + sign_material: None, }, ), ( "yellow_wall_banner", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "yellow_wool", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{Opaque}), color: Color([248, 197, 39]), }, + sign_material: None, }, ), ( "zombie_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ( "zombie_wall_head", - BlockType { + ConstBlockType { block_color: BlockColor { flags: make_bitflags!(BlockFlag::{}), color: Color([0, 0, 0]), }, + sign_material: None, }, ), ]; diff --git a/crates/resource/src/lib.rs b/crates/resource/src/lib.rs index 676b92b..1175c88 100644 --- a/crates/resource/src/lib.rs +++ b/crates/resource/src/lib.rs @@ -57,11 +57,31 @@ impl BlockColor { } } +/// A block type specification (for use in constants) +#[derive(Debug, Clone)] +struct ConstBlockType { + /// Determines the rendered color of the block type + pub block_color: BlockColor, + /// Material of a sign block + pub sign_material: Option<&'static str>, +} + /// A block type specification #[derive(Debug, Clone)] pub struct BlockType { /// Determines the rendered color of the block type pub block_color: BlockColor, + /// Material of a sign block + pub sign_material: Option, +} + +impl From<&ConstBlockType> for BlockType { + fn from(value: &ConstBlockType) -> Self { + BlockType { + block_color: value.block_color, + sign_material: value.sign_material.map(String::from), + } + } } /// Used to look up standard Minecraft block types @@ -77,7 +97,7 @@ impl Default for BlockTypes { fn default() -> Self { let block_type_map: HashMap<_, _> = block_types::BLOCK_TYPES .iter() - .map(|(k, v)| (String::from(*k), v.clone())) + .map(|(k, v)| (String::from(*k), BlockType::from(v))) .collect(); let legacy_block_types = Box::new(legacy_block_types::LEGACY_BLOCK_TYPES.map(|inner| { inner.map(|id| { diff --git a/resource/blocks.json b/resource/blocks.json index 6f4f5e7..ce5c497 100644 --- a/resource/blocks.json +++ b/resource/blocks.json @@ -9,7 +9,10 @@ "acacia_fence_gate": { "texture": "acacia_planks" }, - "acacia_hanging_sign": null, + "acacia_hanging_sign": { + "sign_material": "acacia", + "texture": null + }, "acacia_leaves": { "foliage": true }, @@ -22,6 +25,7 @@ }, "acacia_sapling": {}, "acacia_sign": { + "sign_material": "acacia", "texture": "acacia_planks" }, "acacia_slab": { @@ -31,8 +35,14 @@ "texture": "acacia_planks" }, "acacia_trapdoor": {}, - "acacia_wall_hanging_sign": null, - "acacia_wall_sign": null, + "acacia_wall_hanging_sign": { + "sign_material": "acacia", + "texture": null + }, + "acacia_wall_sign": { + "sign_material": "acacia", + "texture": null + }, "acacia_wood": { "texture": "acacia_log" }, @@ -84,7 +94,10 @@ "bamboo_fence_gate": { "texture": "bamboo_planks" }, - "bamboo_hanging_sign": null, + "bamboo_hanging_sign": { + "sign_material": "bamboo", + "texture": null + }, "bamboo_mosaic": {}, "bamboo_mosaic_slab": { "texture": "bamboo_mosaic" @@ -98,6 +111,7 @@ }, "bamboo_sapling": null, "bamboo_sign": { + "sign_material": "bamboo", "texture": "bamboo_planks" }, "bamboo_slab": { @@ -107,8 +121,14 @@ "texture": "bamboo_planks" }, "bamboo_trapdoor": {}, - "bamboo_wall_hanging_sign": null, - "bamboo_wall_sign": null, + "bamboo_wall_hanging_sign": { + "sign_material": "bamboo", + "texture": null + }, + "bamboo_wall_sign": { + "sign_material": "bamboo", + "texture": null + }, "barrel": { "texture": "barrel_top" }, @@ -144,7 +164,10 @@ "birch_fence_gate": { "texture": "birch_planks" }, - "birch_hanging_sign": null, + "birch_hanging_sign": { + "sign_material": "birch", + "texture": null + }, "birch_leaves": { "birch": true }, @@ -157,6 +180,7 @@ }, "birch_sapling": {}, "birch_sign": { + "sign_material": "birch", "texture": "birch_planks" }, "birch_slab": { @@ -166,8 +190,14 @@ "texture": "birch_planks" }, "birch_trapdoor": {}, - "birch_wall_hanging_sign": null, - "birch_wall_sign": null, + "birch_wall_hanging_sign": { + "sign_material": "birch", + "texture": null + }, + "birch_wall_sign": { + "sign_material": "birch", + "texture": null + }, "birch_wood": { "texture": "birch_log" }, @@ -326,7 +356,10 @@ "cherry_fence_gate": { "texture": "cherry_planks" }, - "cherry_hanging_sign": null, + "cherry_hanging_sign": { + "sign_material": "cherry", + "texture": null + }, "cherry_leaves": {}, "cherry_log": { "texture": "cherry_log_top" @@ -337,6 +370,7 @@ }, "cherry_sapling": null, "cherry_sign": { + "sign_material": "cherry", "texture": "cherry_planks" }, "cherry_slab": { @@ -346,8 +380,14 @@ "texture": "cherry_planks" }, "cherry_trapdoor": {}, - "cherry_wall_hanging_sign": null, - "cherry_wall_sign": null, + "cherry_wall_hanging_sign": { + "sign_material": "cherry", + "texture": null + }, + "cherry_wall_sign": { + "sign_material": "cherry", + "texture": null + }, "cherry_wood": { "texture": "cherry_log" }, @@ -433,7 +473,10 @@ "texture": "crimson_planks" }, "crimson_fungus": null, - "crimson_hanging_sign": null, + "crimson_hanging_sign": { + "sign_material": "crimson", + "texture": null + }, "crimson_hyphae": { "texture": "crimson_stem" }, @@ -444,6 +487,7 @@ }, "crimson_roots": {}, "crimson_sign": { + "sign_material": "crimson", "texture": "crimson_planks" }, "crimson_slab": { @@ -456,8 +500,14 @@ "texture": "crimson_stem_top" }, "crimson_trapdoor": {}, - "crimson_wall_hanging_sign": null, - "crimson_wall_sign": null, + "crimson_wall_hanging_sign": { + "sign_material": "crimson", + "texture": null + }, + "crimson_wall_sign": { + "sign_material": "crimson", + "texture": null + }, "crying_obsidian": {}, "cut_copper": {}, "cut_copper_slab": { @@ -512,7 +562,10 @@ "dark_oak_fence_gate": { "texture": "dark_oak_planks" }, - "dark_oak_hanging_sign": null, + "dark_oak_hanging_sign": { + "sign_material": "dark_oak", + "texture": null + }, "dark_oak_leaves": { "foliage": true }, @@ -525,6 +578,7 @@ }, "dark_oak_sapling": {}, "dark_oak_sign": { + "sign_material": "dark_oak", "texture": "dark_oak_planks" }, "dark_oak_slab": { @@ -534,8 +588,14 @@ "texture": "dark_oak_planks" }, "dark_oak_trapdoor": {}, - "dark_oak_wall_hanging_sign": null, - "dark_oak_wall_sign": null, + "dark_oak_wall_hanging_sign": { + "sign_material": "dark_oak", + "texture": null + }, + "dark_oak_wall_sign": { + "sign_material": "dark_oak", + "texture": null + }, "dark_oak_wood": { "texture": "dark_oak_log" }, @@ -832,7 +892,10 @@ "jungle_fence_gate": { "texture": "jungle_planks" }, - "jungle_hanging_sign": null, + "jungle_hanging_sign": { + "sign_material": "jungle", + "texture": null + }, "jungle_leaves": { "foliage": true }, @@ -845,6 +908,7 @@ }, "jungle_sapling": {}, "jungle_sign": { + "sign_material": "jungle", "texture": "jungle_planks" }, "jungle_slab": { @@ -854,8 +918,14 @@ "texture": "jungle_planks" }, "jungle_trapdoor": {}, - "jungle_wall_hanging_sign": null, - "jungle_wall_sign": null, + "jungle_wall_hanging_sign": { + "sign_material": "jungle", + "texture": null + }, + "jungle_wall_sign": { + "sign_material": "jungle", + "texture": null + }, "jungle_wood": { "texture": "jungle_log" }, @@ -991,7 +1061,10 @@ "mangrove_fence_gate": { "texture": "mangrove_planks" }, - "mangrove_hanging_sign": null, + "mangrove_hanging_sign": { + "sign_material": "mangrove", + "texture": null + }, "mangrove_leaves": { "foliage": true }, @@ -1007,6 +1080,7 @@ "texture": "mangrove_roots_top" }, "mangrove_sign": { + "sign_material": "mangrove", "texture": "mangrove_planks" }, "mangrove_slab": { @@ -1016,8 +1090,14 @@ "texture": "mangrove_planks" }, "mangrove_trapdoor": {}, - "mangrove_wall_hanging_sign": null, - "mangrove_wall_sign": null, + "mangrove_wall_hanging_sign": { + "sign_material": "mangrove", + "texture": null + }, + "mangrove_wall_sign": { + "sign_material": "mangrove", + "texture": null + }, "mangrove_wood": { "texture": "mangrove_log" }, @@ -1105,7 +1185,10 @@ "oak_fence_gate": { "texture": "oak_planks" }, - "oak_hanging_sign": null, + "oak_hanging_sign": { + "sign_material": "oak", + "texture": null + }, "oak_leaves": { "foliage": true }, @@ -1118,6 +1201,7 @@ }, "oak_sapling": {}, "oak_sign": { + "sign_material": "oak", "texture": "oak_planks" }, "oak_slab": { @@ -1127,8 +1211,14 @@ "texture": "oak_planks" }, "oak_trapdoor": {}, - "oak_wall_hanging_sign": null, - "oak_wall_sign": null, + "oak_wall_hanging_sign": { + "sign_material": "oak", + "texture": null + }, + "oak_wall_sign": { + "sign_material": "oak", + "texture": null + }, "oak_wood": { "texture": "oak_log" }, @@ -1562,6 +1652,7 @@ "shroomlight": {}, "shulker_box": {}, "sign": { + "sign_material": "oak", "texture": "oak_planks" }, "skeleton_skull": null, @@ -1638,7 +1729,10 @@ "spruce_fence_gate": { "texture": "spruce_planks" }, - "spruce_hanging_sign": null, + "spruce_hanging_sign": { + "sign_material": "spruce", + "texture": null + }, "spruce_leaves": { "spruce": true }, @@ -1651,6 +1745,7 @@ }, "spruce_sapling": {}, "spruce_sign": { + "sign_material": "spruce", "texture": "spruce_planks" }, "spruce_slab": { @@ -1660,8 +1755,14 @@ "texture": "spruce_planks" }, "spruce_trapdoor": {}, - "spruce_wall_hanging_sign": null, - "spruce_wall_sign": null, + "spruce_wall_hanging_sign": { + "sign_material": "spruce", + "texture": null + }, + "spruce_wall_sign": { + "sign_material": "spruce", + "texture": null + }, "spruce_wood": { "texture": "spruce_log" }, @@ -1808,7 +1909,10 @@ "grass": true }, "void_air": null, - "wall_sign": null, + "wall_sign": { + "sign_material": "oak", + "texture": null + }, "wall_torch": null, "warped_button": null, "warped_door": { @@ -1821,7 +1925,10 @@ "texture": "warped_planks" }, "warped_fungus": null, - "warped_hanging_sign": null, + "warped_hanging_sign": { + "sign_material": "warped", + "texture": null + }, "warped_hyphae": { "texture": "warped_stem" }, @@ -1832,6 +1939,7 @@ }, "warped_roots": {}, "warped_sign": { + "sign_material": "warped", "texture": "warped_planks" }, "warped_slab": { @@ -1844,8 +1952,14 @@ "texture": "warped_stem_top" }, "warped_trapdoor": {}, - "warped_wall_hanging_sign": null, - "warped_wall_sign": null, + "warped_wall_hanging_sign": { + "sign_material": "warped", + "texture": null + }, + "warped_wall_sign": { + "sign_material": "warped", + "texture": null + }, "warped_wart_block": {}, "water": { "texture": "water_still", diff --git a/resource/extract.py b/resource/extract.py index 281f3a7..22a6c76 100755 --- a/resource/extract.py +++ b/resource/extract.py @@ -45,12 +45,17 @@ for name, info in blocks.items(): 'birch': False, 'spruce': False, 'water': False, + 'sign_material': None, } if info is None: continue - color = mean_color(info.get('texture', name)) + texture = info.get('texture', name) + + color = None + if texture: + color = mean_color(texture) if color: output[id]['color'] = color output[id]['opaque'] = True @@ -60,5 +65,7 @@ for name, info in blocks.items(): output[id]['spruce'] = info.get('spruce', False) output[id]['water'] = info.get('water', False) + output[id]['sign_material'] = info.get('sign_material') + with open(sys.argv[3], 'w') as f: json.dump(output, f) diff --git a/resource/generate.py b/resource/generate.py index 2e6cf21..da5cb94 100755 --- a/resource/generate.py +++ b/resource/generate.py @@ -18,7 +18,7 @@ with open(sys.argv[2], 'w') as f: print('', file=f) print('use super::*;', file=f) print('', file=f) - print('pub const BLOCK_TYPES: &[(&str, BlockType)] = &[', file=f) + print('pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[', file=f) for name, info in colors.items(): flags = [] @@ -36,13 +36,18 @@ with open(sys.argv[2], 'w') as f: flags.append('Water') flags = 'make_bitflags!(BlockFlag::{' + '|'.join(flags) + '})' - print('\t("%s", BlockType { ' % name, file=f) + sign_material = 'None' + if info['sign_material']: + sign_material = 'Some("%s")' % info['sign_material'] + + print('\t("%s", ConstBlockType { ' % name, file=f) print('\t\tblock_color: BlockColor { flags: %s, color: Color([%u, %u, %u]) },' % ( flags, info['color']['r'], info['color']['g'], info['color']['b'], ), file=f) + print('\t\tsign_material: %s,' % sign_material, file=f) print('}),', file=f) print('];', file=f) From 48a6e242ea5fdc6de8050bc3b96d018d1c387124 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 30 Dec 2023 02:29:40 +0100 Subject: [PATCH 20/43] resource: add WallSign flag to block types Allow to distinguish wall signs from freestanding or -hanging signs. --- crates/resource/src/block_types.rs | 46 ++++++++++---------- crates/resource/src/lib.rs | 5 +++ resource/blocks.json | 69 ++++++++++++++++++++---------- resource/extract.py | 13 +++--- resource/generate.py | 2 + 5 files changed, 84 insertions(+), 51 deletions(-) diff --git a/crates/resource/src/block_types.rs b/crates/resource/src/block_types.rs index f9ec70d..7ee50af 100644 --- a/crates/resource/src/block_types.rs +++ b/crates/resource/src/block_types.rs @@ -147,7 +147,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "acacia_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("acacia"), @@ -157,7 +157,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "acacia_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("acacia"), @@ -507,7 +507,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "bamboo_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("bamboo"), @@ -517,7 +517,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "bamboo_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("bamboo"), @@ -777,7 +777,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "birch_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("birch"), @@ -787,7 +787,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "birch_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("birch"), @@ -1787,7 +1787,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "cherry_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("cherry"), @@ -1797,7 +1797,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "cherry_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("cherry"), @@ -2387,7 +2387,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "crimson_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("crimson"), @@ -2397,7 +2397,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "crimson_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("crimson"), @@ -2787,7 +2787,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "dark_oak_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("dark_oak"), @@ -2797,7 +2797,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "dark_oak_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("dark_oak"), @@ -4577,7 +4577,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "jungle_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("jungle"), @@ -4587,7 +4587,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "jungle_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("jungle"), @@ -5527,7 +5527,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "mangrove_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("mangrove"), @@ -5537,7 +5537,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "mangrove_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("mangrove"), @@ -6057,7 +6057,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "oak_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("oak"), @@ -6067,7 +6067,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "oak_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("oak"), @@ -8637,7 +8637,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "spruce_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("spruce"), @@ -8647,7 +8647,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "spruce_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("spruce"), @@ -9287,7 +9287,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("oak"), @@ -9467,7 +9467,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "warped_wall_hanging_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("warped"), @@ -9477,7 +9477,7 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "warped_wall_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{}), + flags: make_bitflags!(BlockFlag::{WallSign}), color: Color([0, 0, 0]), }, sign_material: Some("warped"), diff --git a/crates/resource/src/lib.rs b/crates/resource/src/lib.rs index 1175c88..1baffda 100644 --- a/crates/resource/src/lib.rs +++ b/crates/resource/src/lib.rs @@ -31,6 +31,11 @@ pub enum BlockFlag { Spruce, /// The block type is colored using biome water colors Water, + /// The block type is a wall sign + /// + /// The WallSign flag is used to distinguish wall signs from + /// freestanding or -hanging signs. + WallSign, } /// An RGB color with u8 components diff --git a/resource/blocks.json b/resource/blocks.json index ce5c497..ee052bd 100644 --- a/resource/blocks.json +++ b/resource/blocks.json @@ -37,11 +37,13 @@ "acacia_trapdoor": {}, "acacia_wall_hanging_sign": { "sign_material": "acacia", - "texture": null + "texture": null, + "wall_sign": true }, "acacia_wall_sign": { "sign_material": "acacia", - "texture": null + "texture": null, + "wall_sign": true }, "acacia_wood": { "texture": "acacia_log" @@ -123,11 +125,13 @@ "bamboo_trapdoor": {}, "bamboo_wall_hanging_sign": { "sign_material": "bamboo", - "texture": null + "texture": null, + "wall_sign": true }, "bamboo_wall_sign": { "sign_material": "bamboo", - "texture": null + "texture": null, + "wall_sign": true }, "barrel": { "texture": "barrel_top" @@ -192,11 +196,13 @@ "birch_trapdoor": {}, "birch_wall_hanging_sign": { "sign_material": "birch", - "texture": null + "texture": null, + "wall_sign": true }, "birch_wall_sign": { "sign_material": "birch", - "texture": null + "texture": null, + "wall_sign": true }, "birch_wood": { "texture": "birch_log" @@ -382,11 +388,13 @@ "cherry_trapdoor": {}, "cherry_wall_hanging_sign": { "sign_material": "cherry", - "texture": null + "texture": null, + "wall_sign": true }, "cherry_wall_sign": { "sign_material": "cherry", - "texture": null + "texture": null, + "wall_sign": true }, "cherry_wood": { "texture": "cherry_log" @@ -502,11 +510,13 @@ "crimson_trapdoor": {}, "crimson_wall_hanging_sign": { "sign_material": "crimson", - "texture": null + "texture": null, + "wall_sign": true }, "crimson_wall_sign": { "sign_material": "crimson", - "texture": null + "texture": null, + "wall_sign": true }, "crying_obsidian": {}, "cut_copper": {}, @@ -590,11 +600,13 @@ "dark_oak_trapdoor": {}, "dark_oak_wall_hanging_sign": { "sign_material": "dark_oak", - "texture": null + "texture": null, + "wall_sign": true }, "dark_oak_wall_sign": { "sign_material": "dark_oak", - "texture": null + "texture": null, + "wall_sign": true }, "dark_oak_wood": { "texture": "dark_oak_log" @@ -920,11 +932,13 @@ "jungle_trapdoor": {}, "jungle_wall_hanging_sign": { "sign_material": "jungle", - "texture": null + "texture": null, + "wall_sign": true }, "jungle_wall_sign": { "sign_material": "jungle", - "texture": null + "texture": null, + "wall_sign": true }, "jungle_wood": { "texture": "jungle_log" @@ -1092,11 +1106,13 @@ "mangrove_trapdoor": {}, "mangrove_wall_hanging_sign": { "sign_material": "mangrove", - "texture": null + "texture": null, + "wall_sign": true }, "mangrove_wall_sign": { "sign_material": "mangrove", - "texture": null + "texture": null, + "wall_sign": true }, "mangrove_wood": { "texture": "mangrove_log" @@ -1213,11 +1229,13 @@ "oak_trapdoor": {}, "oak_wall_hanging_sign": { "sign_material": "oak", - "texture": null + "texture": null, + "wall_sign": true }, "oak_wall_sign": { "sign_material": "oak", - "texture": null + "texture": null, + "wall_sign": true }, "oak_wood": { "texture": "oak_log" @@ -1757,11 +1775,13 @@ "spruce_trapdoor": {}, "spruce_wall_hanging_sign": { "sign_material": "spruce", - "texture": null + "texture": null, + "wall_sign": true }, "spruce_wall_sign": { "sign_material": "spruce", - "texture": null + "texture": null, + "wall_sign": true }, "spruce_wood": { "texture": "spruce_log" @@ -1911,7 +1931,8 @@ "void_air": null, "wall_sign": { "sign_material": "oak", - "texture": null + "texture": null, + "wall_sign": true }, "wall_torch": null, "warped_button": null, @@ -1954,11 +1975,13 @@ "warped_trapdoor": {}, "warped_wall_hanging_sign": { "sign_material": "warped", - "texture": null + "texture": null, + "wall_sign": true }, "warped_wall_sign": { "sign_material": "warped", - "texture": null + "texture": null, + "wall_sign": true }, "warped_wart_block": {}, "water": { diff --git a/resource/extract.py b/resource/extract.py index 22a6c76..9621b95 100755 --- a/resource/extract.py +++ b/resource/extract.py @@ -45,6 +45,7 @@ for name, info in blocks.items(): 'birch': False, 'spruce': False, 'water': False, + 'wall_sign': False, 'sign_material': None, } @@ -59,11 +60,13 @@ for name, info in blocks.items(): if color: output[id]['color'] = color output[id]['opaque'] = True - output[id]['grass'] = info.get('grass', False) - output[id]['foliage'] = info.get('foliage', False) - output[id]['birch'] = info.get('birch', False) - output[id]['spruce'] = info.get('spruce', False) - output[id]['water'] = info.get('water', False) + + output[id]['grass'] = info.get('grass', False) + output[id]['foliage'] = info.get('foliage', False) + output[id]['birch'] = info.get('birch', False) + output[id]['spruce'] = info.get('spruce', False) + output[id]['water'] = info.get('water', False) + output[id]['wall_sign'] = info.get('wall_sign', False) output[id]['sign_material'] = info.get('sign_material') diff --git a/resource/generate.py b/resource/generate.py index da5cb94..8064482 100755 --- a/resource/generate.py +++ b/resource/generate.py @@ -34,6 +34,8 @@ with open(sys.argv[2], 'w') as f: flags.append('Spruce') if info['water']: flags.append('Water') + if info['wall_sign']: + flags.append('WallSign') flags = 'make_bitflags!(BlockFlag::{' + '|'.join(flags) + '})' sign_material = 'None' From 9aacd9cc2b787495f4f54b39afe130d1e821b259 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 5 Jan 2024 22:06:23 +0100 Subject: [PATCH 21/43] resource: make regular signs transparent For consistency with other sign types. Signs will be shown on a separate layer. --- crates/resource/src/block_types.rs | 48 +++++++++++++++--------------- resource/blocks.json | 24 +++++++-------- src/core/common.rs | 4 +-- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/crates/resource/src/block_types.rs b/crates/resource/src/block_types.rs index 7ee50af..6229016 100644 --- a/crates/resource/src/block_types.rs +++ b/crates/resource/src/block_types.rs @@ -107,8 +107,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "acacia_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([168, 90, 50]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("acacia"), }, @@ -467,8 +467,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "bamboo_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([193, 173, 80]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("bamboo"), }, @@ -737,8 +737,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "birch_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([192, 175, 121]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("birch"), }, @@ -1747,8 +1747,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "cherry_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([226, 178, 172]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("cherry"), }, @@ -2337,8 +2337,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "crimson_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([101, 48, 70]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("crimson"), }, @@ -2747,8 +2747,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "dark_oak_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([66, 43, 20]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("dark_oak"), }, @@ -4537,8 +4537,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "jungle_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([160, 115, 80]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("jungle"), }, @@ -5487,8 +5487,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "mangrove_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([117, 54, 48]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("mangrove"), }, @@ -6017,8 +6017,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "oak_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("oak"), }, @@ -8167,8 +8167,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([162, 130, 78]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("oak"), }, @@ -8597,8 +8597,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "spruce_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([114, 84, 48]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("spruce"), }, @@ -9417,8 +9417,8 @@ pub const BLOCK_TYPES: &[(&str, ConstBlockType)] = &[ "warped_sign", ConstBlockType { block_color: BlockColor { - flags: make_bitflags!(BlockFlag::{Opaque}), - color: Color([43, 104, 99]), + flags: make_bitflags!(BlockFlag::{}), + color: Color([0, 0, 0]), }, sign_material: Some("warped"), }, diff --git a/resource/blocks.json b/resource/blocks.json index ee052bd..f8b0165 100644 --- a/resource/blocks.json +++ b/resource/blocks.json @@ -26,7 +26,7 @@ "acacia_sapling": {}, "acacia_sign": { "sign_material": "acacia", - "texture": "acacia_planks" + "texture": null }, "acacia_slab": { "texture": "acacia_planks" @@ -114,7 +114,7 @@ "bamboo_sapling": null, "bamboo_sign": { "sign_material": "bamboo", - "texture": "bamboo_planks" + "texture": null }, "bamboo_slab": { "texture": "bamboo_planks" @@ -185,7 +185,7 @@ "birch_sapling": {}, "birch_sign": { "sign_material": "birch", - "texture": "birch_planks" + "texture": null }, "birch_slab": { "texture": "birch_planks" @@ -377,7 +377,7 @@ "cherry_sapling": null, "cherry_sign": { "sign_material": "cherry", - "texture": "cherry_planks" + "texture": null }, "cherry_slab": { "texture": "cherry_planks" @@ -496,7 +496,7 @@ "crimson_roots": {}, "crimson_sign": { "sign_material": "crimson", - "texture": "crimson_planks" + "texture": null }, "crimson_slab": { "texture": "crimson_planks" @@ -589,7 +589,7 @@ "dark_oak_sapling": {}, "dark_oak_sign": { "sign_material": "dark_oak", - "texture": "dark_oak_planks" + "texture": null }, "dark_oak_slab": { "texture": "dark_oak_planks" @@ -921,7 +921,7 @@ "jungle_sapling": {}, "jungle_sign": { "sign_material": "jungle", - "texture": "jungle_planks" + "texture": null }, "jungle_slab": { "texture": "jungle_planks" @@ -1095,7 +1095,7 @@ }, "mangrove_sign": { "sign_material": "mangrove", - "texture": "mangrove_planks" + "texture": null }, "mangrove_slab": { "texture": "mangrove_planks" @@ -1218,7 +1218,7 @@ "oak_sapling": {}, "oak_sign": { "sign_material": "oak", - "texture": "oak_planks" + "texture": null }, "oak_slab": { "texture": "oak_planks" @@ -1671,7 +1671,7 @@ "shulker_box": {}, "sign": { "sign_material": "oak", - "texture": "oak_planks" + "texture": null }, "skeleton_skull": null, "skeleton_wall_skull": null, @@ -1764,7 +1764,7 @@ "spruce_sapling": {}, "spruce_sign": { "sign_material": "spruce", - "texture": "spruce_planks" + "texture": null }, "spruce_slab": { "texture": "spruce_planks" @@ -1961,7 +1961,7 @@ "warped_roots": {}, "warped_sign": { "sign_material": "warped", - "texture": "warped_planks" + "texture": null }, "warped_slab": { "texture": "warped_planks" diff --git a/src/core/common.rs b/src/core/common.rs index d961ea9..ca6f424 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -22,7 +22,7 @@ use crate::{ /// /// Increase when the generation of processed regions from region data changes /// (usually because of updated resource data) -pub const REGION_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); +pub const REGION_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(1); /// MinedMap map tile data version number /// @@ -34,7 +34,7 @@ pub const MAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); /// /// Increase when the generation of lightmap tiles from region data changes /// (usually because of updated resource data) -pub const LIGHTMAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(0); +pub const LIGHTMAP_FILE_META_VERSION: FileMetaVersion = FileMetaVersion(1); /// MinedMap mipmap data version number /// From fb361145eb4896aa83b457b3665d41999dcfb765 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 30 Dec 2023 03:33:33 +0100 Subject: [PATCH 22/43] world: add sign position and material information to block entities --- src/core/region_processor.rs | 7 ++++- src/world/block_entity.rs | 36 ++++++++++++++++------- src/world/chunk.rs | 57 ++++++++++++++++++++++++++++++++---- 3 files changed, 83 insertions(+), 17 deletions(-) diff --git a/src/core/region_processor.rs b/src/core/region_processor.rs index cff87b7..63d5c09 100644 --- a/src/core/region_processor.rs +++ b/src/core/region_processor.rs @@ -243,7 +243,12 @@ impl<'a> SingleRegionProcessor<'a> { } if self.entities_needed { - let mut block_entities = chunk.block_entities(); + let mut block_entities = chunk.block_entities().with_context(|| { + format!( + "Failed to process block entities for chunk {:?}", + chunk_coords, + ) + })?; self.entities.block_entities.append(&mut block_entities); } diff --git a/src/world/block_entity.rs b/src/world/block_entity.rs index 9e60a23..182ad50 100644 --- a/src/world/block_entity.rs +++ b/src/world/block_entity.rs @@ -1,5 +1,6 @@ //! Processing of block entity data +use minedmap_resource::{BlockFlag, BlockType}; use serde::{Deserialize, Serialize}; use super::{ @@ -11,10 +12,14 @@ use super::{ #[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] #[serde(rename_all = "snake_case")] pub enum SignKind { - /// Standing or attached sign + /// Standing sign Sign, + /// Sign attached to wall + WallSign, /// Hanging sign HangingSign, + /// Hanging sign attached to wall + HangingWallSign, } /// Processed sign data @@ -22,6 +27,9 @@ pub enum SignKind { pub struct Sign { /// The kind of the sign pub kind: SignKind, + /// The material of the sign + #[serde(skip_serializing_if = "Option::is_none", default)] + pub material: Option, /// The sign's front text #[serde(skip_serializing_if = "SignText::is_empty", default)] pub front_text: SignText, @@ -32,12 +40,13 @@ pub struct Sign { impl Sign { /// Processes a [de::BlockEntitySign] into a [Sign] - fn new(sign: &de::BlockEntitySign, kind: SignKind) -> Sign { + fn new(sign: &de::BlockEntitySign, kind: SignKind, material: Option) -> Sign { let (front_text, back_text) = sign.text(); let front_text = front_text.decode(); let back_text = back_text.decode(); Sign { kind, + material, front_text, back_text, } @@ -68,16 +77,21 @@ pub struct BlockEntity { impl BlockEntity { /// Processes a [de::BlockEntity] into a [BlockEntity] - pub fn new(entity: &de::BlockEntity) -> Option { - let data = match &entity.data { - de::BlockEntityData::Sign(sign) => { - BlockEntityData::Sign(Sign::new(sign, SignKind::Sign)) - } - de::BlockEntityData::HangingSign(sign) => { - BlockEntityData::Sign(Sign::new(sign, SignKind::HangingSign)) - } - de::BlockEntityData::Other => return None, + pub fn new(entity: &de::BlockEntity, block_type: Option<&BlockType>) -> Option { + let wall_sign = block_type + .map(|block_type| block_type.block_color.is(BlockFlag::WallSign)) + .unwrap_or_default(); + let (kind, sign) = match (&entity.data, wall_sign) { + (de::BlockEntityData::Sign(sign), false) => (SignKind::Sign, sign), + (de::BlockEntityData::Sign(sign), true) => (SignKind::WallSign, sign), + (de::BlockEntityData::HangingSign(sign), false) => (SignKind::HangingSign, sign), + (de::BlockEntityData::HangingSign(sign), true) => (SignKind::HangingWallSign, sign), + (de::BlockEntityData::Other, _) => return None, }; + let material = block_type + .as_ref() + .and_then(|block_type| block_type.sign_material.as_ref()); + let data = BlockEntityData::Sign(Sign::new(sign, kind, material.cloned())); Some(BlockEntity { x: entity.x, diff --git a/src/world/chunk.rs b/src/world/chunk.rs index 5a8937e..bf1d78b 100644 --- a/src/world/chunk.rs +++ b/src/world/chunk.rs @@ -12,8 +12,9 @@ use anyhow::{bail, Context, Result}; use super::{block_entity::BlockEntity, de, section::*}; use crate::{ - resource::{BiomeTypes, BlockTypes}, + resource::{BiomeTypes, BlockType, BlockTypes}, types::*, + util::{self, ShiftMask}, }; /// Version-specific part of [Chunk] @@ -243,12 +244,58 @@ impl<'a> Chunk<'a> { } } + /// Returns the section at a [SectionY] coordinate + fn section_at(&self, y: SectionY) -> Option<&dyn Section> { + match &self.inner { + ChunkInner::V1_18 { section_map } => section_map + .get(&y) + .map(|(section, _, _)| -> &dyn Section { section }), + ChunkInner::V1_13 { section_map, .. } => section_map + .get(&y) + .map(|(section, _)| -> &dyn Section { section }), + ChunkInner::V0 { section_map, .. } => section_map + .get(&y) + .map(|(section, _)| -> &dyn Section { section }), + ChunkInner::Empty => None, + } + } + + /// Returns the [BlockType] at a given coordinate + fn block_type_at(&self, y: SectionY, coords: SectionBlockCoords) -> Result> { + let Some(section) = self.section_at(y) else { + return Ok(None); + }; + section.block_at(coords) + } + + /// Returns the [BlockType] at the coordinates of a [de::BlockEntity] + fn block_type_at_block_entity( + &self, + block_entity: &de::BlockEntity, + ) -> Result> { + let x: BlockX = util::from_flat_coord(block_entity.x).2; + let z: BlockZ = util::from_flat_coord(block_entity.z).2; + let (section_y, block_y) = block_entity.y.shift_mask(BLOCK_BITS); + + let coords = SectionBlockCoords { + xz: LayerBlockCoords { x, z }, + y: BlockY::new(block_y), + }; + + self.block_type_at(SectionY(section_y), coords) + } + /// Processes all of the chunk's block entities - pub fn block_entities(&self) -> Vec { - self.block_entities + pub fn block_entities(&self) -> Result> { + let entities: Vec> = self + .block_entities .iter() - .filter_map(BlockEntity::new) - .collect() + .map(|block_entity| { + let block_type = self.block_type_at_block_entity(block_entity)?; + Ok(BlockEntity::new(block_entity, block_type)) + }) + .collect::>()?; + Ok(entities.into_iter().flatten().collect()) } } From 6da921cca3aceecd9d891cd472d4c2f165dc8a5e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 4 Jan 2024 12:36:27 +0100 Subject: [PATCH 23/43] core: wrap long help texts --- Cargo.lock | 63 +++++++++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 2 +- src/core/mod.rs | 6 ++++- 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ab7a97a..7c96fdc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,7 +70,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -125,6 +125,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "bytemuck" version = "1.14.0" @@ -179,6 +185,7 @@ dependencies = [ "anstyle", "clap_lex", "strsim", + "terminal_size", ] [[package]] @@ -287,6 +294,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "fastnbt" version = "2.4.4" @@ -481,6 +498,12 @@ dependencies = [ "libc", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + [[package]] name = "lock_api" version = "0.4.11" @@ -698,7 +721,7 @@ version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" dependencies = [ - "bitflags", + "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", @@ -749,7 +772,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -764,6 +787,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustix" +version = "0.38.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "ryu" version = "1.0.16" @@ -863,6 +899,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "terminal_size" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" +dependencies = [ + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "thread_local" version = "1.1.7" @@ -987,6 +1033,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index f1b3094..28359f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,7 +39,7 @@ pre-release-replacements = [ [dependencies] anyhow = "1.0.68" bincode = "1.3.3" -clap = { version = "4.1.4", features = ["derive"] } +clap = { version = "4.1.4", features = ["derive", "wrap_help"] } fastnbt = "2.3.2" futures-util = "0.3.28" git-version = "0.3.5" diff --git a/src/core/mod.rs b/src/core/mod.rs index 61bdb76..1afdf91 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -32,7 +32,11 @@ const VERSION: &str = git_version!( /// Command line arguments for minedmap CLI #[derive(Debug, Parser)] -#[command(about, version = VERSION.strip_prefix("v").unwrap())] +#[command( + about, + version = VERSION.strip_prefix("v").unwrap(), + max_term_width = 100, +)] pub struct Args { /// Number of parallel threads to use for processing /// From 9fd5689ebb1dab17398fb8866b337165cd0acdef Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 4 Jan 2024 14:21:12 +0100 Subject: [PATCH 24/43] core: add sign pattern command line argument handling --- Cargo.lock | 39 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/core/common.rs | 25 ++++++++++++++++++++++--- src/core/mod.rs | 14 +++++++++++++- 4 files changed, 75 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7c96fdc..e50f306 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,6 +29,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + [[package]] name = "allocator-api2" version = "0.2.16" @@ -554,6 +563,7 @@ dependencies = [ "num-integer", "num_cpus", "rayon", + "regex", "rustc-hash", "serde", "serde_json", @@ -775,6 +785,35 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + [[package]] name = "rustc-demangle" version = "0.1.23" diff --git a/Cargo.toml b/Cargo.toml index 28359f3..5442162 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ minedmap-types = { version = "0.1.2", path = "crates/types" } num-integer = "0.1.45" num_cpus = "1.16.0" rayon = "1.7.0" +regex = "1.10.2" rustc-hash = "1.1.0" serde = { version = "1.0.152", features = ["rc", "derive"] } serde_json = "1.0.99" diff --git a/src/core/common.rs b/src/core/common.rs index ca6f424..92d0019 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -6,7 +6,9 @@ use std::{ path::{Path, PathBuf}, }; +use anyhow::{Context, Result}; use indexmap::IndexSet; +use regex::RegexSet; use serde::{Deserialize, Serialize}; use crate::{ @@ -147,11 +149,13 @@ pub struct Config { pub viewer_info_path: PathBuf, /// Path of viewer entities file pub viewer_entities_path: PathBuf, + /// Sign text filter patterns + pub sign_patterns: RegexSet, } impl Config { /// Crates a new [Config] from [command line arguments](super::Args) - pub fn new(args: &super::Args) -> Self { + pub fn new(args: &super::Args) -> Result { let num_threads = match args.jobs { Some(0) => num_cpus::get(), Some(threads) => threads, @@ -168,7 +172,9 @@ impl Config { .iter() .collect(); - Config { + let sign_patterns = Self::sign_patterns(args).context("Failed to parse sign patterns")?; + + Ok(Config { num_threads, region_dir, level_dat_path, @@ -178,7 +184,20 @@ impl Config { entities_path_final, viewer_info_path, viewer_entities_path, - } + sign_patterns, + }) + } + + /// Parses the sign prefixes and sign filters into a [RegexSet] + fn sign_patterns(args: &super::Args) -> Result { + let prefix_patterns: Vec<_> = args + .sign_prefix + .iter() + .map(|prefix| format!("^{}", regex::escape(prefix))) + .collect(); + Ok(RegexSet::new( + prefix_patterns.iter().chain(args.sign_filter.iter()), + )?) } /// Constructs the path to an input region file diff --git a/src/core/mod.rs b/src/core/mod.rs index 1afdf91..274bae8 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -47,6 +47,18 @@ pub struct Args { /// Enable verbose messages #[arg(short, long)] pub verbose: bool, + /// Prefix for text of signs to show on the map + #[arg(long)] + pub sign_prefix: Vec, + /// Regular expression for text of signs to show on the map + /// + /// --sign-prefix and --sign-filter allow to filter for signs to display; + /// by default, none are visible. The options may be passed multiple times, + /// and a sign will be visible if it matches any pattern. + /// + /// To make all signs visible, pass an empty string to either option. + #[arg(long)] + pub sign_filter: Vec, /// Minecraft save directory pub input_dir: PathBuf, /// MinedMap data directory @@ -64,7 +76,7 @@ fn setup_threads(num_threads: usize) -> Result<()> { /// MinedMap CLI main function pub fn cli() -> Result<()> { let args = Args::parse(); - let config = Config::new(&args); + let config = Config::new(&args)?; tracing_subscriber::fmt() .with_max_level(if args.verbose { From a1dd77c8fdd5b5d13bc20c60a66bda4591c5cd6a Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 5 Jan 2024 03:03:53 +0100 Subject: [PATCH 25/43] world/sign: implement Display for SignText --- src/world/json_text.rs | 18 +++++++++++++++++- src/world/sign.rs | 43 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/world/json_text.rs b/src/world/json_text.rs index 0f72dcc..a153179 100644 --- a/src/world/json_text.rs +++ b/src/world/json_text.rs @@ -1,6 +1,6 @@ //! Newtype and helper methods for handling Minecraft Raw JSON Text -use std::{collections::VecDeque, sync::Arc}; +use std::{collections::VecDeque, fmt::Display, sync::Arc}; use serde::{Deserialize, Serialize}; @@ -51,6 +51,12 @@ impl FormattedText { } } +impl Display for FormattedText { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.text.fmt(f) + } +} + /// A tree of [FormattedText] nodes /// /// Each node including the root has a `text` and a list of children (`extra`). @@ -87,6 +93,16 @@ impl FormattedTextList { } } +impl Display for FormattedTextList { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for text in &self.0 { + text.fmt(f)?; + } + + Ok(()) + } +} + /// Raw deserialized [JSONText] /// /// A [JSONText] can contain various different JSON types. diff --git a/src/world/sign.rs b/src/world/sign.rs index 43cac47..616f7fa 100644 --- a/src/world/sign.rs +++ b/src/world/sign.rs @@ -1,6 +1,6 @@ //! Processing of sign text -use std::sync::Arc; +use std::{fmt::Display, sync::Arc}; use serde::{Deserialize, Serialize}; @@ -89,3 +89,44 @@ impl SignText { self.0.iter().all(|line| line.is_empty()) } } + +impl Display for SignText { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut iter = self.0.iter(); + + let Some(first) = iter.next() else { + return Ok(()); + }; + first.fmt(f)?; + + for text in iter { + f.write_str("\n")?; + text.fmt(f)?; + } + + Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + + fn formatted_text(text: &str) -> FormattedText { + FormattedText { + text: text.to_string(), + ..Default::default() + } + } + + #[test] + fn test_sign_text_display() { + let sign_text = SignText(vec![ + FormattedTextList(vec![formatted_text("a"), formatted_text("b")]), + FormattedTextList(vec![formatted_text("c")]), + FormattedTextList(vec![formatted_text("d")]), + FormattedTextList(vec![formatted_text("e")]), + ]); + assert_eq!("ab\nc\nd\ne", sign_text.to_string()); + } +} From 87d4371922d0e1b287e253ad73d0dc8521559688 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 5 Jan 2024 03:27:08 +0100 Subject: [PATCH 26/43] core/metadata_writer: implement filtering for signs --- src/core/metadata_writer.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/core/metadata_writer.rs b/src/core/metadata_writer.rs index caf7726..03aac70 100644 --- a/src/core/metadata_writer.rs +++ b/src/core/metadata_writer.rs @@ -6,7 +6,10 @@ use serde::Serialize; use crate::{ core::common::*, io::{fs, storage}, - world::{block_entity::BlockEntity, de}, + world::{ + block_entity::{self, BlockEntity, BlockEntityData}, + de, + }, }; /// Minimum and maximum X and Z tile coordinates for a mipmap level @@ -120,6 +123,19 @@ impl<'a> MetadataWriter<'a> { } } + /// Filter signs according to the sign pattern configuration + fn sign_filter(&self, sign: &block_entity::Sign) -> bool { + let front_text = sign.front_text.to_string(); + if self.config.sign_patterns.is_match(front_text.trim()) { + return true; + } + let back_text = sign.back_text.to_string(); + if self.config.sign_patterns.is_match(back_text.trim()) { + return true; + } + false + } + /// Generates [Entities] data from collected entity lists fn entities(&self) -> Result { let data: ProcessedEntities = @@ -127,7 +143,13 @@ impl<'a> MetadataWriter<'a> { .context("Failed to read entity data file")?; let ret = Entities { - signs: data.block_entities, + signs: data + .block_entities + .into_iter() + .filter(|entity| match &entity.data { + BlockEntityData::Sign(sign) => self.sign_filter(sign), + }) + .collect(), }; Ok(ret) From dca9c394f2493a902474ad437e42d96155d3bbb9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 26 Nov 2023 16:20:16 +0100 Subject: [PATCH 27/43] viewer: display markers for signs Still needs better styling. It might also be nice to include the currently opened marker in the URL. --- viewer/MinedMap.js | 122 ++++++++++++++++++++++++++++++++++++++++++++- viewer/index.html | 4 ++ 2 files changed, 124 insertions(+), 2 deletions(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index 1288dc9..0e9abe0 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -98,6 +98,106 @@ const parseHash = function () { return args; } +const colors = { + black: '#000000', + dark_blue: '#0000AA', + dark_green: '#00AA00', + dark_aqua: '#00AAAA', + dark_red: '#AA0000', + dark_purple: '#AA00AA', + gold: '#FFAA00', + gray: '#AAAAAA', + dark_gray: '#555555', + blue: '#5555FF', + green: '#55FF55', + aqua: '#55FFFF', + red: '#FF5555', + light_purple: '#FF55FF', + yellow: '#FFFF55', + white: '#FFFFFF', +}; + +function formatSignLine(line) { + const el = document.createElement('span'); + el.style.whiteSpace = 'pre'; + el.style.fontFamily = 'sans'; + + for (const span of line) { + const child = document.createElement('span'); + child.textContent = span.text; + + const color = colors[span.color ?? 'black'] || colors['black']; + + if (span.bold) + child.style.fontWeight = 'bold'; + if (span.italic) + child.style.fontStyle = 'italic'; + + child.style.textDecoration = ''; + if (span.underlined) + child.style.textDecoration += ' underline'; + if (span.strikethrough) + child.style.textDecoration += ' line-through'; + + child.style.color = color; + if (span.obfuscated) { + child.style.backgroundColor = color; + child.className = 'obfuscated'; + } + + el.appendChild(child); + } + return el; +} + +function loadSigns(signLayer) { + const xhr = new XMLHttpRequest(); + xhr.onload = function () { + const res = JSON.parse(this.responseText); + const groups = {}; + + // Group signs by x,z coordinates + for (const sign of res.signs) { + const key = `${sign.x},${sign.z}`; + const group = groups[key] ??= []; + group[sign.y] = sign; + } + + for (const [key, group] of Object.entries(groups)) { + const el = document.createElement('span'); + const [x, z] = key.split(',').map((i) => +i); + + group.forEach((sign) => { + if (sign.front_text) { + for (const line of sign.front_text) { + el.appendChild(formatSignLine(line)); + el.appendChild(document.createElement('br')); + } + + el.appendChild(document.createElement('hr')); + } + + if (sign.back_text) { + for (let line of sign.back_text) { + el.appendChild(formatSignLine(line)); + el.appendChild(document.createElement('br')); + } + + el.appendChild(document.createElement('hr')); + } + }); + + const lastChild = el.lastChild; + if (lastChild) + lastChild.remove(); + + L.marker([-z-0.5, x+0.5]).addTo(signLayer).bindPopup(el); + } + } + + xhr.open('GET', 'data/entities.json', true); + xhr.send(); +} window.createMap = function () { const xhr = new XMLHttpRequest(); @@ -106,7 +206,7 @@ window.createMap = function () { mipmaps = res.mipmaps, spawn = res.spawn; - let x, z, zoom, light; + let x, z, zoom, light, signs; const updateParams = function () { const args = parseHash(); @@ -115,6 +215,7 @@ window.createMap = function () { x = parseFloat(args['x']); z = parseFloat(args['z']); light = parseInt(args['light']); + signs = parseInt(args['signs'] ?? '1'); if (isNaN(zoom)) zoom = 0; @@ -140,14 +241,20 @@ window.createMap = function () { const mapLayer = new MinedMapLayer(mipmaps, 'map'); const lightLayer = new MinedMapLayer(mipmaps, 'light'); + const signLayer = L.layerGroup(); + + loadSigns(signLayer); mapLayer.addTo(map); if (light) map.addLayer(lightLayer); + if (signs) + map.addLayer(signLayer); const overlayMaps = { "Illumination": lightLayer, + "Signs": signLayer, }; L.control.layers({}, overlayMaps).addTo(map); @@ -167,6 +274,8 @@ window.createMap = function () { if (map.hasLayer(lightLayer)) ret += '&light=1'; + if (!map.hasLayer(signLayer)) + ret += '&signs=0'; return ret; }; @@ -175,7 +284,12 @@ window.createMap = function () { window.location.hash = makeHash(); }; - const refreshHash = function () { + const refreshHash = function (ev) { + if (ev.type === 'layeradd' || ev.type === 'layerremove') { + if (ev.layer !== lightLayer && ev.layer !== signLayer) + return; + } + zoom = map.getZoom(); center = map.getCenter(); x = Math.round(center.lng); @@ -203,6 +317,10 @@ window.createMap = function () { map.addLayer(lightLayer); else map.removeLayer(lightLayer); + if (signs) + map.addLayer(signLayer); + else + map.removeLayer(signLayer); updateHash(); }; diff --git a/viewer/index.html b/viewer/index.html index df57cb6..8327600 100644 --- a/viewer/index.html +++ b/viewer/index.html @@ -30,6 +30,10 @@ image-rendering: pixelated; -ms-interpolation-mode: nearest-neighbor; } + + span.obfuscated:hover { + background-color: transparent !important; + } From 7834315dd339555f6d5a5aa3e24e4ceba0802689 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 6 Jan 2024 22:59:37 +0100 Subject: [PATCH 28/43] viewer: add sign images --- resource/sign_textures.py | 90 ++++++++++++++++++ viewer/images/README.md | 7 ++ viewer/images/bg/acacia_hanging_sign.png | Bin 0 -> 321 bytes viewer/images/bg/acacia_hanging_wall_sign.png | Bin 0 -> 232 bytes viewer/images/bg/acacia_sign.png | Bin 0 -> 441 bytes viewer/images/bg/acacia_wall_sign.png | Bin 0 -> 328 bytes viewer/images/bg/bamboo_hanging_sign.png | Bin 0 -> 384 bytes viewer/images/bg/bamboo_hanging_wall_sign.png | Bin 0 -> 244 bytes viewer/images/bg/bamboo_sign.png | Bin 0 -> 564 bytes viewer/images/bg/bamboo_wall_sign.png | Bin 0 -> 459 bytes viewer/images/bg/birch_hanging_sign.png | Bin 0 -> 363 bytes viewer/images/bg/birch_hanging_wall_sign.png | Bin 0 -> 239 bytes viewer/images/bg/birch_sign.png | Bin 0 -> 460 bytes viewer/images/bg/birch_wall_sign.png | Bin 0 -> 341 bytes viewer/images/bg/cherry_hanging_sign.png | Bin 0 -> 311 bytes viewer/images/bg/cherry_hanging_wall_sign.png | Bin 0 -> 224 bytes viewer/images/bg/cherry_sign.png | Bin 0 -> 442 bytes viewer/images/bg/cherry_wall_sign.png | Bin 0 -> 323 bytes viewer/images/bg/crimson_hanging_sign.png | Bin 0 -> 371 bytes .../images/bg/crimson_hanging_wall_sign.png | Bin 0 -> 235 bytes viewer/images/bg/crimson_sign.png | Bin 0 -> 531 bytes viewer/images/bg/crimson_wall_sign.png | Bin 0 -> 392 bytes viewer/images/bg/dark_oak_hanging_sign.png | Bin 0 -> 307 bytes .../images/bg/dark_oak_hanging_wall_sign.png | Bin 0 -> 240 bytes viewer/images/bg/dark_oak_sign.png | Bin 0 -> 416 bytes viewer/images/bg/dark_oak_wall_sign.png | Bin 0 -> 315 bytes viewer/images/bg/jungle_hanging_sign.png | Bin 0 -> 412 bytes viewer/images/bg/jungle_hanging_wall_sign.png | Bin 0 -> 242 bytes viewer/images/bg/jungle_sign.png | Bin 0 -> 451 bytes viewer/images/bg/jungle_wall_sign.png | Bin 0 -> 308 bytes viewer/images/bg/mangrove_hanging_sign.png | Bin 0 -> 329 bytes .../images/bg/mangrove_hanging_wall_sign.png | Bin 0 -> 224 bytes viewer/images/bg/mangrove_sign.png | Bin 0 -> 451 bytes viewer/images/bg/mangrove_wall_sign.png | Bin 0 -> 342 bytes viewer/images/bg/oak_hanging_sign.png | Bin 0 -> 339 bytes viewer/images/bg/oak_hanging_wall_sign.png | Bin 0 -> 225 bytes viewer/images/bg/oak_sign.png | Bin 0 -> 440 bytes viewer/images/bg/oak_wall_sign.png | Bin 0 -> 332 bytes viewer/images/bg/spruce_hanging_sign.png | Bin 0 -> 345 bytes viewer/images/bg/spruce_hanging_wall_sign.png | Bin 0 -> 236 bytes viewer/images/bg/spruce_sign.png | Bin 0 -> 421 bytes viewer/images/bg/spruce_wall_sign.png | Bin 0 -> 316 bytes viewer/images/bg/warped_hanging_sign.png | Bin 0 -> 374 bytes viewer/images/bg/warped_hanging_wall_sign.png | Bin 0 -> 236 bytes viewer/images/bg/warped_sign.png | Bin 0 -> 531 bytes viewer/images/bg/warped_wall_sign.png | Bin 0 -> 394 bytes viewer/images/icon/acacia_hanging_sign.png | Bin 0 -> 268 bytes .../images/icon/acacia_hanging_wall_sign.png | Bin 0 -> 327 bytes viewer/images/icon/acacia_sign.png | Bin 0 -> 301 bytes viewer/images/icon/acacia_wall_sign.png | Bin 0 -> 237 bytes viewer/images/icon/bamboo_hanging_sign.png | Bin 0 -> 391 bytes .../images/icon/bamboo_hanging_wall_sign.png | Bin 0 -> 469 bytes viewer/images/icon/bamboo_sign.png | Bin 0 -> 416 bytes viewer/images/icon/bamboo_wall_sign.png | Bin 0 -> 348 bytes viewer/images/icon/birch_hanging_sign.png | Bin 0 -> 273 bytes .../images/icon/birch_hanging_wall_sign.png | Bin 0 -> 340 bytes viewer/images/icon/birch_sign.png | Bin 0 -> 298 bytes viewer/images/icon/birch_wall_sign.png | Bin 0 -> 235 bytes viewer/images/icon/cherry_hanging_sign.png | Bin 0 -> 280 bytes .../images/icon/cherry_hanging_wall_sign.png | Bin 0 -> 347 bytes viewer/images/icon/cherry_sign.png | Bin 0 -> 298 bytes viewer/images/icon/cherry_wall_sign.png | Bin 0 -> 229 bytes viewer/images/icon/crimson_hanging_sign.png | Bin 0 -> 284 bytes .../images/icon/crimson_hanging_wall_sign.png | Bin 0 -> 341 bytes viewer/images/icon/crimson_sign.png | Bin 0 -> 340 bytes viewer/images/icon/crimson_wall_sign.png | Bin 0 -> 262 bytes viewer/images/icon/dark_oak_hanging_sign.png | Bin 0 -> 276 bytes .../icon/dark_oak_hanging_wall_sign.png | Bin 0 -> 332 bytes viewer/images/icon/dark_oak_sign.png | Bin 0 -> 302 bytes viewer/images/icon/dark_oak_wall_sign.png | Bin 0 -> 244 bytes viewer/images/icon/jungle_hanging_sign.png | Bin 0 -> 272 bytes .../images/icon/jungle_hanging_wall_sign.png | Bin 0 -> 335 bytes viewer/images/icon/jungle_sign.png | Bin 0 -> 315 bytes viewer/images/icon/jungle_wall_sign.png | Bin 0 -> 238 bytes viewer/images/icon/mangrove_hanging_sign.png | Bin 0 -> 276 bytes .../icon/mangrove_hanging_wall_sign.png | Bin 0 -> 337 bytes viewer/images/icon/mangrove_sign.png | Bin 0 -> 299 bytes viewer/images/icon/mangrove_wall_sign.png | Bin 0 -> 234 bytes viewer/images/icon/oak_hanging_sign.png | Bin 0 -> 289 bytes viewer/images/icon/oak_hanging_wall_sign.png | Bin 0 -> 345 bytes viewer/images/icon/oak_sign.png | Bin 0 -> 298 bytes viewer/images/icon/oak_wall_sign.png | Bin 0 -> 237 bytes viewer/images/icon/spruce_hanging_sign.png | Bin 0 -> 274 bytes .../images/icon/spruce_hanging_wall_sign.png | Bin 0 -> 332 bytes viewer/images/icon/spruce_sign.png | Bin 0 -> 289 bytes viewer/images/icon/spruce_wall_sign.png | Bin 0 -> 233 bytes viewer/images/icon/warped_hanging_sign.png | Bin 0 -> 296 bytes .../images/icon/warped_hanging_wall_sign.png | Bin 0 -> 353 bytes viewer/images/icon/warped_sign.png | Bin 0 -> 327 bytes viewer/images/icon/warped_wall_sign.png | Bin 0 -> 244 bytes 90 files changed, 97 insertions(+) create mode 100755 resource/sign_textures.py create mode 100644 viewer/images/README.md create mode 100644 viewer/images/bg/acacia_hanging_sign.png create mode 100644 viewer/images/bg/acacia_hanging_wall_sign.png create mode 100644 viewer/images/bg/acacia_sign.png create mode 100644 viewer/images/bg/acacia_wall_sign.png create mode 100644 viewer/images/bg/bamboo_hanging_sign.png create mode 100644 viewer/images/bg/bamboo_hanging_wall_sign.png create mode 100644 viewer/images/bg/bamboo_sign.png create mode 100644 viewer/images/bg/bamboo_wall_sign.png create mode 100644 viewer/images/bg/birch_hanging_sign.png create mode 100644 viewer/images/bg/birch_hanging_wall_sign.png create mode 100644 viewer/images/bg/birch_sign.png create mode 100644 viewer/images/bg/birch_wall_sign.png create mode 100644 viewer/images/bg/cherry_hanging_sign.png create mode 100644 viewer/images/bg/cherry_hanging_wall_sign.png create mode 100644 viewer/images/bg/cherry_sign.png create mode 100644 viewer/images/bg/cherry_wall_sign.png create mode 100644 viewer/images/bg/crimson_hanging_sign.png create mode 100644 viewer/images/bg/crimson_hanging_wall_sign.png create mode 100644 viewer/images/bg/crimson_sign.png create mode 100644 viewer/images/bg/crimson_wall_sign.png create mode 100644 viewer/images/bg/dark_oak_hanging_sign.png create mode 100644 viewer/images/bg/dark_oak_hanging_wall_sign.png create mode 100644 viewer/images/bg/dark_oak_sign.png create mode 100644 viewer/images/bg/dark_oak_wall_sign.png create mode 100644 viewer/images/bg/jungle_hanging_sign.png create mode 100644 viewer/images/bg/jungle_hanging_wall_sign.png create mode 100644 viewer/images/bg/jungle_sign.png create mode 100644 viewer/images/bg/jungle_wall_sign.png create mode 100644 viewer/images/bg/mangrove_hanging_sign.png create mode 100644 viewer/images/bg/mangrove_hanging_wall_sign.png create mode 100644 viewer/images/bg/mangrove_sign.png create mode 100644 viewer/images/bg/mangrove_wall_sign.png create mode 100644 viewer/images/bg/oak_hanging_sign.png create mode 100644 viewer/images/bg/oak_hanging_wall_sign.png create mode 100644 viewer/images/bg/oak_sign.png create mode 100644 viewer/images/bg/oak_wall_sign.png create mode 100644 viewer/images/bg/spruce_hanging_sign.png create mode 100644 viewer/images/bg/spruce_hanging_wall_sign.png create mode 100644 viewer/images/bg/spruce_sign.png create mode 100644 viewer/images/bg/spruce_wall_sign.png create mode 100644 viewer/images/bg/warped_hanging_sign.png create mode 100644 viewer/images/bg/warped_hanging_wall_sign.png create mode 100644 viewer/images/bg/warped_sign.png create mode 100644 viewer/images/bg/warped_wall_sign.png create mode 100644 viewer/images/icon/acacia_hanging_sign.png create mode 100644 viewer/images/icon/acacia_hanging_wall_sign.png create mode 100644 viewer/images/icon/acacia_sign.png create mode 100644 viewer/images/icon/acacia_wall_sign.png create mode 100644 viewer/images/icon/bamboo_hanging_sign.png create mode 100644 viewer/images/icon/bamboo_hanging_wall_sign.png create mode 100644 viewer/images/icon/bamboo_sign.png create mode 100644 viewer/images/icon/bamboo_wall_sign.png create mode 100644 viewer/images/icon/birch_hanging_sign.png create mode 100644 viewer/images/icon/birch_hanging_wall_sign.png create mode 100644 viewer/images/icon/birch_sign.png create mode 100644 viewer/images/icon/birch_wall_sign.png create mode 100644 viewer/images/icon/cherry_hanging_sign.png create mode 100644 viewer/images/icon/cherry_hanging_wall_sign.png create mode 100644 viewer/images/icon/cherry_sign.png create mode 100644 viewer/images/icon/cherry_wall_sign.png create mode 100644 viewer/images/icon/crimson_hanging_sign.png create mode 100644 viewer/images/icon/crimson_hanging_wall_sign.png create mode 100644 viewer/images/icon/crimson_sign.png create mode 100644 viewer/images/icon/crimson_wall_sign.png create mode 100644 viewer/images/icon/dark_oak_hanging_sign.png create mode 100644 viewer/images/icon/dark_oak_hanging_wall_sign.png create mode 100644 viewer/images/icon/dark_oak_sign.png create mode 100644 viewer/images/icon/dark_oak_wall_sign.png create mode 100644 viewer/images/icon/jungle_hanging_sign.png create mode 100644 viewer/images/icon/jungle_hanging_wall_sign.png create mode 100644 viewer/images/icon/jungle_sign.png create mode 100644 viewer/images/icon/jungle_wall_sign.png create mode 100644 viewer/images/icon/mangrove_hanging_sign.png create mode 100644 viewer/images/icon/mangrove_hanging_wall_sign.png create mode 100644 viewer/images/icon/mangrove_sign.png create mode 100644 viewer/images/icon/mangrove_wall_sign.png create mode 100644 viewer/images/icon/oak_hanging_sign.png create mode 100644 viewer/images/icon/oak_hanging_wall_sign.png create mode 100644 viewer/images/icon/oak_sign.png create mode 100644 viewer/images/icon/oak_wall_sign.png create mode 100644 viewer/images/icon/spruce_hanging_sign.png create mode 100644 viewer/images/icon/spruce_hanging_wall_sign.png create mode 100644 viewer/images/icon/spruce_sign.png create mode 100644 viewer/images/icon/spruce_wall_sign.png create mode 100644 viewer/images/icon/warped_hanging_sign.png create mode 100644 viewer/images/icon/warped_hanging_wall_sign.png create mode 100644 viewer/images/icon/warped_sign.png create mode 100644 viewer/images/icon/warped_wall_sign.png diff --git a/resource/sign_textures.py b/resource/sign_textures.py new file mode 100755 index 0000000..e0b548d --- /dev/null +++ b/resource/sign_textures.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 + +import shutil +import sys + +from PIL import Image + +MATERIALS = [ + 'acacia', + 'bamboo', + 'birch', + 'cherry', + 'crimson', + 'dark_oak', + 'jungle', + 'mangrove', + 'oak', + 'spruce', + 'warped', +] + +in_dir = sys.argv[1] +out_dir = sys.argv[2] + +def sign_bg_image(material): + in_path = f'{in_dir}/assets/minecraft/textures/entity/signs/{material}.png' + out_path = f'{out_dir}/bg/{material}_sign.png' + out_path_wall = f'{out_dir}/bg/{material}_wall_sign.png' + + in_image = Image.open(in_path) + + out_image = Image.new('RGBA', (24, 26)) + out_image.paste(in_image.crop((2, 2, 26, 14)), (0, 0)) + out_image.paste(in_image.crop((2, 16, 4, 30)), (11, 12)) + out_image.save(out_path) + + out_image = Image.new('RGBA', (24, 12)) + out_image.paste(in_image.crop((2, 2, 26, 14)), (0, 0)) + out_image.save(out_path_wall) + +def hanging_sign_bg_image(material): + in_path = f'{in_dir}/assets/minecraft/textures/gui/hanging_signs/{material}.png' + out_path = f'{out_dir}/bg/{material}_hanging_sign.png' + out_path_wall = f'{out_dir}/bg/{material}_hanging_wall_sign.png' + + in_image = Image.open(in_path) + + out_image = Image.new('RGBA', (16, 14)) + out_image.paste(in_image.crop((0, 2, 16, 16)), (0, 0)) + out_image.save(out_path) + + shutil.copyfile(in_path, out_path_wall) + + +def sign_icon_image(material): + in_path = f'{in_dir}/assets/minecraft/textures/item/{material}_sign.png' + out_path = f'{out_dir}/icon/{material}_sign.png' + out_path_wall = f'{out_dir}/icon/{material}_wall_sign.png' + + in_image = Image.open(in_path) + + out_image = Image.new('RGBA', (13, 14)) + out_image.paste(in_image.crop((2, 2, 15, 16)), (0, 0)) + out_image.save(out_path) + + out_image = Image.new('RGBA', (13, 9)) + out_image.paste(in_image.crop((2, 2, 15, 11)), (0, 0)) + out_image.save(out_path_wall) + + +def hanging_sign_icon_image(material): + in_path = f'{in_dir}/assets/minecraft/textures/item/{material}_hanging_sign.png' + out_path = f'{out_dir}/icon/{material}_hanging_sign.png' + out_path_wall = f'{out_dir}/icon/{material}_hanging_wall_sign.png' + + in_image = Image.open(in_path) + + out_image = Image.new('RGBA', (14, 12)) + out_image.paste(in_image.crop((1, 3, 15, 15)), (0, 0)) + out_image.save(out_path) + + out_image = Image.new('RGBA', (14, 14)) + out_image.paste(in_image.crop((1, 1, 15, 15)), (0, 0)) + out_image.save(out_path_wall) + +for material in MATERIALS: + sign_bg_image(material) + hanging_sign_bg_image(material) + sign_icon_image(material) + hanging_sign_icon_image(material) diff --git a/viewer/images/README.md b/viewer/images/README.md new file mode 100644 index 0000000..2e840f1 --- /dev/null +++ b/viewer/images/README.md @@ -0,0 +1,7 @@ +# README + +The images in this directory are assets directly taken from Minecraft, or are derived from Minecraft +assets. They are copyrighted by Mojang/Microsoft, and are used in accordance with the +[Minecraft Usage Guidelines](https://www.minecraft.net/en-us/usage-guidelines). + + diff --git a/viewer/images/bg/acacia_hanging_sign.png b/viewer/images/bg/acacia_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..33e319123c44d09445c845a1299c2bf9db230a3f GIT binary patch literal 321 zcmV-H0lxl;P)XQu{alw*QQ0 z#&E37{e#~=K6_47Iaf)uUf-R<&dyco=Hs(DizJ9bxV|!Z21{RMU?J>=Kr;M>^IEIe3nnV4bQir ziUbl!=?{n@3Rv#55G62qS?bWcSJT1}R^?8z#~}rG1MY T#;oaB00000NkvXXu0mjf1pX7P60{i^uaftz<-x8-4AUc?~c!la_a zz%*Na@4BSQ*Kf?{{XYFh>y&W>M`W@Ox44{~97p!u8J&}yTsTvcgPfN8zF+_CA4kf{ aPJ8v)y2q>=ugL%%z~JfX=d#Wzp$P!E2~Q3H literal 0 HcmV?d00001 diff --git a/viewer/images/bg/acacia_sign.png b/viewer/images/bg/acacia_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc6e4701b043a5d7943e9a690aff8b11b63628c GIT binary patch literal 441 zcmV;q0Y?6bP)Kyq{Y6MD49skiNK2X!CsoVPT;jToD_4rd zTM|e2?%CftgW3JvCK?H_;!HtbcYP~X6#yVrYuNl0jYLx%kPlv`Y7Hqoq-qUSR)_&e z;Wc#u`Sm-jeu^{Iq@_wh3a>VAO;UJJC3beD?_Sp-KP7p&Qr<)>*RaZDy-9mO#bABn|AzP^k`57Fmi%JdVnVy=9b^&du+ z6|TZ@)6|@g%}*`EwwUiS(DM9BmV0+zSC`*OuP;xV=f{WclmqgPm$bSJC-_O1PMdNH zczgeFYVI6xF30@_oFb=yWHEO>#s4}%QT+BB006f)*Zlf$wC|U%)AH j4(Rm+$ztx*902|RONs&Lteo+u00000NkvXXu0mjfdvL|Q literal 0 HcmV?d00001 diff --git a/viewer/images/bg/acacia_wall_sign.png b/viewer/images/bg/acacia_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ec6214ecad2b96dd79e9de5f366b18faf5d7a5 GIT binary patch literal 328 zcmV-O0k{5%P)-@25Jex%GV++HNI{p{bxxD>Ek@(r5(myQ9A%!IZMHCyNBmLt|Lua^Ng2EW3!G`MJ_pBT<`JY1gpEv zZ50Y*71|fQ0$E;~+Td3BB-No`ZE(B^EWOF`qHg0}oTUKR`CZ&TdROjbcjYTw?`3w$o4n^Vx{$Z-nW1u=3Qra+`}-V2M(umCca~0BF?> z%4YTGwNo90fuHGFz_%A*#QPcd3?e18OB*xbO0000UUzJ@AlQ6yI1&l2Bg}#1gq-U_AqpR0xD%J3GxeOaCmkj4alkXba4!+xRq=W z`SwMU(xzLj3zPkWpY!zE=JN0?my}RAlEtR6v5nE|O=5$9&cSnPdgqq$@tk@4)OdM# zn1q2rtHkad61%kwHu!j-ev$FIAR&R1ag|{itC7{|bf5KeI74I}F!>QrWkQD}YC8z^M>cc_= zrp?edN#v1t@4b5*eZBfvI_?C=Ly9n(p&3$U=mulKAm(^Tq3@*n(D(Zd*4qT!8@0gu zr?U0WJ<(dvNda0Ab50y{0KmJqfg%W_83I1VJY2zXC%sDhRK{^&)-_hj3{jOqz^4EJ zdUy8|QIui5&5@H00KjKsV81h$J<8v$%k_S}zJbri=ARY>j{5^bh`K}<=P4ZbtaZ_I zS@iC4rC#qF0x2`x?hc^EgE_>#5rh!fKb6QyVU+1wCo6?*_Mq7>$5o`%X9NH+4_)J; zrrKt$yUP1Q%FJZpGoms8fb}--b&*zTTvBDF)ps)kl*1O4MAJ>DPO4qxvvCVU3xfG#ia2iA^x~YtanE`u zwX3$T4^n0TSKr4&ieLAYO?^hdSb${p0Pcxajq5sZ+SA&=bZf8A=t;JUt55ICFP}e@ z!^k?`*nqh=LL6UOiLxTlhOh}b45{PWa*27kvLdj`Ks{oUVc<&%x>Nqo30@Lb1mc(v zK6ZaaKnr4Zxi!K6--A~lwCkG$i`nV>|6II!5B>m*rv-D5Y(V$`00000$ literal 0 HcmV?d00001 diff --git a/viewer/images/bg/bamboo_wall_sign.png b/viewer/images/bg/bamboo_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..818286295f6828c4244b9e993a6acb0772825f64 GIT binary patch literal 459 zcmV;+0W|)JP)qe)PyCr( z&g>2+zixk?!{~z3u_VnF^h4{4VMv+$7jrt6*qXv7-Mwtt>{h7R!~-8b&fZ?l3h%rQ z8blMgyy8>?@Z)=89!RqViJG%a*M!lIam;M5S8Idq&!9iAFfxydSOx$r)5y7~&$i#|A@i}&x^gOF z85jisn_WHXBFogdq*Z0v50!y&*iGwr@va-v%*-Io7GHWjQ~;1=zH^2V%d(q6o_`}z zbAJC>@wC5h0mc!1H+^+d=b~6nJ&b4qmN#?qyl2zvD?u1tj{ejk+p#%lU4b&|)3N0B zrL}1+1Efq?t=~|y!s~I@=dJ%+dzfMGZI1oPe*q|*@s@4RMi>A9002ovPDHLkV1j=h B)L;Mr literal 0 HcmV?d00001 diff --git a/viewer/images/bg/birch_hanging_sign.png b/viewer/images/bg/birch_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4972ce7a71f9a87c0f4edf5abf42f560328590 GIT binary patch literal 363 zcmV-x0hIoUP)MJYI=`q%SLYh!>z|8?`?>+Z*XR2IK*d+? zqbhfFb5*(X?#;g9@%3Y%02Z?pV>Gc&TC6Z6n=iQ@U$+I@5}R4Zw-bU$k=qrUP2pPr zD2r{IjFf96VT`7!YXJ0U=A77IgrWPZwj}^XpFr>dntkPHgh*(* zdDp=C2}7EFMX}DEK#ztjW+_3WSj^IPz|o3FAQQyD5H)p;F`C@2JpcM=`>#QyPKt#@ zkA}oLalTJ101i(k36agLcV_b?HnaW`qa>8({q z))ehpl(}(6f@eUgolCH)j_qGHH5Q;E#*!evUYyJIS8;` z*dJe!KGhd5fPe2MG#Hs%S1>A8ev?dlTO}T zq~O^E?woVaopUqV{oR%DTpKEaFhRM-`4#{W#cAQJj;q$Rr-y67`4&-}!eIuYIK_r* zuuK7m82|v&?A4mddYfM7d|PPXFasO@Q^JmjUY_&rd@h{He128 z833)2;cB_NSt;Aq^1JYroF;v~gA5jc>c1U?qLO(XuTHP4Wc6w)N!DZ>Zt~6hxmT6A37clm^Nu?cOUVNS{OG3XyVzl(|9ZX?;%pe80`sj+|_anj1i^GQ3{?Z??(ydbzDu z(H!~R3>IX-{%zOIyvsbK3;DG#_OIrPgp)Y7F~t13Zh8unP?fnG&|nqMPnj#)c2h88 n;bVUH4+Kk|3-0}k5Vrn5N3`3BIZ6==00000NkvXXu0mjf89bLZ literal 0 HcmV?d00001 diff --git a/viewer/images/bg/cherry_hanging_sign.png b/viewer/images/bg/cherry_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6cf71ccc07da7c4289809da8055311185b69c1 GIT binary patch literal 311 zcmV-70m%M|P)SJ|QY_`E8_`cgpGeqRNbz7+txzrKx*co7()008X! z5CzhAxPN(G5dcWvA<7W|K+JI7n1dk76tb>2XLkeuQ3S*czNw*s&U0?$d{&Vi6jWHx z(-(XO_P<|qK!`sG5%9E4ZM3R3)E0Km8hF}fCc6iFo;CR^g^3yKdXvmU5IFK@)yu%t zpj?jgj3I{f4I6A#=?=<}_SB#~HH&Z*Nla>>7a`8+x>O64`U590j}WhNI}rc?002ov JPDHLkV1jYFgeL$1 literal 0 HcmV?d00001 diff --git a/viewer/images/bg/cherry_hanging_wall_sign.png b/viewer/images/bg/cherry_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..a7325f34714f9ad4b4f0cd39dae864b33c01241a GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=6ZIwstPTo&l+6TN^HQ z_Fn6sd~?doJ2U3ppRn2m9c!6Ny=VQJHjuxM*Jo8_i z|8>^bP0l+XkKxZG2D literal 0 HcmV?d00001 diff --git a/viewer/images/bg/cherry_sign.png b/viewer/images/bg/cherry_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..91b1949046b4aa2d4d13904804840d89b7028e67 GIT binary patch literal 442 zcmV;r0Y(0aP)e3Eu{CKC1-TE74sVapkQxheC0m&VbGls^2liFKipYQqk z-m@dJmuDl=1Qezy;m&F>r)rak6hxa6N&$6s+JSTWljy+9O`fAG8J z;iV}`?CT04c@a4}w}q}0AUd+^eliBlQq`clpX+q$h^M#4+0CF$B4=suWzT_K!K?WRU+ zd(SW7z3+g6^xS2c_s;)WEM{}Fn9U6bBRR$6^tKs%UXQuq5CA|jh*|Zl4nFb~25P_} zV0Cam8nHHK6V$r{n}8+JMsL^zY?HYjusV1cPnyAhUemnzX4SI@xSO*Hh9OH)KEdQ} keEeNp8LT5MzcO|gKiQAn2ZzXpumAu607*qoM6N<$f+xGixc~qF literal 0 HcmV?d00001 diff --git a/viewer/images/bg/cherry_wall_sign.png b/viewer/images/bg/cherry_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..48d9511b151578c15989ccb4b0f20ff68348c19a GIT binary patch literal 323 zcmV-J0lfZ+P)a2J!><`%d=&zRq{ssH{8)U}WZ z!-zP~)o}CAp7$u}nYvboVGSe?-h+%m@E)_9PyrxgbPo3UPSzCl9ES0=tEC8QKud{? z0o=6ygJ}1wNa*?ZazQG1*Wm81n%__7&6!k>evXGwVk{_1QPOi5M$B$PEne7&^D-Et z5MSg8pr~i+T2!Kr414FR21g$OfGs^=g>B>o?-~F|^8LqMbQwK2pC8(IXIW?JRf>5= z&uS*t807d$Ef(wCEss(3tSp7=Vqkn>W;dbU?{(4Oy`J+eefAzm2+zO1&z|{GJOIqD V#mlX_=I#Ih002ovPDHLkV1iJFl;!{c literal 0 HcmV?d00001 diff --git a/viewer/images/bg/crimson_hanging_sign.png b/viewer/images/bg/crimson_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3dabe922b5d3c96d140eb20b867bd4d57ba5f8 GIT binary patch literal 371 zcmV-(0gV2MP) z4q}E%VXOsUs1yL*H-LHZ%bteUk9QFPd~ObsR<;Hpvs?0AgRz!nnFlswEnmeC0Q=VU zEdY#_KA^X*$5^>KScov}Z;=Si zvdn|*ZUg|2IvJ%%d61d!n$YXs0YK^G1mKHU2#mFil_nzYEq1MVf}Vm%ik>uYWnngf zRZ1OH{W~H+xvPSIFIP%UX1Af&wF@A9QWplL6XxshLye(4TJr=-JIpcn@dx~dp+I?E RFP8uS002ovPDHLkV1iWvq0|5X literal 0 HcmV?d00001 diff --git a/viewer/images/bg/crimson_hanging_wall_sign.png b/viewer/images/bg/crimson_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..35a78922998204e89892e7117b11534d6dff7054 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY1=6ZIwstPTo&l*9I-YeV zK@AqcO%_p|meJGfk`}mR{L^D)2P$GL3GxeOaCmkj4alkRba4#fkY#N+D9C6i(zgH4 zW_9Be&(5WkEaHp`=!#l#pp!3*HHY<6*?N`pEuWt<)Y+D;-BacD(}BsOgJ*&u-vbV2 zgIz~8{a063UfzDy=-1(vwtYu)ikc&~cZjj?b?mVg7ZW`+r^CtRQEb|$sM^mtEqU(~ cZGXP!mzrjz;qvjHJJ1abp00i_>zopr0Nqkk!~g&Q literal 0 HcmV?d00001 diff --git a/viewer/images/bg/crimson_sign.png b/viewer/images/bg/crimson_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..08e23220070570a027a2b4628305bb2a54b122a5 GIT binary patch literal 531 zcmV+u0_^>XP)!EA#}E(seZX$@_ale+-jyrs*$IpK!jUOxP@gL zaqKEQ+hKa7N>aGh0A(%63ZAKT>4ka0+Y5p$s&(VpPT8$5CtR+V*9Qod(r_Q z&Qh$rSjervguHmJ)~y_r;}BpPbY>zWRMzt5u_lcPYM{0HCCJz&+Fp zUrzX`*TlON&vuA+DXT%7tYqEu6{%5MOMQg;5FYz9eO52_X0_uC;FL&2dPsx83hoIu|G!zjU4oCr zd!wY_Iy*ecYBC9o74cjv3=|K^P5tET>MOm!@+T6xioy*~NF>FlU=_U@Nw%b%DtPb0@&^>>!oG+SKMgWwiB53SE6Z{Dp`|Rg~22>PLn#$H5 z@Qdj3IFK@8o<`<+&o22>?opf7)xmNM*v8K2V-3;xM8-R}@FhnmutCwX7Wq zhrxzLHslwMtuKvQOjA`~2clI!|74#pKylP9dw({!{GyMq8?b)~(AgkRz4LK?@tJ?$++(nO m9b2&bzr+4SyCUys`ux9E(e_FzKJ<0~00008MAls+THdc8T-`=`(3A8+rUXF+mb0(>9(vzkj^1+abGM1ZEQlHkL#j{IIU z=L63#uT=x!e89~O*Ii5hWm98YS2zzYMA{iN*a_<=Jwg&k&(&&KjevcKsm^s%ng%;1 z@i>O`VhL0LIT9=*|0QcvVqdnNgD(7XYN}0q{z4IeU!Y? jPqTAp7tdIcz`C!pL$-He)vpGiLl`_={an^LB{Ts5`8!uH literal 0 HcmV?d00001 diff --git a/viewer/images/bg/dark_oak_sign.png b/viewer/images/bg/dark_oak_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1307d9f89ae16eb91240b74a278373ecf8b218 GIT binary patch literal 416 zcmV;R0bl-!P)6*MNmWYs*I_%2s-bS&@@8f&RMXCW};Zw?rKJ?{u-31Rfant22p|PS5T{CLq z2j*ZdjGqR^SMvqfDh*Mc+svkeA9VR^25gG}%p*aDY>E!?z2zd+vG4&}Jv?v5JaDaaRo?JRP8lA=aw(X|Njl@!Hu*Axd&L+K^QU@tntixnbn&6^&<|ABggm< zww%ln059R`Zcm$Yc4!X87uCO8zv19NUcdGJln~ISK#2mW!0r zI23t|CBGdX%R=M}Glj@k|CWk+3HVKyIv3rAl0WT%Li2?EOwX|O{{iZq$;jY~4ygbD N002ovPDHLkV1maCkAMIG literal 0 HcmV?d00001 diff --git a/viewer/images/bg/jungle_hanging_sign.png b/viewer/images/bg/jungle_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf1e87821b9d05c83e6089417bd40fe06091d78 GIT binary patch literal 412 zcmV;N0b~A&P)+_4NHGkADuGekGrrU6hL`6xa3GTD+E8uC2HT8sCdf&{HK z^x2w1b^a#I81;uO2(Z?+dfwAC4FKiJZRH^X`zoU%FkQ~cqNY-T(m5F&pi)8dnKBm< z)m?T0g%Bu6C|8b31<7TkQLT;5k-Q%XZ8x zYLX-oauzj<#iI2ezsVxt{RiD@?SNPR{oAY^P*V$Lw>|+K6RtVWgm7d40000ORQ6Vg5JOvMd1rY-EmYeCPJ+yrAYF2ut!t=I~t) z8<|5Y4Y%8Y?|PNK`Z60|#Or0*NJVpi?|P6*SFSRzH(}!osdS}DDvh@^K^>3JPrqt5 z)cImMo^18FZifxq_#$2}K`OE=DF@d5Bv3B&rK_9xA{vZ9IRru2=r09qE&+fxzH@zX zTC{rb4~Xe_QvTSywAKIG2LOU30aY7FHq}fr)l6;^UyxViD+L%0MrFWKX^>K?*)p>6 zcb)+Yi}|cr%xA2F1gH7#^&N2{Sx4=0n&U*`;Lv3)U@3?~7f`JEyaheC!<)`skV=gY z^~GAi$^Za{J+HmV082rfNW5rX2rLCh!vH78ebxe&f>oMhmFDe@23QLEk%#>*>n5Ip t`-cqQ+S%QLDCE6j_JYqY(DQkZ?FZSv^rsoE7bXAz002ovPDHLkV1iT_%eMdk literal 0 HcmV?d00001 diff --git a/viewer/images/bg/jungle_wall_sign.png b/viewer/images/bg/jungle_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..6eb610b5928ff182b22c0ff41d4ee3e5e6dcfd88 GIT binary patch literal 308 zcmV-40n7f0P)2jMHdA^fuz-|7PZY zFE}5zeU|2+%Bq0Qrxmlx~hYBFOt4xgrYQC0=G zMbp&gKsQf{z3|IdkMSZ)bFhabS&Zh(g6&HH;1eI5_M84=20uuwmn-w*%hKn6I|l%Q zD*?k8xHdf-rf0KbykJ($l?7&LZVHx4gPYRxb>!p!-oXnhvd&kZX_>qL0000BWhkG#EqEG&TZ5ibJ(odaBK4q^xbo`LQ?qAV?Cro3xSi*+daLHx(9GT}U63 zFq3gH2?4jx)IO!~!=V|--vJrGEiH(tA|xdW0%70Gbc&k5Ep3a+^bWOGY79u?n9bb4Kp#;Fy#jG-TW@%cX9ehb(5m02}&bB2g+(ek}%EH b`^fkQ6`_DE6{Z5X00000NkvXXu0mjfKemSv literal 0 HcmV?d00001 diff --git a/viewer/images/bg/mangrove_hanging_wall_sign.png b/viewer/images/bg/mangrove_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd994833c96e895eef7076852a18644f73fa817 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeX1=6ZIwstPTo&l-(db*{C zhE?WLMo}0)=ApRWk@b{(%O}&a*LbG zd-r_r>~!$?{IXMt0fkN(>}OZ5$g9;9?RQ-)SBYuBLIU(`3I-+&Ou?`&b0C#q!ZbJ` z>k87(=Q?G3^#WkRKuDlKRg4J(lxXeB-hHdnBYd7_^A-qMwTy-etF>;@t1pdibTP;H zd@@a(9t%W!D;yCc^76S(D~}bTDp?n#mHecjxzGy0%jYUFKq>*$-Z}iG0ox)#JsS^y z@bPfJ>$W`_DgZe27Y^S&d_I{b&5N#=F`}dSVJZ(ickwy3M6KIkJ7<$AXLDVAPF|6( zbe8Q4vo3SQw^38n6s$Str}+DOkXc)?ev_Yz@3QT^jrZ__;{Ek;H+y?JI268Mry=cF z=9?gVu)w9f=vScE4zvy{9xQM(R>1;11pG7iezMa@(eB14{-Dnl$n-XN27jM4@&KAR;1mD=002ovPDHLkV1jL#%Tcwk3xxPS`K2cwxFWjk1MWyHxlEK%3m^isWy%>ytgFoQ(`S$*B zp1?K)1vxLp;+Q;Sb*mg6_g=RRG6m`2o}mv&NFtYVC#B41hwuS0c8lr z0uia0G6YQ6oJyX4)9Ha;hyG`igg&`*<8Ysc9KL@I*xNqmNUtwfUu101t|$uDp{?rm z5E5gDHU*c0?3pJU-wS&HRlRnefM5YE>EreG*tdOd8~{A?MS*)o zuP;}h7xpYWw1@E~*eB*Cz2=s4#fCDQG40%egNHQetT0lYjtv_+mF zQA{Yp)>^EoI8Dw0*jfufC<4H0y#nCw@p%*gEMDI!Z9|%W0bot#28%p%yq*CzY3@gu z%EVJwH;PaMYbqp)y$DV~qL^87=ISo5;-zi8Wlo^p8E1Pc6SrBj552?5IPx8ow)tmK zMU_*B>ck1CnqKHHbn`3pjq0889rU*j@p@N$|3wP`va<5XzD>>FYbrZ4a^eW lmKy**><<8u1ekr@$1h1un&VF+;Q;^u002ovPDHLkV1j6Sjeh_D literal 0 HcmV?d00001 diff --git a/viewer/images/bg/oak_hanging_wall_sign.png b/viewer/images/bg/oak_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..9212d0787635ef5c56ce50007c651e5ce7555a0c GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY1=2^CWFDBCv~z02y1t-A z4c;?roF|q#dIqH0xdf}~*uFe_XB$uvV@Z%-FoVOh8)-mJo~MgrNX0GDBO3(|8Hl(X zEN?H~Co+rS@r(mK+|Aowc$p+{c6bOJX4@T|Un;|YJ-1+%wr1*%!}h@pTy6}9SR52$ zPkr22Ki@Vb^P0)bZ6Wh`HCyv9PYhyY9C0r@=Da-JX1q(@O&O|Yw5=Dkp##d3K)KQi0Evo#P4;{?CcP-jmj=vD0Kgyg5wND} z^v-NL$%Z`_0E`*_bv9*sad~l;e~dTlcE-Dg%uPI#UT`x1HBO=$#X;aPmgz;X3gO9a z;lU&-!uaGkzf|eem@(C>^!Ym=P@aG}(>nZ1|9E$m-QS#N^~_)F*pNG&4%SN76Pp?| zftA7gJZ#sX39JpmukZE@)=J}aA4r00001sx5JjIsg(Ed)4Q6qZVj++dY#?XI9l{=DtDGWD&XEh5u&_aeWxI14j~E--&Tk~o z%$LS*Q1%R&%?vjCCOZ;KMM>rD}D|)Ky6r0zM2BF2{#~-nTSB;c@`1b6Dr% zUM{oFvFA5k2+__^>*YKG91oVC-;OP9)vV>R@6Y#9cd5Hs)7FfZ zej^)62v3o4l@*}(Ellk7Y*K!+##aWcF9E2ll14SP=g+Q}^LRX1fF#5J&SuSTUSFQ$ z$7x!Zj2{xrQ*|l7(Z%}Lbdkgahe%^w^PA>&r*Qe~!Suf6^z;}H^|RH+>)l3(7u z@ys)vaC`qaJw3lnT)>hi=EHt}cWL%4PvphdcXO3U&Wi$nzwK4SOI`)=_WCe&7L*9z zv7gYgVxt1-*iY2DLWxux?|A?CtQ0_FEC98T+^j2%cW9}w9@_rYLlr#ZTp3}j6bkL4NaciElF-h2XS40*7hpy)wtWR-r r+xZUE@`rJbVYD2&KH7}EMGf!|w&au6%J{1?00000NkvXXu0mjfg|3~2nJ7AKbLh*2~7YAXH{PS literal 0 HcmV?d00001 diff --git a/viewer/images/bg/spruce_sign.png b/viewer/images/bg/spruce_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5cbab2870257696cc9e9d5d50f1a6bd78627aa GIT binary patch literal 421 zcmV;W0b2fvP)=?UzON?Z6c?GwIo#8x1fbC6-kFcL#BEgt~Hnee?&Z4{PnbYNdH-4lo zGdk8sc3}@}o)$J&`vp)2CR?sM8=pRE%GVCqH32rAtGq7Sr5`L8^Gb*Wz?>hX43bu)K33n5D(`S@G~H5Fv=`t}}FJlNpkeAKVODF`wsRyz0= z|LX>8z3$fl;A(pOPx>>1p&SMk4>m|f5^Z#U2B#p{Aj`k{GbmPJ@c?`SB=F;21sx5JjIsSi%?X;cWJuziM%yh0L#EegXpXgi*fU_;m{+;DAXIswvCZ=4> z0G(^`X+5Q$UQ3!D`J3nCHUn7Oky7ADM>Tsn^Yw96Q?93}t3TM$yWhw`62em?T;&Vk z6AZ6fy_=ff?D3Ta>q~%TazB-(Xa45-xXspf09A(n-OZlA>|oKtb<244yfLrU)%->m z>tEAF5)&LEjd9O!#@B<;55_0>y!NGOh`GvG;z$1S4n)Ee>P*kH_5T9oNXvKIM+U9{ O0000R8Rwt> zF$$dO{&9GCdVV=@rOt7lZ3csfYr7Y5UU~SPOm8A7;~c>zncuX0j;jF-Ki&`da)t7J zj4zSe0APFxK=~VhnN7${&gbh}%>zh&z5!Ur3jm@pBGnqH4f%5A)TA~fqw#UbO*H~Q zC+K5l6Ua?Pahq&h-)y%4*ze+kV84sWvh-qR<@>IW!U(U|B})rz#lbpWAcS&Ydy8hf zb&PVdT`ospS-oBtp^hY}*6yu*2Y`AbC#cyo~&4NQKn<3 zDwJ}r{v8ouyPmuJ)~-;BD2&`&IWEARZT32(-UyhEz5s}I$o3S?3XlirRrPoO1Js(F U;%w=8PXGV_07*qoM6N<$f-(N0&Hw-a literal 0 HcmV?d00001 diff --git a/viewer/images/bg/warped_hanging_wall_sign.png b/viewer/images/bg/warped_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..a80b913b4f57582eccfdc3d702d0b96cf0e4f4cf GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY1=6-Fm$@vQZ#{Fm*_1xR z-X6p5R=w5=&wx}rmta*LTcfm~*FZ&#B|(0{3=Yq3qyagVo-U3d6}Lo>DGD7j5MaHq z-~Q+}=@diVm2dX_xdj@El6GzQ(K2@1Faj f!zR} literal 0 HcmV?d00001 diff --git a/viewer/images/bg/warped_sign.png b/viewer/images/bg/warped_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..8fdc1811466fdfd0f9516760a56828ad680bef21 GIT binary patch literal 531 zcmV+u0_^>XP)09=GCaDYk(q?!dRDy%GO zxw4u}5w;P-A{mng*oK5&0BeHa07XHmTS^#jvK&u-*tq7r$E z4nhECQqH+8dM7$L)|JW-c}nT|h&<(@vt8#2fATk2olBeEHQAcxO3#NYg$_cxD;tVD zoqvtfV$(LgGdLRS)l8ev#%cQJ4xU6eGX8OYx7EZi3Y;WH2Vs5x+w^X~D1fD$FDG>r zrsd^)0WLb*_`ufXq}Da*-KKoafR{}GbPzI1Vy05kXV^F&qhI?D{&hA@dMo&^-{|Mj z3vHw6SUDtTR&;BFgHwmoS5G%*pw$_NZ$EF&zzov{t_^voE1~>iWnk68bydtwEMV2a zZSJ{M2cKS!DaGT>863Qe`FLpc&g=|4{f+(i@p|HI4FK-#^fza4T@_ZF!+*F%zX4r? V2qbK`zpMZN002ovPDHLkV1lR2_ALMa literal 0 HcmV?d00001 diff --git a/viewer/images/bg/warped_wall_sign.png b/viewer/images/bg/warped_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..86a7cab7ffc5850fd99b43b4577d9de826a6fcc1 GIT binary patch literal 394 zcmV;50d@X~P)*ja_Gl+@>BF5d&{W@K|B~DK@FuzO1B5ITTR*6xrCj} z+u41SIMHgUPEyj0VNqbqC)+jtbVik@bO&Q=-APK^Do^Ry=NfN@NKt2mv@rd9H2YooKaGRh}ZUgwpd7S;DT< zH$LIlzmDcy+IUyH)t4(h9}YPx2Q42hZM-vD%vIB=E!t{q@7&Q#bmjQ- zVcOcnFAAJZj0!^Y{kQS%uqc2F&-<-Wp|5=D7hu=v;{(0@)^Il7wfWTpzH9=Zf{@83 o<|rjY#@6|0{^o!1-`UvsA2SZ)klU!ZLI3~&07*qoM6N<$f-AqeT>t<8 literal 0 HcmV?d00001 diff --git a/viewer/images/icon/acacia_hanging_sign.png b/viewer/images/icon/acacia_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..79c8ee59aa2db7815ae483cc5e194352b4536103 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^@!3HFQ8hUO4smq=&jv*Cuk`o-5;^N}|OBOJc zSgJ`JK5^oOy-_dEhLeVh+Bdf4N-OJ0UwkSdDIp=j_w?5P^n`?jA0OYcGlKxTID4Dh zj62Wc_e(a3&reQi(3Ag|N002ovPDHLkV1fc%jzs_f literal 0 HcmV?d00001 diff --git a/viewer/images/icon/acacia_sign.png b/viewer/images/icon/acacia_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..c698b7d3e16b3bdd08af2de3c9dbdcb8f90e7ccc GIT binary patch literal 301 zcmV+|0n+}7P)fggC z*|@aM0SaRY#MpY8o8wCEz0UtVFNj~%&VoxYdw$(p@|xhy)n)bmk)ib`clV=T9luGs zI6tG)KG}MyQ35#awD*_(O3(z8r3XJW0002ANkljpHB<4fLu n=6~Y_`Av-;cmEgt9b z4n?f6@G1_jLEd>E9>l?+*50`$Yinr7?w?~(Lz;Klvr{;YIiV1jf7c?hUkwRVyn}YKI~~9 zsYICm$RU@G&qpof^VAwGHqP1&M^zfH-rJ68eEv1h%KN{j*Mj~s6&Cp5o%F3l`z lN7w1;Uv%}ElYj2<7r)?!lX74GjavW!002ovPDHLkV1k%JwzL2M literal 0 HcmV?d00001 diff --git a/viewer/images/icon/bamboo_hanging_wall_sign.png b/viewer/images/icon/bamboo_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..a23377edec284b4cfc9310c02864fce00ea24789 GIT binary patch literal 469 zcmV;`0V@89P)7>1uqg2n5l^fZAGF%l5kAyeq=EE$B3rRZRXfUTntq(c|8rc?HIEV$lM=um_> zI65en9CybZiI?P}hMX;da|r+CPMdf6zwdv4zW4oJe#tu93&!IS&0`gS;c&>;!!<^C zJphz+hA+*VkURVkAj=A=i$5mmMTx7c9@%Ub*LAt>26&zafU1sSoaZGmodGdaDwTja zc+4e4Q7)H*=o!WTxJ2}UrfJeV#mAfkaQS;DkYxpc@py!&MGp|=Uu}Gs65?|E;}2}x z;@{s}hMt3MTiCY6=KEu+2U^&R0STB!Za6;gKK)|h*$cLIe^RTrSXo&Gz;JwO^%knC zqNFo%tL?6fx{%_zoTSsAkY1dwbmvd=$StSn^d}VZOL42EVv$@t>^Mb+5x+t2400000 LNkvXXu0mjfynfuq literal 0 HcmV?d00001 diff --git a/viewer/images/icon/bamboo_sign.png b/viewer/images/icon/bamboo_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..d8702d1d0fa5a2521307741c8d1cfcdc74d0f911 GIT binary patch literal 416 zcmV;R0bl-!P)YU6vlsPN=k1N@j^i`R8Smz3U@&S2L}fgTokmU;7}YKd=EGA0dx=@r05H{bg`r{ zLGjNmwkEbD#-SLLrr@2c>#du zxj23Z5p3<94dP$)*@Jz68~G&7x`Wfd+?788I-k6BnbAL_|xk>+Nn zFs(A(&P%3SCh4x(L>exgFv%q4GL>Q-+pb_0GpElc!Qf+#a{2}qd7IvGJ;g2n0000< KMNUMnLSTYTe7V5@ literal 0 HcmV?d00001 diff --git a/viewer/images/icon/bamboo_wall_sign.png b/viewer/images/icon/bamboo_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..9af0ac2de38d0103c1e0b2aaef2264c5bb273a65 GIT binary patch literal 348 zcmV-i0i*tjP)3XJW0003aNkljSijT8Pv$xJkzGAC%C4 zD4R(cn-=0wNYGu~bGY}M%RNTF+en14`EP~coQx1Q^=1d9Je2YnOhyFSM=6i}!&~aj z4uSU586j*kwo}ISBaY4=ky3Je_CTxMqgves!1W_q?H;ZlQ4l7!Q^x3b8;RDMf-w0A zR{#`*3GfT+iQ`a%K{vn+ykJLhwDcW!|BD{ zy8pqCf(5l5*5@r3Zag00000NkvXXu0mjfG-P!u literal 0 HcmV?d00001 diff --git a/viewer/images/icon/birch_hanging_wall_sign.png b/viewer/images/icon/birch_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..85f9c2ec551db3d387b258ae220430c03b564e6c GIT binary patch literal 340 zcmV-a0jvIrP)|8Ns-pi74iIlmd_>3AgPN4v&uj*yha_YfS(3gUS1p z$#f6PvIxVFk@rPab?@x_RP%8hC!;}iucZ>(wzF!iYMa-p7I>a#G)=5~20$?G=Qqjk z{PbY|Z|AQkWXi?WqtQ}_H|{+`rumBEVma4$nm1ppOH?6KX3>U@I{={L4(N4<#jshl zDfY`$=%^x!o1UjB5i2g+PbDf)+}i67wY(bTGXEn}p(;#;rixXrqK^9VkO`UYglYl= mpWCVdf`LB+VBpV)!nj^Yvw|p$NwWfgjS-w=F;&S{w9U8tlzKpYJqqK! zPrE&U-8gt+O|4exR7=&o+y7h7OP)Vk17#e%$K|pk)TFTf($}XKozHKzHKeLK8us<{ wEj>hhe2`@6=YTWU~{Y!^3{cK`qY07*qoM6N<$f_y)Qb^rhX literal 0 HcmV?d00001 diff --git a/viewer/images/icon/birch_wall_sign.png b/viewer/images/icon/birch_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..b82e681116fa5bb435d6f7395c11cdd67c6c499c GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp@K+MU(1|(lrEz1H@n><|{Ln`LX?K9+V3J__vKdPAX zqW&v)R%ubewVkRN861DYo19tR@dbWpdG{gD$&>e!+|JN+E17dUzjM#Z`p@K0&ETTz z*Ii*ZtAg#8a+YQMyp|0ASvdk*Co>)>+NyfCtmCD}=DFvc1HH4^uAO9TC@orW!aF|W zti#0VThbUFXzrb4MkCS_by&~9>DkKvIo#g01$+ut3l&w zC3$*#@qAPKS%0CGL@SBtTKiTX?`NKtVnEeOQdTv2mNFVo$g`B~rm@$`s~&r-^&wrB>=t^EsXXttP5zf}kz e_Paj~0UQC!qlXDA^IReT0000>VV(ZR1E_zfJ2gU}&`I%V%S=+L<65(^co2z3aB zfJDRPjyRNDFSP{)|8Tr_?|=8+k7rH0{ZdIm=jjoEG)=iYJf`8a09f^|j!sZg;D|iq zBY9;qnc%uENs^GhKV!=D=5H}=cdzE-`+ms=t$KEqc%E09(bPK6HXjTI18dX7RnG#L zcKanP76ItRn5sM_3l1*MEW0YcJlvyXfszFx&-A&wy{UPs5KB}g3x=bJuouwU+9B)( z%*L^vHXKFzE`?a4#@C&)(fo&v7xr1LS{q;x6Lsop|+f(_)=35;W#*phY?fl{o! z$V34-)BG?yv-1V1k~IJ($6brp>B;V%yLV$Lm!I@7Ir?$t!p#COy?;Q@o?yLlcc&i4 zA```QJaNJC1RcdbAQOd-Vq~HKsIr_ORkCKiqN{3a9UkC+*HL`1)bs(qvn>K+J=$P2 z^cZ`zrau@B|Bolix0lX^y~N`6{peEAX5L-j)?r_;*lc*7fBedbwo=#^gl89IWz~+? wX1ef}!WP|2H2gk1R(~%208B227xnu%Pyhe`07*qoM6N<$f=D!nPyhe` literal 0 HcmV?d00001 diff --git a/viewer/images/icon/cherry_wall_sign.png b/viewer/images/icon/cherry_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca0429bf6e8726221df53e9306bf611b8b0808f GIT binary patch literal 229 zcmV^P)3XJW00022Nkl9rYIM3AXU3q*0*|vWq5IENrktU-Ocg_hvq? zl41ZrcUU(#tyiOO>|PuC#~mNtp$?f1&kMkQyF+D1Xlm=De6&H7l6{ieV3MNp!UaSr zQF(zVB>?ZX!>gniXlj;fFvj8m?z+m0uTS$iz^i={pp8Qdb;@5JjKKidcwr$kig6l&*XO%J>wVB}d3H($JY3P^6#&DFqeY3PnOe30P<&rqwDhSslKiu6dm>P!vUU>tfrB0N%!v8sO*e1VI0xd$A~9 zHm3cvh1TQ3@Q_>P_i=Zls1l+KaHiK0okJ!_!G#wgM?yl^I{2EZM@ ixmOL;)pm3DqUaxC<7U|#8Y+eW0000Gyx%@8<$xHe1I;^Q}kJUgg%BFcj+6r=%OnH!7ikkRTFG0Z4=9s zxR9AnVhjB@=klF1=ZCTS-CmXdtXbUO0x+M?>3kHl&&~nZ$MVezdpMhreq~%-FL7O$ zEX(*5DW;k%xN&QoIF2h0sL5I?iK3`7qp5wYWey}sVja5JWEMcb+p7SU+YJDhC#U}w z6)UCW@#V>~RrC3M$irQvp;9UYujN#;e6!kFEu|!MJW?U_@L)XB%c0}x`dbzN*udYP z`Mw?ue4hYc=YXzfg>g~&SFaAnqgrmp&Q*JNv6PZj2tvox*3@vbSF`Hawzjm-p4n4Y nZ2+-eaI9)p-=>qJ7nObiisO*Y{#yFg00000NkvXXu0mjf4Je&o literal 0 HcmV?d00001 diff --git a/viewer/images/icon/crimson_sign.png b/viewer/images/icon/crimson_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf1ae7e0ee77ddffabd26ca1c013bcb8177b125 GIT binary patch literal 340 zcmV-a0jvIrP)2F)U`j55Ua#amRi2z%eY`aUaL909eY1Qm56<=gFE~=l<>K zs~(`--En^_X_Et-9Mur9l+1iz#TRE$={H}>2vMsXK)tS<8{hW^KWvk~M=ON)@w)SW zRK3B=^k1Ss=Nj@$+srSH&vM6o5~AKYH(&QoTw500003XJW0002ZNkl))H!cCmX6&%2_7qF7(PSQjd=vz^dQ2I2}u%OSM72jqizs!8| zO=UC~-T=}f2f&C>%25h{R;^B2{7f}1a>k1(M&x4wV7Xc`31=kN3zKkWdDV#E zIWDo*0K{73M}Zyi92Y+d@EjL_qhwS@gW)Z?Uiek>{rV9PusQa)buyufQHm;~sdE6DIwy&jc3M$ocHfKfQTxHnJu*Ockg%a-v2mbHXf=hmt0J)09Y=Uyg%G=dU60j8(XCU>*e)}&rN|bpEDQ?NRou- zw>7$&tap4^;{-vV=unfHW#TxF(xa|6X6gsxI5xT_Hkko18xIx0R{Q{99hrNLB@Jo(>08!{MvisFEf9h8IOvt*`ESFu+ zt0@%)_fH=?t3Y+@$nMv2J#GtCw;F{W{?x6kmG<=7p4Cg|TnX9v_pMeffMossrzTw% ez+%1mcjGS(V3`n&rxsBF0000Nkl1Pj6 zR~9A4I<>`Y?lic6aC6%)X7m5+spV^VFwjOlzkmE0^190FD{a@Cg3qeq@oDvI$M1qJ z&-(mk=%#ftiFU!p8wPM{Ou>Fm@-~6 z3M5N%q{}flzF54}z31sSff`-glSzFN)>;g2wrNk(TJ)C3TXg3g@np?YJ-ecq1H!W} zsg!ZM&YY-b=sJ_}Lf1i{G27-QYVlXreqkuL^?h`4`Fk0M{W^^judn!>J(#({eplrQ r|FaM4_dck3t0vCYbo%el;+MQ}abX7q-hC?vdV|5!)z4*}Q$iB}w31*C literal 0 HcmV?d00001 diff --git a/viewer/images/icon/jungle_hanging_sign.png b/viewer/images/icon/jungle_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..ec89fff07f8257102a95c0d3d210063d4c045b0a GIT binary patch literal 272 zcmV+r0q_2aP)ZcKKQL5xyjvD?l5F0_)mLR2C(ow`L6zU7>I zzw@2@yP(N+-IM~od!{swQ_y5sdZ{_oiQi0>ivL2j0G8X;Pa$0vz&nsR%D+50000Qr)s4`EctLpsm{Zo%B zMB4Vfn)1b*tJ}n~&HQ?6Z!oI$W?d9Z0301v$JEjEuYBT}>eBVcFjfmo9s&KW|9G{*cq817OM)qDQ&g9p^# z!zf-@n)d;6J;M`GHJZUOA#>0B|HkvKZ*NvE7E zPJ!kwnSO!h3~&0y=cHQXtX}mbI`;i`ak&ez{g?hczFf^$aGiZ!$IA;keY%nV=l$<} mo>z8zJ$u-@tlA%yUs!~W6zqG$T9OC!0E4HipUXO@geCy8nPJZW literal 0 HcmV?d00001 diff --git a/viewer/images/icon/mangrove_hanging_sign.png b/viewer/images/icon/mangrove_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..f53bf222da33086ace8342d24d0d0a592f3cf0eb GIT binary patch literal 276 zcmV+v0qg#WP)lXrql?z&0lcR+g3l&txsRi3i9P1d-SXHYscZDa5E4^9RO4ceC*iea-C7 zn>X`;BFAwmKIqxg#lyDkO0BBidAd5_d7k#^;>} zL~|WPSbg(h7BVo~Zm?Uu+B@boYL}=GIUIzM4Etp)|4DIaqV9I}m2bLcI__$r z=_0Wburz_c*&%lN)Nykm-x;agI1U2OvojoX30G?Ir-*Jh8~I9)cG#QSjD!!nSQ@vl*+& zE6)>@Hob$x1~qlN-I5*J^i28iJg?NNu5F&F4-AJxW7ow^&j9H6Iwip8G6&%JsQD`> zJ(0rI^~kVf^Dc~VPn;h!SAoGez-zQBZ;@4~A_c#gGZ+VIIGjc*>=$$OU*=zR)HtrL z{H2vJ>EGTMrp_<7hSR9_)@z=n09X=LV!Al^#eBVfy2g|}7pIPTd2w2bbT3kcY5^os jwqHt<1@Qi{_;>Idv6iKaZ^;r{00000NkvXXu0mjfDzuY_ literal 0 HcmV?d00001 diff --git a/viewer/images/icon/mangrove_sign.png b/viewer/images/icon/mangrove_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..467c922f098c01aac3f08f2166f05fa46d3bf2c8 GIT binary patch literal 299 zcmV+`0o4A9P)q-sOO+=T`D3oM;k`(^zL#(oC_Q>03jvba)(h{zBc3W@F7h%iJoMKw~( zTb_0FuI~wE(@6_ZHwFN$aMK@jdw9{KZVXz1-tGwN#_+g!>cBw&;6BS(ih{BBPV!qA*n6EQL{&SGp3XvD2wgR9rl3+HSv}I{Hb-r}i=>hI{kr%(34mp6?DI%?K zYGX!DgBqXD2kCOxYi8k-svqOOo-rZieNfNVp`{ZG3XJW00027Nkl>Q}J8Qx!<3AJ}?jjK}HFRT173s?`P&TaZRh3hA<4RvWrE{0{9&CG5{fu0Mu&_ z7eS@TRM72zShgaE<1aex*OQnBqBvo-J!ow)-{e(gD)3x~C{DC_G@0tK=Q{em+zJ3} zfM(;7_qUcdmhAw~FHiYJ)nENOnoQ4jbIRR5zbI2d6eoDDqpK-%kvpqetJeRmXL72l n4e&clE{wNe1APCi?+*R}C`(~`{oRq)00000NkvXXu0mjfhOK@N literal 0 HcmV?d00001 diff --git a/viewer/images/icon/oak_hanging_wall_sign.png b/viewer/images/icon/oak_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb9dff4474e0a9c3206ee8e0883638ccda22954 GIT binary patch literal 345 zcmV-f0jBKZ@vgI{>U>v*`lqN`HsLC3m84ibOu@<$CHHr&{VMuist4snIkMtBEioXD8 zH8)m_g2hS1#pSgmi{Z`fJ!hu}KQK4gj>kM$W^6WH|Bf z5<~#V0R3)<`zZfSGwv+!@QBBKTnU$h8H(S5P rE6zkz8Q^K+tt|c}8Q|g3|F`iQJ6ws~TX2!D00000NkvXXu0mjfja!!` literal 0 HcmV?d00001 diff --git a/viewer/images/icon/oak_sign.png b/viewer/images/icon/oak_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..41b46a58a2b11ae8efdc0309192c26b857636321 GIT binary patch literal 298 zcmV+_0oDGAP)!MYIAi-6C!;f*qjiI z6}^5``L;HK>nMUS0U!tyJU^}iuA}h$7}rq%%$9;R=yr-lwqjqUAD>_Ifa<&F$6HO` zeE^-VQQ8PWm{j%UEhqi-|23XJW0002ANklYh|7wo;9o0|fs2y6+GP^!s5h#E3P>)zl;YzU>AsYP)^+T$=FvN2F`blV6|kHDx*woQNr2qf`07*qoM6N<$f-B#28UO$Q literal 0 HcmV?d00001 diff --git a/viewer/images/icon/spruce_hanging_wall_sign.png b/viewer/images/icon/spruce_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c872b0fd748cb55781b3d82c822b2fd7768c96 GIT binary patch literal 332 zcmV-S0ki&zP)`R*Grg!^yO*8>SY%Yc3hjSIqCuBdKkrLpH6##wFPag zlxp3h4ge=gMc@68p8i^7R|7@#JXzihsjBk1{pj7^gY5ZOnO`?S71U}zaTiqXU4{T2 n?i;s5e??c7^Y0&=aTlQjmE?l0{sXrk00000NkvXXu0mjf%?ovl literal 0 HcmV?d00001 diff --git a/viewer/images/icon/spruce_wall_sign.png b/viewer/images/icon/spruce_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..69a9ad95ac48bba261dc08e3325ae69aaf95102a GIT binary patch literal 233 zcmV3XJW00026Nkl=KXnUxAg}A z=@bCg31c?v6#y$eAf3WG;Z+Krbc)02ighvr0QSc-QF@`OTcY$b^`3QtDSE>A20$3! zNV0r7Fhx(2<(Q%ez_|vs+xkOQw=7L#KYGBlo@Dv#({~S0I?&e1q!xU10QgcG``{lv jeSg-Afie1FUOz)`xeIfTX8BKf00000NkvXXu0mjf9}HgU literal 0 HcmV?d00001 diff --git a/viewer/images/icon/warped_hanging_sign.png b/viewer/images/icon/warped_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..80dd99e650d28dce790437d0c2602479d2fffb63 GIT binary patch literal 296 zcmV+@0oVSCP)YBID=fRePJycY`Xc8aMDMi%c))^F)W;z}LOI zS?>t|c0-R5pYU6vlsPV?Z5>LI#UMiGp+}k`8%@EaC&{JM;lM>RP&F78jkYrC_Xrh+3i6+Ga>7 zYPk+_Z~mA6H7uUFPKy0D0bIJV2jaob%FuWn+wl>lkp%%6=8&7Rq%TqwcKsDRM@a8 zsy8O@e*^&Ya)~OoTCCP=sM&E1st;ybd{OetU%TyAs!qPETV{Mwgb{wPgJD$^nq1D# zQmEScT8xx~mz+sd9pLl%fn}9K9bR289hCY7XKIA#?efzh00000NkvXXu0mjfaXXsB literal 0 HcmV?d00001 diff --git a/viewer/images/icon/warped_sign.png b/viewer/images/icon/warped_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3530b4bbd0d36439cd7b429c01b0a4fe11999a GIT binary patch literal 327 zcmV-N0l5B&P)UIXeN9TZ$71RQkfqQ%#66c>E~-=!{21($XWnVlR2hd>fin!&AL20=o^ zL`a0|5EHH5A$pd3?tjjA{$C8oBLyI{3ILTCG$q#80C?Y6L1q;yFG!ysF=SRTyShf@ z#S#E8zrQ1xPUs~W!F1B}+aiv90OH6ebe(p=v@Jr{!L+UVpFSam;9%Il!_h9@`2a4LO0gO3y=3H&0Q@3 Z@Btdga>hhx^~L}I002ovPDHLkV1m@KiY@>E literal 0 HcmV?d00001 diff --git a/viewer/images/icon/warped_wall_sign.png b/viewer/images/icon/warped_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..59614c66b1631a307595245cd6d526d7d9fb39a2 GIT binary patch literal 244 zcmV3XJW0002HNklzFV3eknH5mhNpAHeS#wgA8a>5p}Cg1EZN`C|ZisOM~A26sS$v)_O+bE6W zxs+K9K$*p)QP>?go=X~qIG)?=*E5#CU7JBA>8mPF8a$x;o<`wE)4LBaTFenfY04~q u)jwy8^zHwRCvI8MJJ8};v(?i4lmZ^6w_6 Date: Sat, 6 Jan 2024 23:46:32 +0100 Subject: [PATCH 29/43] viewer: allow zooming to level 5 Allow zooming in far enough so neighboring signs don't overlap. --- viewer/MinedMap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index 0e9abe0..03c3649 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -231,7 +231,7 @@ window.createMap = function () { center: [-z, x], zoom: zoom, minZoom: -(mipmaps.length-1), - maxZoom: 3, + maxZoom: 5, crs: L.CRS.Simple, maxBounds: [ [-512*(mipmaps[0].bounds.maxZ+1), 512*mipmaps[0].bounds.minX], From 989428f78dfedbb18cad647944a6b48d9d4e7501 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 6 Jan 2024 23:47:02 +0100 Subject: [PATCH 30/43] viewer: use sign icons instead of default markers --- viewer/MinedMap.js | 51 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index 03c3649..c9ae2d3 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -17,6 +17,44 @@ function contains(array, elem) { return false; } +const signKinds = { + sign: { + iconSize: [26, 28], + popupAnchor: [0, -20], + }, + wall_sign: { + iconSize: [26, 18], + popupAnchor: [0, -15], + }, + hanging_sign: { + iconSize: [28, 24], + popupAnchor: [0, -18], + }, + hanging_wall_sign: { + iconSize: [28, 28], + popupAnchor: [0, -20], + }, +} + +const signIcons = {}; + +function signIcon(material, kind) { + function createSignIcon(material, kind) { + const params = signKinds[kind]; + + return L.icon({ + iconUrl: `images/icon/${material}_${kind}.png`, + iconSize: params.iconSize, + popupAnchor: params.popupAnchor, + className: 'overzoomed', + }); + } + + + let icons = signIcons[material] ??= {}; + return icons[kind] ??= createSignIcon(material, kind); +} + const MinedMapLayer = L.TileLayer.extend({ initialize: function (mipmaps, layer) { L.TileLayer.prototype.initialize.call(this, '', { @@ -167,6 +205,9 @@ function loadSigns(signLayer) { const el = document.createElement('span'); const [x, z] = key.split(',').map((i) => +i); + let material = 'oak'; /* Default material */ + let kind = 'sign'; + group.forEach((sign) => { if (sign.front_text) { for (const line of sign.front_text) { @@ -185,13 +226,21 @@ function loadSigns(signLayer) { el.appendChild(document.createElement('hr')); } + + if (sign.material) + material = sign.material; + if (sign.kind) + kind = sign.kind; }); const lastChild = el.lastChild; if (lastChild) lastChild.remove(); - L.marker([-z-0.5, x+0.5]).addTo(signLayer).bindPopup(el); + L.marker([-z-0.5, x+0.5], { + icon: signIcon(material, kind), + + }).addTo(signLayer).bindPopup(el); } } From ac0fd06b169b9356da0317c7a50943f3a3964b83 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 01:56:03 +0100 Subject: [PATCH 31/43] viewer: add icon shadows --- viewer/MinedMap.js | 8 +++++--- viewer/images/icon/shadow_hanging_sign.png | Bin 0 -> 213 bytes viewer/images/icon/shadow_hanging_wall_sign.png | Bin 0 -> 200 bytes viewer/images/icon/shadow_sign.png | Bin 0 -> 194 bytes viewer/images/icon/shadow_wall_sign.png | Bin 0 -> 152 bytes 5 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 viewer/images/icon/shadow_hanging_sign.png create mode 100644 viewer/images/icon/shadow_hanging_wall_sign.png create mode 100644 viewer/images/icon/shadow_sign.png create mode 100644 viewer/images/icon/shadow_wall_sign.png diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index c9ae2d3..e4c8203 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -40,12 +40,14 @@ const signIcons = {}; function signIcon(material, kind) { function createSignIcon(material, kind) { - const params = signKinds[kind]; + const {iconSize, popupAnchor} = signKinds[kind]; return L.icon({ iconUrl: `images/icon/${material}_${kind}.png`, - iconSize: params.iconSize, - popupAnchor: params.popupAnchor, + iconSize, + popupAnchor, + shadowUrl: `images/icon/shadow_${kind}.png`, + shadowSize: [iconSize[0]+8, iconSize[1]+8], className: 'overzoomed', }); } diff --git a/viewer/images/icon/shadow_hanging_sign.png b/viewer/images/icon/shadow_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd19a61cfc2912c0444f322b9891d69233e0bd8 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Q!3HFy+4N(86lZ})WHAE+w=f7ZGR&GI0TgWa zba4!^IQ@3AB42|6kE?u6R+SXDn8|m0=5~oPsml{DF)%hYtNBj<_jax5{f)gGCJyW@ zFQ0NtopZ2SFkPzAORrs6m$`yDt1|)xq*H*w(|0w@2lM~wKefaPBAI-ieQM`{c%6B)z$pk6QmJIiGKqoPHy85}S Ib4q9e0I7yV82|tP literal 0 HcmV?d00001 diff --git a/viewer/images/icon/shadow_hanging_wall_sign.png b/viewer/images/icon/shadow_hanging_wall_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..771cef5bf4605223e1160b1f6ca9f614f555258d GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|&H|6fVg?3oVGw3ym^DWNC|Kp` z;uvCa`t1}$z6J#z*ZHTOypeq(aId~3?b_Bm2bW5yOgwUGnZ2T_L%h?^rOeB6B2*eI zSkE+=H!(RdRVExwj++mcxArxtOxVLPcfH$DCe!Gc uqFJK9*=wbq7`3xK7FSZ`cq{GQUBD2$NKQZBYK|_@6%3xPelF{r5}E)qaYkDJ literal 0 HcmV?d00001 diff --git a/viewer/images/icon/shadow_sign.png b/viewer/images/icon/shadow_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf1cde2756964c656657607876999f26bbadbaf GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^fTV z)5S5w;`G}o2RRQY@VLfzE0?rewLC8G*x`I{r8<6y`Y?T61oCO|{#S9GG!XV7ZFl&wkP|(ZM z#W6(Vd~!-cf`H?pB~9i$JUsak3uaxFl#nnvVeo{F83@h@@UpS7Nwa-A5Us|h)ez|1 twpUT-!jkG{pTFh_C;##4Je@eZoT0mlhrfHJ|16-X44$rjF6*2UngFtWD0Bb- literal 0 HcmV?d00001 From 31de0dc0bdff094cb237b068572eb2892bd5b9d8 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 16:01:29 +0100 Subject: [PATCH 32/43] viewer: sign popup styling --- viewer/MinedMap.js | 110 +++++++++++++++++++++++++++++++++++---------- viewer/index.html | 46 ++++++++++++++++++- 2 files changed, 131 insertions(+), 25 deletions(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index e4c8203..47aefff 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -160,7 +160,6 @@ const colors = { function formatSignLine(line) { const el = document.createElement('span'); el.style.whiteSpace = 'pre'; - el.style.fontFamily = 'sans'; for (const span of line) { const child = document.createElement('span'); @@ -190,6 +189,86 @@ function formatSignLine(line) { return el; } +function createSign(sign, back) { + // standing signs + function px(base) { + const scale = 11; + return (base*scale)+'px'; + } + // hanging signs + function pxh(base) { + const scale = 16; + return (base*scale)+'px'; + } + + const sizes = { + sign: { + width: px(24), + height: px(12), + paddingTop: px(0), + paddingBottom: px(14), + }, + wall_sign: { + width: px(24), + height: px(12), + paddingTop: px(0), + paddingBottom: px(0), + }, + hanging_sign: { + width: pxh(16), + height: pxh(10), + paddingTop: pxh(4), + paddingBottom: pxh(0), + }, + hanging_wall_sign: { + width: pxh(16), + height: pxh(10), + paddingTop: pxh(6), + paddingBottom: pxh(0), + }, + }; + const size = sizes[sign.kind]; + + const wrapper = document.createElement('div'); + wrapper.classList = 'sign-wrapper'; + + const title = document.createElement('div'); + title.classList = 'sign-title' + title.textContent = `Sign at ${sign.x}/${sign.y}/${sign.z}`; + if (back) + title.textContent += ' (back)'; + title.textContent += ':'; + + wrapper.appendChild(title); + + const container = document.createElement('div'); + container.style.width = size.width; + container.style.height = size.height; + container.style.paddingTop = size.paddingTop; + container.style.paddingBottom = size.paddingBottom; + container.style.backgroundImage = `url(images/bg/${sign.material}_${sign.kind}.png)`; + container.classList = 'sign-container overzoomed'; + + const content = document.createElement('div'); + content.classList = 'sign-content'; + + let text = []; + if (!back && sign.front_text) + text = sign.front_text; + else if (back && sign.back_text) + text = sign.back_text; + + for (const line of text) { + content.appendChild(formatSignLine(line)); + content.appendChild(document.createElement('br')); + } + + container.appendChild(content); + wrapper.appendChild(container); + + return wrapper; +} + function loadSigns(signLayer) { const xhr = new XMLHttpRequest(); xhr.onload = function () { @@ -204,30 +283,16 @@ function loadSigns(signLayer) { } for (const [key, group] of Object.entries(groups)) { - const el = document.createElement('span'); - const [x, z] = key.split(',').map((i) => +i); + const popup = document.createElement('div'); let material = 'oak'; /* Default material */ let kind = 'sign'; group.forEach((sign) => { - if (sign.front_text) { - for (const line of sign.front_text) { - el.appendChild(formatSignLine(line)); - el.appendChild(document.createElement('br')); - } + popup.appendChild(createSign(sign, false)); - el.appendChild(document.createElement('hr')); - } - - if (sign.back_text) { - for (let line of sign.back_text) { - el.appendChild(formatSignLine(line)); - el.appendChild(document.createElement('br')); - } - - el.appendChild(document.createElement('hr')); - } + if (sign.back_text) + popup.appendChild(createSign(sign, true)); if (sign.material) material = sign.material; @@ -235,14 +300,11 @@ function loadSigns(signLayer) { kind = sign.kind; }); - const lastChild = el.lastChild; - if (lastChild) - lastChild.remove(); + const [x, z] = key.split(',').map((i) => +i); L.marker([-z-0.5, x+0.5], { icon: signIcon(material, kind), - - }).addTo(signLayer).bindPopup(el); + }).addTo(signLayer).bindPopup(popup); } } diff --git a/viewer/index.html b/viewer/index.html index 8327600..caf32a0 100644 --- a/viewer/index.html +++ b/viewer/index.html @@ -22,7 +22,19 @@ background: #333; } - img.overzoomed { + .leaflet-container a.leaflet-popup-close-button { + color: #ccc; + } + + .leaflet-container a.leaflet-popup-close-button:hover { + color: #fff; + } + + .leaflet-popup-content-wrapper, .leaflet-popup-tip { + background: rgba(64, 64, 64, 0.5); + } + + .overzoomed { image-rendering: -moz-crisp-edges; image-rendering: -o-crisp-edges; image-rendering: -webkit-optimize-contrast; @@ -31,6 +43,38 @@ -ms-interpolation-mode: nearest-neighbor; } + .sign-wrapper { + padding: 0; + padding-left: 4px; + margin-bottom: 2em; + } + + .sign-wrapper:last-child { + margin-bottom: 0; + } + + .sign-title { + color: #fff; + font-weight: bold; + margin-bottom: 0.5em; + } + + .sign-container { + padding: 0; + background-size: cover; + display: flex; + align-items: center; + justify-content: center; + } + + .sign-content { + padding: 0; + font-size: 18px; + line-height: 1.5; + text-align: center; + font-family: sans; + } + span.obfuscated:hover { background-color: transparent !important; } From 76df56c9ce41376b999b1da6acb2b415751bb007 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 16:11:54 +0100 Subject: [PATCH 33/43] viewer: sort signs at the same x/z coordinates from top to bottom --- viewer/MinedMap.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index 47aefff..c1fd1c4 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -279,26 +279,30 @@ function loadSigns(signLayer) { for (const sign of res.signs) { const key = `${sign.x},${sign.z}`; const group = groups[key] ??= []; - group[sign.y] = sign; + group.push(sign); } for (const [key, group] of Object.entries(groups)) { const popup = document.createElement('div'); - let material = 'oak'; /* Default material */ - let kind = 'sign'; + let material; + let kind; - group.forEach((sign) => { + // Sort from top to bottom + group.sort((a, b) => b.y - a.y); + + for (const sign of group) { popup.appendChild(createSign(sign, false)); if (sign.back_text) popup.appendChild(createSign(sign, true)); - if (sign.material) - material = sign.material; - if (sign.kind) - kind = sign.kind; - }); + material ??= sign.material; + kind ??= sign.kind; + } + + // Default material + material ??= 'oak'; const [x, z] = key.split(',').map((i) => +i); From 7b3ac8647ef3730b4a81cbf4b90b433937a6b7c8 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 19:03:22 +0100 Subject: [PATCH 34/43] viewer: store URL paramters in a 'params' variable --- viewer/MinedMap.js | 54 +++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index c1fd1c4..882691f 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -36,6 +36,7 @@ const signKinds = { }, } +const params = {}; const signIcons = {}; function signIcon(material, kind) { @@ -323,30 +324,28 @@ window.createMap = function () { mipmaps = res.mipmaps, spawn = res.spawn; - let x, z, zoom, light, signs; - const updateParams = function () { const args = parseHash(); - zoom = parseInt(args['zoom']); - x = parseFloat(args['x']); - z = parseFloat(args['z']); - light = parseInt(args['light']); - signs = parseInt(args['signs'] ?? '1'); + params.zoom = parseInt(args['zoom']); + params.x = parseFloat(args['x']); + params.z = parseFloat(args['z']); + params.light = parseInt(args['light']); + params.signs = parseInt(args['signs'] ?? '1'); - if (isNaN(zoom)) - zoom = 0; - if (isNaN(x)) - x = spawn.x; - if (isNaN(z)) - z = spawn.z; + if (isNaN(params.zoom)) + params.zoom = 0; + if (isNaN(params.x)) + params.x = spawn.x; + if (isNaN(params.z)) + params.z = spawn.z; }; updateParams(); const map = L.map('map', { - center: [-z, x], - zoom: zoom, + center: [-params.z, params.x], + zoom: params.zoom, minZoom: -(mipmaps.length-1), maxZoom: 5, crs: L.CRS.Simple, @@ -364,9 +363,9 @@ window.createMap = function () { mapLayer.addTo(map); - if (light) + if (params.light) map.addLayer(lightLayer); - if (signs) + if (params.signs) map.addLayer(signLayer); const overlayMaps = { @@ -384,10 +383,10 @@ window.createMap = function () { }); const makeHash = function () { - let ret = '#x='+x+'&z='+z; + let ret = '#x='+params.x+'&z='+params.z; - if (zoom != 0) - ret += '&zoom='+zoom; + if (params.zoom != 0) + ret += '&zoom='+params.zoom; if (map.hasLayer(lightLayer)) ret += '&light=1'; @@ -407,10 +406,11 @@ window.createMap = function () { return; } - zoom = map.getZoom(); - center = map.getCenter(); - x = Math.round(center.lng); - z = Math.round(-center.lat); + const center = map.getCenter(); + + params.zoom = map.getZoom(); + params.x = Math.round(center.lng); + params.z = Math.round(-center.lat); updateHash(); } @@ -428,13 +428,13 @@ window.createMap = function () { updateParams(); - map.setView([-z, x], zoom); + map.setView([-params.z, params.x], params.zoom); - if (light) + if (params.light) map.addLayer(lightLayer); else map.removeLayer(lightLayer); - if (signs) + if (params.signs) map.addLayer(signLayer); else map.removeLayer(signLayer); From 7daddd6bbc4f685cc52af48bcfafdbea309b381b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 19:22:56 +0100 Subject: [PATCH 35/43] viewer: include open marker in URL Allow sharing URLs that reference a marker. --- viewer/MinedMap.js | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index 882691f..7dda976 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -39,6 +39,8 @@ const signKinds = { const params = {}; const signIcons = {}; +let updateHash = () => {}; + function signIcon(material, kind) { function createSignIcon(material, kind) { const {iconSize, popupAnchor} = signKinds[kind]; @@ -284,7 +286,7 @@ function loadSigns(signLayer) { } for (const [key, group] of Object.entries(groups)) { - const popup = document.createElement('div'); + const el = document.createElement('div'); let material; let kind; @@ -293,10 +295,10 @@ function loadSigns(signLayer) { group.sort((a, b) => b.y - a.y); for (const sign of group) { - popup.appendChild(createSign(sign, false)); + el.appendChild(createSign(sign, false)); if (sign.back_text) - popup.appendChild(createSign(sign, true)); + el.appendChild(createSign(sign, true)); material ??= sign.material; kind ??= sign.kind; @@ -307,9 +309,23 @@ function loadSigns(signLayer) { const [x, z] = key.split(',').map((i) => +i); - L.marker([-z-0.5, x+0.5], { + const popup = L.popup().setContent(el); + + popup.on('add', () => { + params.marker = [x, z]; + updateHash(); + }); + popup.on('remove', () => { + params.marker = null; + updateHash(); + }); + + const marker = L.marker([-z-0.5, x+0.5], { icon: signIcon(material, kind), }).addTo(signLayer).bindPopup(popup); + + if (params.marker && x === params.marker[0] && z === params.marker[1]) + marker.openPopup(); } } @@ -332,6 +348,7 @@ window.createMap = function () { params.z = parseFloat(args['z']); params.light = parseInt(args['light']); params.signs = parseInt(args['signs'] ?? '1'); + params.marker = (args['marker'] ?? '').split(',').map((i) => +i); if (isNaN(params.zoom)) params.zoom = 0; @@ -339,6 +356,8 @@ window.createMap = function () { params.x = spawn.x; if (isNaN(params.z)) params.z = spawn.z; + if (isNaN(params.marker[0]) || isNaN(params.marker[1])) + params.marker = null; }; updateParams(); @@ -392,11 +411,14 @@ window.createMap = function () { ret += '&light=1'; if (!map.hasLayer(signLayer)) ret += '&signs=0'; + if (params.marker) { + ret += `&marker=${params.marker[0]},${params.marker[1]}`; + } return ret; }; - const updateHash = function () { + updateHash = function () { window.location.hash = makeHash(); }; From 625f2a13a3028cc6cec21d964a409bd715e1f635 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 20:05:39 +0100 Subject: [PATCH 36/43] core/metadata_writer: add enabled features to metadata Only consider sign support enabled when at least one pattern is configured. --- src/core/metadata_writer.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/core/metadata_writer.rs b/src/core/metadata_writer.rs index 03aac70..b051b69 100644 --- a/src/core/metadata_writer.rs +++ b/src/core/metadata_writer.rs @@ -44,6 +44,13 @@ struct Spawn { z: i32, } +/// Keeps track of enabled MinedMap features +#[derive(Debug, Serialize)] +struct Features { + /// Sign layer + signs: bool, +} + /// Viewer metadata JSON data structure #[derive(Debug, Serialize)] struct Metadata<'t> { @@ -51,6 +58,8 @@ struct Metadata<'t> { mipmaps: Vec>, /// Initial spawn point for new players spawn: Spawn, + /// Enabled MinedMap features + features: Features, } /// Viewer entity JSON data structure @@ -159,9 +168,14 @@ impl<'a> MetadataWriter<'a> { pub fn run(self) -> Result<()> { let level_dat = self.read_level_dat()?; + let features = Features { + signs: !self.config.sign_patterns.is_empty(), + }; + let mut metadata = Metadata { mipmaps: Vec::new(), spawn: Self::spawn(&level_dat), + features, }; for tile_map in self.tiles.iter() { From 08f84fa339066c56b61f734e119f99c9fd4bc1b6 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 20:14:00 +0100 Subject: [PATCH 37/43] viewer: do not show sign layer when the feature is disabled --- viewer/MinedMap.js | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index 7dda976..f32485e 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -338,7 +338,8 @@ window.createMap = function () { xhr.onload = function () { const res = JSON.parse(this.responseText), mipmaps = res.mipmaps, - spawn = res.spawn; + spawn = res.spawn, + features = res.features || {}; const updateParams = function () { const args = parseHash(); @@ -356,7 +357,7 @@ window.createMap = function () { params.x = spawn.x; if (isNaN(params.z)) params.z = spawn.z; - if (isNaN(params.marker[0]) || isNaN(params.marker[1])) + if (!features.signs || isNaN(params.marker[0]) || isNaN(params.marker[1])) params.marker = null; }; @@ -374,23 +375,25 @@ window.createMap = function () { ], }); + const overlayMaps = {}; + const mapLayer = new MinedMapLayer(mipmaps, 'map'); - const lightLayer = new MinedMapLayer(mipmaps, 'light'); - const signLayer = L.layerGroup(); - - loadSigns(signLayer); - mapLayer.addTo(map); + const lightLayer = new MinedMapLayer(mipmaps, 'light'); + overlayMaps['Illumination'] = lightLayer; if (params.light) map.addLayer(lightLayer); - if (params.signs) - map.addLayer(signLayer); - const overlayMaps = { - "Illumination": lightLayer, - "Signs": signLayer, - }; + let signLayer; + if (features.signs) { + signLayer = L.layerGroup(); + loadSigns(signLayer); + if (params.signs) + map.addLayer(signLayer); + + overlayMaps['Signs'] = signLayer; + } L.control.layers({}, overlayMaps).addTo(map); @@ -409,7 +412,7 @@ window.createMap = function () { if (map.hasLayer(lightLayer)) ret += '&light=1'; - if (!map.hasLayer(signLayer)) + if (features.signs && !map.hasLayer(signLayer)) ret += '&signs=0'; if (params.marker) { ret += `&marker=${params.marker[0]},${params.marker[1]}`; @@ -456,10 +459,12 @@ window.createMap = function () { map.addLayer(lightLayer); else map.removeLayer(lightLayer); - if (params.signs) - map.addLayer(signLayer); - else - map.removeLayer(signLayer); + if (features.signs) { + if (params.signs) + map.addLayer(signLayer); + else + map.removeLayer(signLayer); + } updateHash(); }; From 3d024c6cd884ac22c9e5ddc92778c0deecce8413 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 20:32:56 +0100 Subject: [PATCH 38/43] viewer: update opened marker popup on URL hash change --- viewer/MinedMap.js | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index f32485e..3abcaf6 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -38,9 +38,21 @@ const signKinds = { const params = {}; const signIcons = {}; +const markers = {}; let updateHash = () => {}; +function coordKey(coords) { + if (!coords) + return null; + + return `${coords[0]},${coords[1]}`; +} + +function getMarker(coords) { + return markers[coordKey(coords)]; +} + function signIcon(material, kind) { function createSignIcon(material, kind) { const {iconSize, popupAnchor} = signKinds[kind]; @@ -280,7 +292,7 @@ function loadSigns(signLayer) { // Group signs by x,z coordinates for (const sign of res.signs) { - const key = `${sign.x},${sign.z}`; + const key = coordKey([sign.x, sign.z]); const group = groups[key] ??= []; group.push(sign); } @@ -324,6 +336,8 @@ function loadSigns(signLayer) { icon: signIcon(material, kind), }).addTo(signLayer).bindPopup(popup); + markers[coordKey([x, z])] = marker; + if (params.marker && x === params.marker[0] && z === params.marker[1]) marker.openPopup(); } @@ -451,21 +465,27 @@ window.createMap = function () { if (window.location.hash === makeHash()) return; - updateParams(); + const prevMarkerCoords = params.marker; - map.setView([-params.z, params.x], params.zoom); + updateParams(); if (params.light) map.addLayer(lightLayer); else map.removeLayer(lightLayer); + if (features.signs) { if (params.signs) map.addLayer(signLayer); else map.removeLayer(signLayer); + + if (coordKey(prevMarkerCoords) !== coordKey(params.marker)) + getMarker(params.marker)?.openPopup(); } + map.setView([-params.z, params.x], params.zoom); + updateHash(); }; From 643035eaed96dfa5e99badba8dff02ab557bd207 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 7 Jan 2024 20:49:36 +0100 Subject: [PATCH 39/43] viewer: switch to modern fetch API, do not cache metadata and entity files --- viewer/MinedMap.js | 126 +++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 67 deletions(-) diff --git a/viewer/MinedMap.js b/viewer/MinedMap.js index 3abcaf6..e784eec 100644 --- a/viewer/MinedMap.js +++ b/viewer/MinedMap.js @@ -284,76 +284,71 @@ function createSign(sign, back) { return wrapper; } -function loadSigns(signLayer) { - const xhr = new XMLHttpRequest(); - xhr.onload = function () { - const res = JSON.parse(this.responseText); - const groups = {}; +async function loadSigns(signLayer) { + const response = await fetch('data/entities.json', {cache: 'no-store'}); + const res = await response.json(); - // Group signs by x,z coordinates - for (const sign of res.signs) { - const key = coordKey([sign.x, sign.z]); - const group = groups[key] ??= []; - group.push(sign); - } + const groups = {}; - for (const [key, group] of Object.entries(groups)) { - const el = document.createElement('div'); - - let material; - let kind; - - // Sort from top to bottom - group.sort((a, b) => b.y - a.y); - - for (const sign of group) { - el.appendChild(createSign(sign, false)); - - if (sign.back_text) - el.appendChild(createSign(sign, true)); - - material ??= sign.material; - kind ??= sign.kind; - } - - // Default material - material ??= 'oak'; - - const [x, z] = key.split(',').map((i) => +i); - - const popup = L.popup().setContent(el); - - popup.on('add', () => { - params.marker = [x, z]; - updateHash(); - }); - popup.on('remove', () => { - params.marker = null; - updateHash(); - }); - - const marker = L.marker([-z-0.5, x+0.5], { - icon: signIcon(material, kind), - }).addTo(signLayer).bindPopup(popup); - - markers[coordKey([x, z])] = marker; - - if (params.marker && x === params.marker[0] && z === params.marker[1]) - marker.openPopup(); - } + // Group signs by x,z coordinates + for (const sign of res.signs) { + const key = coordKey([sign.x, sign.z]); + const group = groups[key] ??= []; + group.push(sign); } - xhr.open('GET', 'data/entities.json', true); - xhr.send(); + for (const [key, group] of Object.entries(groups)) { + const el = document.createElement('div'); + + let material; + let kind; + + // Sort from top to bottom + group.sort((a, b) => b.y - a.y); + + for (const sign of group) { + el.appendChild(createSign(sign, false)); + + if (sign.back_text) + el.appendChild(createSign(sign, true)); + + material ??= sign.material; + kind ??= sign.kind; + } + + // Default material + material ??= 'oak'; + + const [x, z] = key.split(',').map((i) => +i); + + const popup = L.popup().setContent(el); + + popup.on('add', () => { + params.marker = [x, z]; + updateHash(); + }); + popup.on('remove', () => { + params.marker = null; + updateHash(); + }); + + const marker = L.marker([-z-0.5, x+0.5], { + icon: signIcon(material, kind), + }).addTo(signLayer).bindPopup(popup); + + markers[coordKey([x, z])] = marker; + + if (params.marker && x === params.marker[0] && z === params.marker[1]) + marker.openPopup(); + } } window.createMap = function () { - const xhr = new XMLHttpRequest(); - xhr.onload = function () { - const res = JSON.parse(this.responseText), - mipmaps = res.mipmaps, - spawn = res.spawn, - features = res.features || {}; + (async function () { + const response = await fetch('data/info.json', {cache: 'no-store'}); + const res = await response.json(); + const {mipmaps, spawn} = res; + const features = res.features || {}; const updateParams = function () { const args = parseHash(); @@ -489,8 +484,5 @@ window.createMap = function () { updateHash(); }; - }; - - xhr.open('GET', 'data/info.json', true); - xhr.send(); + })(); } From 03521684b9851f1380470245b846fca981ede1a0 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 10 Jan 2024 23:57:23 +0100 Subject: [PATCH 40/43] README.md: add description of sign feature --- README.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index be09c47..824b670 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ based on [Leaflet](https://leafletjs.com/). The map renderer is heavily inspired ## How to use Minecraft stores its save data in a directory `~/.minecraft/saves` on Linux, -and `C:\Users\\AppData\Roaming\.minecraft\saves`. To generate minedmap +and `C:\Users\\AppData\Roaming\.minecraft\saves`. To generate MinedMap tile data from a save game called "World", use the a command like the following (replacing the first argument with the path to your save data; `viewer` refers to the directory where you unpacked the MinedMap viewer): @@ -47,6 +47,34 @@ This test server is very slow and cannot handle multiple requests concurrently, a proper webserver like [nginx](https://nginx.org/) or upload the viewer together with the generated map files to public webspace to make the map available to others. +### Signs + +![Sign screenshot](https://raw.githubusercontent.com/neocturne/MinedMap/e5d9c813ba3118d04dc7e52e3dc6f48808a69120/docs/images/signs.png) + +MinedMap can display sign markers on the map, which will open a popup showing +the sign text when clicked. + +Generation of the sign layer is disabled by default. It can be enabled by passing +the `--sign-prefix` or `--sign-filter` options to MinedMap. The options allow +to configure which signs should be displayed, and they can be passed multiple +times to show every sign that matches at least one prefix or filter. + +`--sign-prefix` will make all signs visible the text of which starts with the +given prefix, so something like `--sign-prefix '[Map]'` would allow to put up +signs that start with "\[Map\]" in Minecraft to add markers to the map. An +empty prefix (`--sign-prefix ''`) can be used to make *all* signs visible on +the map. + +`--sign-filter` can be used for more advanced filters based on regular expressions. +`--sign-filter '\[Map\]'` would show all signs that contain "\[Map\]" +anywhere in their text, and `--sign-filter '.'` makes all non-empty signs (signs +containing at least one character) visible. See the documentation of the +[regex crate](https://docs.rs/regex) for more information on the supported syntax. + +All prefixes and filters are applied to the front and back text separately, but +both the front and the back text will be shown in the popup when one of them +matches. + ## Installation Binary builds of the map generator for Linux and Windows, as well as an archive From 6299c871a94a407382d4f17fa1eb23a15799dd4e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 11 Jan 2024 00:02:25 +0100 Subject: [PATCH 41/43] CHANGELOG.md: add sign layer --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fccf759..b702c8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## [Unreleased] - ReleaseDate +### Added + +- Added sign layer + + This feature is disabled by default. Use the `--sign-prefix` and `--sign-filter` options to + configure which signs to show on the map. + ### Changed - Without `--verbose`, only a single warning is printed at the end of From 05d8faeb5cfc249917d456089df581ed6779bfaf Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 11 Jan 2024 12:39:53 +0100 Subject: [PATCH 42/43] resource: README.md: sign-related updates --- resource/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resource/README.md b/resource/README.md index 08857ad..65caa08 100644 --- a/resource/README.md +++ b/resource/README.md @@ -11,6 +11,7 @@ work. - `extract.py`: Takes the block type information from `blocks.json` and texture data from an unpacked Minecraft JAR, storing the result in `colors.json` - `generate.py`: Generates `block_types.rs` from `colors.json` +- `sign_textures.py`: Generates all needed sign graphics from Minecraft assets In addition to these scripts, the JSON processor *jq* is a useful tool to work with MinedMap's resource metadata. @@ -47,7 +48,8 @@ with MinedMap's resource metadata. If possible, the top texture of blocks should be used where different sides exist. Block types that should not be visible on the map are just set to - `null` in the JSON. + `null` in the JSON (or have a `null` `texture` field when other flags need + to be set, like for sign blocks). The `water`, `grass` and `foliage` flags control biome-dependent texture color modifiers. From e18761a3e410e72b65301701aa157104b2bf9dbd Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 11 Jan 2024 12:42:25 +0100 Subject: [PATCH 43/43] resource: extract.py: pass directory of unpacked Minecraft JAR, not full path to assets Make the script easier to use, and more consistent with sign_textures.py. --- resource/README.md | 2 +- resource/extract.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resource/README.md b/resource/README.md index 65caa08..ab9d5ea 100644 --- a/resource/README.md +++ b/resource/README.md @@ -43,7 +43,7 @@ with MinedMap's resource metadata. 5. Edit `blocks.json` until the following command passes without errors: ```sh - ./extract.py blocks.json data/new/assets/minecraft/textures/block colors.json + ./extract.py blocks.json data/new colors.json ``` If possible, the top texture of blocks should be used where different sides diff --git a/resource/extract.py b/resource/extract.py index 9621b95..31c1e97 100755 --- a/resource/extract.py +++ b/resource/extract.py @@ -11,7 +11,7 @@ if len(sys.argv) != 4: sys.exit('Usage: extract.py ') def mean_color(texture): - path = os.path.join(sys.argv[2], texture + '.png') + path = os.path.join(sys.argv[2], 'assets/minecraft/textures/block', texture + '.png') im = Image.open(path) data = im.convert('RGBA').getdata()