stevenarella/src/world/block/mod.rs

3047 lines
87 KiB
Rust

use std::fmt::{Display, Formatter, Error};
use collision::{Aabb, Aabb3};
use cgmath::Point3;
use types::Direction;
pub use self::Block::*;
macro_rules! consume_token { ($i:tt) => (0) }
macro_rules! offsets {
($first:ident, $($other:ident),*) => (
#[allow(non_upper_case_globals)]
pub const $first: usize = 0;
offsets!(prev($first), $($other),*);
);
(prev($prev:ident), $first:ident, $($other:ident),*) => (
#[allow(non_upper_case_globals)]
pub const $first: usize = $prev + internal_sizes::$prev;
offsets!(prev($first), $($other),*);
);
(prev($prev:ident), $first:ident) => (
#[allow(non_upper_case_globals)]
pub const $first: usize = $prev + internal_sizes::$prev;
)
}
macro_rules! define_blocks {
(
$(
$name:ident {
props {
$(
$fname:ident : $ftype:ty = [$($val:expr),+],
)*
},
$(data $datafunc:expr,)*
material $mat:expr,
model $model:expr,
$(variant $variant:expr,)*
$(tint $tint:expr,)*
$(collision $collision:expr,)*
$(update_state ($world:ident, $x:ident, $y:ident, $z:ident) => $update_state:expr,)*
}
)+
) => (
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Block {
$(
$name {
$(
$fname : $ftype,
)*
},
)+
}
mod internal_ids {
create_ids!(usize, $($name),+);
}
mod internal_sizes {
$(
#[allow(non_upper_case_globals)]
pub const $name : usize = $(($(1 + consume_token!($val) + )+ 0) * )* 1;
)+
}
mod internal_offsets {
use super::internal_sizes;
offsets!($($name),+);
}
mod internal_offset_max {
use super::internal_sizes;
use super::internal_offsets;
$(
#[allow(non_upper_case_globals)]
pub const $name: usize = internal_offsets::$name + internal_sizes::$name - 1;
)+
}
impl Block {
#[allow(unused_variables, unused_mut, unused_assignments)]
pub fn get_steven_id(&self) -> usize {
match *self {
$(
Block::$name {
$($fname,)*
} => {
let mut offset = internal_offsets::$name;
let mut mul = 1;
$(
offset += [$($val),+].into_iter().position(|v| *v == $fname).unwrap() * mul;
mul *= $(1 + consume_token!($val) + )+ 0;
)*
offset
},
)+
}
}
#[allow(unused_variables, unused_assignments)]
pub fn by_steven_id(id: usize) -> Block {
match id {
$(
mut data @ internal_offsets::$name ... internal_offset_max::$name=> {
data -= internal_offsets::$name;
$(
let vals = [$($val),+];
let $fname = vals[data % vals.len()];
data /= vals.len();
)*
Block::$name {
$(
$fname: $fname,
)*
}
},
)*
_ => Block::Missing {}
}
}
#[allow(unused_variables, unreachable_code)]
pub fn get_vanilla_id(&self) -> Option<usize> {
match *self {
$(
Block::$name {
$($fname,)*
} => {
$(
let data: Option<usize> = ($datafunc).map(|v| v + (internal_ids::$name << 4));
return data;
)*
Some(internal_ids::$name << 4)
}
)+
}
}
pub fn by_vanilla_id(id: usize) -> Block {
VANILLA_ID_MAP.get(id).and_then(|v| *v).unwrap_or(Block::Missing{})
}
#[allow(unused_variables)]
pub fn get_material(&self) -> Material {
match *self {
$(
Block::$name {
$($fname,)*
} => {
$mat
}
)+
}
}
#[allow(unused_variables)]
pub fn get_model(&self) -> (String, String) {
match *self {
$(
Block::$name {
$($fname,)*
} => {
let parts = $model;
(String::from(parts.0), String::from(parts.1))
}
)+
}
}
#[allow(unused_variables, unreachable_code)]
pub fn get_model_variant(&self) -> String {
match *self {
$(
Block::$name {
$($fname,)*
} => {
$(return String::from($variant);)*
"normal".to_owned()
}
)+
}
}
#[allow(unused_variables, unreachable_code)]
pub fn get_tint(&self) -> TintType {
match *self {
$(
Block::$name {
$($fname,)*
} => {
$(return $tint;)*
TintType::Default
}
)+
}
}
#[allow(unused_variables, unreachable_code)]
pub fn get_collision_boxes(&self) -> Vec<Aabb3<f64>> {
match *self {
$(
Block::$name {
$($fname,)*
} => {
$(return $collision;)*
vec![Aabb3::new(
Point3::new(0.0, 0.0, 0.0),
Point3::new(1.0, 1.0, 1.0)
)]
}
)+
}
}
#[allow(unused_variables, unreachable_code)]
pub fn update_state(&self, world: &super::World, x: i32, y: i32, z: i32) -> Block {
match *self {
$(
Block::$name {
$($fname,)*
} => {
$(
let $world = world;
let $x = x;
let $y = y;
let $z = z;
return $update_state;
)*
Block::$name {
$($fname: $fname,)*
}
}
)+
}
}
}
lazy_static! {
static ref VANILLA_ID_MAP: Vec<Option<Block>> = {
let mut blocks = vec![];
for i in 0 .. internal_offsets::Missing {
let block = Block::by_steven_id(i);
if let Some(id) = block.get_vanilla_id() {
if blocks.len() <= id {
blocks.resize(id + 1, None);
}
if blocks[id].is_none() {
blocks[id] = Some(block);
} else {
panic!(
"Tried to register {:#?} to {}:{} but {:#?} was already registered",
block,
id >> 4,
id & 0xF,
blocks[id]
);
}
}
}
blocks
};
}
);
}
pub struct Material {
pub renderable: bool,
pub should_cull_against: bool,
pub never_cull: bool, // Because leaves suck
pub force_shade: bool,
pub transparent: bool,
}
#[derive(Clone, Copy)]
pub enum TintType {
Default,
Color{r: u8, g: u8, b: u8},
Grass,
Foliage,
}
define_blocks! {
Air {
props {},
material Material {
renderable: false,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "air" ) },
collision vec![],
}
Stone {
props {
variant: StoneVariant = [
StoneVariant::Normal,
StoneVariant::Granite, StoneVariant::SmoothGranite,
StoneVariant::Diorite, StoneVariant::SmoothDiorite,
StoneVariant::Andesite, StoneVariant::SmoothAndesite
],
},
data { Some(variant.data()) },
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", variant.as_string() ) },
}
Grass {
props {
snowy: bool = [false, true],
},
data { if snowy { None } else { Some(0) } },
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "grass" ) },
variant format!("snowy={}", snowy),
tint TintType::Grass,
}
Dirt {
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "dirt" ) },
}
Cobblestone {
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "cobblestone" ) },
}
Planks { // TODO
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "planks" ) },
}
Sapling { // TODO
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "sapling" ) },
}
Bedrock {
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "bedrock" ) },
}
FlowingWater {
props {
level: i32 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
},
data Some(level as usize),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: true,
},
model { ("minecraft", "water" ) },
}
Water {
props {
level: i32 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
},
data Some(level as usize),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: true,
},
model { ("minecraft", "water" ) },
}
FlowingLava {
props {
level: i32 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
},
data Some(level as usize),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "lava" ) },
}
Lava {
props {
level: i32 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
},
data Some(level as usize),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "lava" ) },
}
Sand { // TODO
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "sand" ) },
}
Gravel {
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "gravel" ) },
}
GoldOre {
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "gold_ore" ) },
}
IronOre {
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "iron_ore" ) },
}
CoalOre {
props {
},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "coal_ore" ) },
}
Log {
props {
variant: TreeVariant = [
TreeVariant::Oak, TreeVariant::Spruce,
TreeVariant::Birch, TreeVariant::Jungle
],
axis: Axis = [Axis::Y, Axis::Z, Axis::X, Axis::None],
},
data { Some(variant.data() | (axis.data() << 2)) },
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", format!("{}_log", variant.as_string()) ) },
variant format!("axis={}", axis.as_string()),
}
Leaves {
props {
variant: TreeVariant = [
TreeVariant::Oak, TreeVariant::Spruce,
TreeVariant::Birch, TreeVariant::Jungle
],
decayable: bool = [false, true],
check_decay: bool = [false, true],
},
data { Some(variant.data()
| (if decayable { 0x4 } else { 0x0 })
| (if check_decay { 0x8 } else { 0x0 })
) },
material Material {
renderable: true,
never_cull: true,
should_cull_against: false,
force_shade: true,
transparent: false,
},
model { ("minecraft", format!("{}_leaves", variant.as_string()) ) },
tint TintType::Foliage,
}
Sponge {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "sponge" ) },
}
Glass {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "glass" ) },
}
LapisOre {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "lapis_ore" ) },
}
LapisBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "lapis_block" ) },
}
Dispenser {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "dispenser" ) },
}
Sandstone {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "sandstone" ) },
}
NoteBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "noteblock" ) },
}
Bed {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "bed" ) },
}
GoldenRail {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "golden_rail" ) },
}
DetectorRail {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "detector_rail" ) },
}
StickyPiston {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "stick_piston" ) },
}
Web {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "web" ) },
}
TallGrass {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "tallgrass" ) },
}
DeadBush {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "deadbush" ) },
}
Piston {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "piston" ) },
}
PistonHead {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "piston_head" ) },
}
Wool {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "wool" ) },
}
PistonExtension {
props {},
material Material {
renderable: false,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "piston_extension" ) },
}
YellowFlower {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "yellow_flower" ) },
}
RedFlower {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "red_flower" ) },
}
BrownMushroom {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "brown_mushroom" ) },
}
RedMushroom {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "red_mushroom" ) },
}
GoldBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "gold_block" ) },
}
IronBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "iron_block" ) },
}
DoubleStoneSlab {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "double_stone_slab" ) },
}
StoneSlab {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "stone_slab" ) },
}
BrickBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "brick_block" ) },
}
TNT {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "tnt" ) },
}
BookShelf {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "bookshelf" ) },
}
MossyCobblestone {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "mossy_cobblestone" ) },
}
Obsidian {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "obsidian" ) },
}
Torch {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "torch" ) },
}
Fire {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "fire" ) },
}
MobSpawner {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "mob_spawner" ) },
}
OakStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "oak_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::OakStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
Chest {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "chest" ) },
}
RedstoneWire {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "redstone_wire" ) },
}
DiamondOre {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "diamond_ore" ) },
}
DiamondBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "diamond_block" ) },
}
CraftingTable {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "crafting_table" ) },
}
Wheat {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "wheat" ) },
}
Farmland {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "farmland" ) },
}
Furnace {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "furnace" ) },
}
FurnaceLit {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "furnace_lit" ) },
}
StandingSign {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "standing_sign" ) },
}
WoodenDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "wooden_door" ) },
}
Ladder {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "ladder" ) },
}
Rail {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "rail" ) },
}
StoneStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "stone_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::StoneStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
WallSign {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "wall_sign" ) },
}
Lever {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "lever" ) },
}
StonePressurePlate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "stone_pressure_plate" ) },
}
IronDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "iron_door" ) },
}
WoodenPressurePlate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "wooden_pressure_plate" ) },
}
RedstoneOre {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "redstone_ore" ) },
}
RedstoneOreLit {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "redstone_ore_lit" ) },
}
RedstoneTorchUnlit {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "unlit_redstone_torch" ) },
}
RedstoneTorch {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "redstone_torch" ) },
}
StoneButton {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "stone_button" ) },
}
SnowLayer {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "snow_layer" ) },
}
Ice {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: true,
},
model { ("minecraft", "ice" ) },
}
Snow {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "snow" ) },
}
Cactus {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "cactus" ) },
}
Clay {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "clay" ) },
}
Reeds {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "reeds" ) },
}
Jukebox {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "jukebox" ) },
}
Fence {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "fence" ) },
}
Pumpkin {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "pumpkin" ) },
}
Netherrack {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "netherrack" ) },
}
SoulSand {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "soul_sand" ) },
}
Glowstone {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "glowstone" ) },
}
Portal {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: true,
},
model { ("minecraft", "portal" ) },
}
PumpkinLit {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "pumpkin_lit" ) },
}
Cake {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "cake" ) },
}
RepeaterUnpowered {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "repeater_unpowered" ) },
}
RepeaterPowered {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "repeater_powered" ) },
}
StainedGlass {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: true,
},
model { ("minecraft", "stained_glass" ) },
}
TrapDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "trap_door" ) },
}
MonsterEgg {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "monster_egg" ) },
}
StoneBrick {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "stonebrick" ) },
}
BrownMushroomBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "brown_mushroom_block" ) },
}
RedMushroomBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "red_mushroom_block" ) },
}
IronBars {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "iron_bars" ) },
}
GlassPane {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "glass_pane" ) },
}
MelonBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "melon_block" ) },
}
PumpkinStem {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "pumpkin_stem" ) },
}
MelonStem {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "melon_stem" ) },
}
Vine {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "vine" ) },
}
FenceGate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "fence_gate" ) },
}
BrickStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "brick_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::BrickStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
StoneBrickStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "StoneBrickStairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::StoneBrickStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
Mycelium {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "mycelium" ) },
}
Waterlily {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "waterlily" ) },
}
NetherBrick {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "nether_brick" ) },
}
NetherBrickFence {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "nether_brick_fence" ) },
}
NetherBrickStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "nether_brick_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::NetherBrickStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
NetherWart {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "nether_wart" ) },
}
EnchantingTable {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "enchanting_table" ) },
}
BrewingStand {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "brewing_stand" ) },
}
Cauldron {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "cauldron" ) },
}
EndPortal {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "end_portal" ) },
}
EndPortalFrame {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "end_portal_frame" ) },
}
EndStone {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "end_stone" ) },
}
DragonEgg {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "dragon_egg" ) },
}
RedstoneLamp {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "redstone_lamp" ) },
}
RedstoneLampLit {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "redstone_lamp_lit" ) },
}
DoubleWoodenSlab {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "double_wooden_slab" ) },
}
WoodenSlab {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "wooden_slab" ) },
}
Cocoa {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "cocoa" ) },
}
SandstoneStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "sandstone_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::SandstoneStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
EmeraldOre {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "emerald_ore" ) },
}
EnderChest {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "ender_chest" ) },
}
TripwireHook {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "tripwire_hook" ) },
}
Tripwire {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "tripwire" ) },
}
EmeraldBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "emerald_block" ) },
}
SpruceStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "spruce_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::SpruceStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
BirchStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "birch_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::BirchStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
JungleStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "jungle_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::JungleStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
CommandBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "command_block" ) },
}
Beacon {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "beacon" ) },
}
CobblestoneWall {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "cobblestone_wall" ) },
}
FlowerPot {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "flower_pot" ) },
}
Carrots {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "carrots" ) },
}
Potatoes {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "potatoes" ) },
}
WoodenButton {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "wooden_button" ) },
}
Skull {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "skull" ) },
}
Anvil {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "anvil" ) },
}
TrappedChest {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "trapped_chest" ) },
}
LightWeightedPressurePlate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "light_weighted_pressure_plate" ) },
}
HeavyWeightedPressurePlate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "heavy_weighted_pressure_plate" ) },
}
ComparatorUnpowered {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "comparator_unpowered" ) },
}
ComparatorPowered {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "comparator_powered" ) },
}
DaylightDetector {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "daylight_detector" ) },
}
RedstoneBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "redstone_block" ) },
}
QuartzOre {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "quartz_ore" ) },
}
Hopper {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "hopper" ) },
}
QuartzBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "quartz_block" ) },
}
QuartzStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "quartz_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::QuartzStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
ActivatorRail {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "activator_rail" ) },
}
Dropper {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "dropper" ) },
}
StainedHardenedClay {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "stained_hardened_clay" ) },
}
StainedGlassPane {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: true,
},
model { ("minecraft", "stained_glass_pane" ) },
}
Leaves2 {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: true,
transparent: false,
},
model { ("minecraft", "leaves2" ) },
}
Log2 {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "log2" ) },
}
AcaciaStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "acacia_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::AcaciaStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
DarkOakStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "dark_oak_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::DarkOakStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
Slime {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: true,
},
model { ("minecraft", "slime" ) },
}
Barrier {
props {},
material Material {
renderable: false,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "barrier" ) },
}
IronTrapDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "sponge" ) },
}
Prismarine {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "prismarine" ) },
}
SeaLantern {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "sea_lantern" ) },
}
HayBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "hay_block" ) },
}
Carpet {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "carpet" ) },
}
HardenedClay {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "hardened_clay" ) },
}
CoalBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "coal_block" ) },
}
PackedIce {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "packed_ice" ) },
}
DoublePlant {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "double_plant" ) },
}
StandingBanner {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "standing_banner" ) },
}
WallBanner {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "wall_banner" ) },
}
DaylightDetectorInverted {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "daylight_detector_inverted" ) },
}
RedStonestone {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "red_sandstone" ) },
}
RedSandstoneStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "red_sandstone_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::RedSandstoneStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
DoubleStoneSlab2 {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "double_stone_slab2" ) },
}
StoneSlab2 {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "stone_slab2" ) },
}
SpruceFenceGate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "spruce_fence_gate" ) },
}
BirchFenceGate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "birch_fence_gate" ) },
}
JungleFenceGate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "jungle_fence_gate" ) },
}
DarkOakFenceGate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "dark_oak_fence_gate" ) },
}
AcaciaFenceGate {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "acacia_fence_gate" ) },
}
SpruceFence {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "spruce_fence" ) },
}
BirchFence {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "birch_fence" ) },
}
JungleFence {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "jungle_fence" ) },
}
DarkOakFence {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "dark_oak_fence" ) },
}
AcaciaFence {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "acacia_fence" ) },
}
SpruceDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "spruce_door" ) },
}
BirchDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "birch_door" ) },
}
JungleDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "jungle_door" ) },
}
AcaciaDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "acacia_door" ) },
}
DarkOakDoor {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "dark_oak_door" ) },
}
EndRod {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "end_rod" ) },
}
ChorusPlant {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "chorus_plant" ) },
}
ChorusFlower {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "chorus_flower" ) },
}
PurpurBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "purpur_block" ) },
}
PurpurPillar {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "purpur_pillar" ) },
}
PurpurStairs {
props {
facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West],
half: StairHalf = [StairHalf::Top, StairHalf::Bottom],
shape: StairShape = [
StairShape::Straight,
StairShape::InnerLeft, StairShape::InnerRight,
StairShape::OuterLeft, StairShape::OuterRight
],
},
data stair_data(facing, half, shape),
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "purpur_stairs" ) },
variant format!("facing={},half={},shape={}", facing.as_string(), half.as_string(), shape.as_string()),
update_state (world, x, y, z) => Block::PurpurStairs{facing: facing, half: half, shape: update_stair_shape(world, x, y, z, facing)},
}
PurpurDoubleSlab {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "purpur_double_slab" ) },
}
PurpurSlab {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "purpur_slab" ) },
}
EndBricks {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "end_bricks" ) },
}
Beetroots {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "beetroots" ) },
}
GrassPath {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "grass_path" ) },
}
EndGateway {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: false,
force_shade: false,
transparent: false,
},
model { ("minecraft", "end_gateway" ) },
}
RepeatingCommandBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "repeating_command_block" ) },
}
ChainCommandBlock {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "chain_command_block" ) },
}
FrostedIce {
props {},
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("minecraft", "frosted_ice" ) },
}
Missing {
props {},
data { None::<usize> },
material Material {
renderable: true,
never_cull: false,
should_cull_against: true,
force_shade: false,
transparent: false,
},
model { ("steven", "missing_block" ) },
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Axis {
Y,
Z,
X,
None
}
impl Axis {
pub fn as_string(&self) -> &'static str {
match *self {
Axis::X => "x",
Axis::Y => "y",
Axis::Z => "z",
Axis::None => "none",
}
}
fn data(&self) -> usize {
match *self {
Axis::Y => 0,
Axis::Z => 2,
Axis::X => 1,
Axis::None => 3,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum StairHalf {
Top,
Bottom,
}
impl StairHalf {
pub fn as_string(&self) -> &'static str {
match *self {
StairHalf::Top => "top",
StairHalf::Bottom => "bottom",
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum StairShape {
Straight,
InnerLeft,
InnerRight,
OuterLeft,
OuterRight,
}
impl StairShape {
pub fn as_string(&self) -> &'static str {
match *self {
StairShape::Straight => "straight",
StairShape::InnerLeft => "inner_left",
StairShape::InnerRight => "inner_right",
StairShape::OuterLeft => "outer_left",
StairShape::OuterRight => "outer_right",
}
}
}
fn get_stair_info(world: &super::World, x: i32, y: i32, z: i32) -> Option<(Direction, StairHalf)> {
use self::Block::*;
match world.get_block(x, y, z) {
OakStairs{facing, half, ..} |
StoneStairs{facing, half, ..} |
BrickStairs{facing, half, ..} |
StoneBrickStairs{facing, half, ..} |
NetherBrickStairs{facing, half, ..} |
SandstoneStairs{facing, half, ..} |
SpruceStairs{facing, half, ..} |
BirchStairs{facing, half, ..} |
JungleStairs{facing, half, ..} |
QuartzStairs{facing, half, ..} |
AcaciaStairs{facing, half, ..} |
DarkOakStairs{facing, half, ..} |
RedSandstoneStairs{facing, half, ..} |
PurpurStairs{facing, half, ..} => Some((facing, half)),
_ => None,
}
}
fn update_stair_shape(world: &super::World, x: i32, y: i32, z: i32, facing: Direction) -> StairShape {
let (ox, oy, oz) = facing.get_offset();
if let Some((other_facing, _)) = get_stair_info(world, x+ox, y+oy, z+oz) {
if other_facing != facing && other_facing != facing.opposite() {
if other_facing == facing.clockwise() {
return StairShape::OuterRight;
}
return StairShape::OuterLeft;
}
}
let (ox, oy, oz) = facing.opposite().get_offset();
if let Some((other_facing, _)) = get_stair_info(world, x+ox, y+oy, z+oz) {
if other_facing != facing && other_facing != facing.opposite() {
if other_facing == facing.clockwise() {
return StairShape::InnerRight;
}
return StairShape::InnerLeft;
}
}
StairShape::Straight
}
fn stair_data(facing: Direction, half: StairHalf, shape: StairShape) -> Option<usize> {
if shape != StairShape::Straight {
return None;
}
let mut data = match facing {
Direction::East => 0,
Direction::West => 1,
Direction::South => 2,
Direction::North => 3,
_ => unreachable!(),
};
if half == StairHalf::Top {
data |= 0x4;
}
Some(data)
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum TreeVariant {
Oak,
Spruce,
Birch,
Jungle,
Acacia,
DarkOak
}
impl TreeVariant {
pub fn as_string(&self) -> &'static str {
match *self {
TreeVariant::Oak => "oak",
TreeVariant::Spruce => "spruce",
TreeVariant::Birch => "birch",
TreeVariant::Jungle => "jungle",
TreeVariant::Acacia => "acacia",
TreeVariant::DarkOak => "dark_oak",
}
}
pub fn data(&self) -> usize {
match *self {
TreeVariant::Oak => 0,
TreeVariant::Spruce => 1,
TreeVariant::Birch => 2,
TreeVariant::Jungle => 3,
TreeVariant::Acacia => 0,
TreeVariant::DarkOak => 1,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum StoneVariant {
Normal,
Granite,
SmoothGranite,
Diorite,
SmoothDiorite,
Andesite,
SmoothAndesite,
}
impl Display for StoneVariant {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
write!(f, "{}", self.as_string())
}
}
impl StoneVariant {
fn as_string(&self) -> &'static str {
match *self {
StoneVariant::Normal => "stone",
StoneVariant::Granite => "granite",
StoneVariant::SmoothGranite => "smooth_granite",
StoneVariant::Diorite => "diorite",
StoneVariant::SmoothDiorite => "smooth_diorite",
StoneVariant::Andesite => "andesite",
StoneVariant::SmoothAndesite => "smooth_andesite",
}
}
fn data(&self) -> usize {
match *self {
StoneVariant::Normal => 0,
StoneVariant::Granite => 1,
StoneVariant::SmoothGranite => 2,
StoneVariant::Diorite => 3,
StoneVariant::SmoothDiorite => 4,
StoneVariant::Andesite => 5,
StoneVariant::SmoothAndesite => 6,
}
}
}