Implement stairs
This commit is contained in:
parent
0855424e52
commit
25a743703c
|
@ -24,7 +24,7 @@ pub mod hash;
|
||||||
|
|
||||||
use model::{PRECOMPUTED_VERTS, BlockVertex};
|
use model::{PRECOMPUTED_VERTS, BlockVertex};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
pub enum Direction {
|
pub enum Direction {
|
||||||
Invalid,
|
Invalid,
|
||||||
Up,
|
Up,
|
||||||
|
@ -68,6 +68,30 @@ impl Direction {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clockwise(&self) -> Direction {
|
||||||
|
match *self {
|
||||||
|
Direction::Up => Direction::Up,
|
||||||
|
Direction::Down => Direction::Down,
|
||||||
|
Direction::East => Direction::South,
|
||||||
|
Direction::West => Direction::North,
|
||||||
|
Direction::South => Direction::West,
|
||||||
|
Direction::North => Direction::East,
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn counter_clockwise(&self) -> Direction {
|
||||||
|
match *self {
|
||||||
|
Direction::Up => Direction::Up,
|
||||||
|
Direction::Down => Direction::Down,
|
||||||
|
Direction::East => Direction::North,
|
||||||
|
Direction::West => Direction::South,
|
||||||
|
Direction::South => Direction::East,
|
||||||
|
Direction::North => Direction::West,
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_verts(&self) -> &'static [BlockVertex; 4] {
|
pub fn get_verts(&self) -> &'static [BlockVertex; 4] {
|
||||||
match *self {
|
match *self {
|
||||||
Direction::Up => PRECOMPUTED_VERTS[0],
|
Direction::Up => PRECOMPUTED_VERTS[0],
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
|
||||||
use std::fmt::{Display, Formatter, Error};
|
use std::fmt::{Display, Formatter, Error};
|
||||||
use collision::{Aabb, Aabb3};
|
use collision::{Aabb, Aabb3};
|
||||||
use cgmath::{Point3, Point};
|
use cgmath::Point3;
|
||||||
|
use types::Direction;
|
||||||
|
|
||||||
pub use self::Block::*;
|
pub use self::Block::*;
|
||||||
|
|
||||||
|
@ -39,7 +40,7 @@ macro_rules! define_blocks {
|
||||||
$(variant $variant:expr,)*
|
$(variant $variant:expr,)*
|
||||||
$(tint $tint:expr,)*
|
$(tint $tint:expr,)*
|
||||||
$(collision $collision:expr,)*
|
$(collision $collision:expr,)*
|
||||||
$(update_state $update_state:expr,)*
|
$(update_state ($world:ident, $x:ident, $y:ident, $z:ident) => $update_state:expr,)*
|
||||||
}
|
}
|
||||||
)+
|
)+
|
||||||
) => (
|
) => (
|
||||||
|
@ -217,7 +218,13 @@ macro_rules! define_blocks {
|
||||||
Block::$name {
|
Block::$name {
|
||||||
$($fname,)*
|
$($fname,)*
|
||||||
} => {
|
} => {
|
||||||
$(return $update_state;)*
|
$(
|
||||||
|
let $world = world;
|
||||||
|
let $x = x;
|
||||||
|
let $y = y;
|
||||||
|
let $z = z;
|
||||||
|
return $update_state;
|
||||||
|
)*
|
||||||
return Block::$name {
|
return Block::$name {
|
||||||
$($fname: $fname,)*
|
$($fname: $fname,)*
|
||||||
};
|
};
|
||||||
|
@ -236,7 +243,17 @@ macro_rules! define_blocks {
|
||||||
if blocks.len() <= id {
|
if blocks.len() <= id {
|
||||||
blocks.resize(id + 1, None);
|
blocks.resize(id + 1, None);
|
||||||
}
|
}
|
||||||
blocks[id] = Some(block);
|
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
|
blocks
|
||||||
|
@ -902,7 +919,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "mob_spawner" ) },
|
model { ("minecraft", "mob_spawner" ) },
|
||||||
}
|
}
|
||||||
OakStairs {
|
OakStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -911,6 +937,8 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "oak_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
Chest {
|
Chest {
|
||||||
props {},
|
props {},
|
||||||
|
@ -1056,7 +1084,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "rail" ) },
|
model { ("minecraft", "rail" ) },
|
||||||
}
|
}
|
||||||
StoneStairs {
|
StoneStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -1065,6 +1102,8 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "stone_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
WallSign {
|
WallSign {
|
||||||
props {},
|
props {},
|
||||||
|
@ -1507,7 +1546,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "fence_gate" ) },
|
model { ("minecraft", "fence_gate" ) },
|
||||||
}
|
}
|
||||||
BrickStairs {
|
BrickStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -1516,9 +1564,20 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "brick_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
StoneBrickStairs {
|
StoneBrickStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -1526,7 +1585,9 @@ define_blocks! {
|
||||||
force_shade: false,
|
force_shade: false,
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "stone_brick_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
Mycelium {
|
Mycelium {
|
||||||
props {},
|
props {},
|
||||||
|
@ -1573,7 +1634,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "nether_brick_fence" ) },
|
model { ("minecraft", "nether_brick_fence" ) },
|
||||||
}
|
}
|
||||||
NetherBrickStairs {
|
NetherBrickStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -1582,6 +1652,8 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "nether_brick_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
NetherWart {
|
NetherWart {
|
||||||
props {},
|
props {},
|
||||||
|
@ -1727,7 +1799,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "cocoa" ) },
|
model { ("minecraft", "cocoa" ) },
|
||||||
}
|
}
|
||||||
SandstoneStairs {
|
SandstoneStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -1736,6 +1817,8 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "sandstone_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
EmeraldOre {
|
EmeraldOre {
|
||||||
props {},
|
props {},
|
||||||
|
@ -1793,7 +1876,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "emerald_block" ) },
|
model { ("minecraft", "emerald_block" ) },
|
||||||
}
|
}
|
||||||
SpruceStairs {
|
SpruceStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -1802,9 +1894,20 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "spruce_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
BirchStairs {
|
BirchStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -1813,9 +1916,20 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "birch_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
JungleStairs {
|
JungleStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -1824,6 +1938,8 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "jungle_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
CommandBlock {
|
CommandBlock {
|
||||||
props {},
|
props {},
|
||||||
|
@ -2035,15 +2151,26 @@ define_blocks! {
|
||||||
model { ("minecraft", "quartz_block" ) },
|
model { ("minecraft", "quartz_block" ) },
|
||||||
}
|
}
|
||||||
QuartzStairs {
|
QuartzStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
should_cull_against: true,
|
should_cull_against: false,
|
||||||
force_shade: false,
|
force_shade: false,
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "quartz_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
ActivatorRail {
|
ActivatorRail {
|
||||||
props {},
|
props {},
|
||||||
|
@ -2112,7 +2239,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "log2" ) },
|
model { ("minecraft", "log2" ) },
|
||||||
}
|
}
|
||||||
AcaciaStairs {
|
AcaciaStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -2120,10 +2256,21 @@ define_blocks! {
|
||||||
force_shade: false,
|
force_shade: false,
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "acacia-stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
DarkOakStairs {
|
DarkOakStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -2132,6 +2279,8 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "dark_oak_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
Slime {
|
Slime {
|
||||||
props {},
|
props {},
|
||||||
|
@ -2299,7 +2448,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "red_sandstone" ) },
|
model { ("minecraft", "red_sandstone" ) },
|
||||||
}
|
}
|
||||||
RedSandstoneStairs {
|
RedSandstoneStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -2308,6 +2466,8 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "red_sandstone_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
DoubleStoneSlab2 {
|
DoubleStoneSlab2 {
|
||||||
props {},
|
props {},
|
||||||
|
@ -2552,7 +2712,16 @@ define_blocks! {
|
||||||
model { ("minecraft", "purpur_pillar" ) },
|
model { ("minecraft", "purpur_pillar" ) },
|
||||||
}
|
}
|
||||||
PurpurStairs {
|
PurpurStairs {
|
||||||
props {},
|
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 {
|
material Material {
|
||||||
renderable: true,
|
renderable: true,
|
||||||
never_cull: false,
|
never_cull: false,
|
||||||
|
@ -2561,6 +2730,8 @@ define_blocks! {
|
||||||
transparent: false,
|
transparent: false,
|
||||||
},
|
},
|
||||||
model { ("minecraft", "purpur_stairs" ) },
|
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, half, shape)},
|
||||||
}
|
}
|
||||||
PurpurDoubleSlab {
|
PurpurDoubleSlab {
|
||||||
props {},
|
props {},
|
||||||
|
@ -2702,6 +2873,103 @@ impl Axis {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[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, ..} => Some((facing, half)),
|
||||||
|
StoneStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
BrickStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
StoneBrickStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
NetherBrickStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
SandstoneStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
SpruceStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
BirchStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
JungleStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
QuartzStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
AcaciaStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
DarkOakStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
RedSandstoneStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
PurpurStairs{facing, half, ..} => Some((facing, half)),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update_stair_shape(world: &super::World, x: i32, y: i32, z: i32, facing: Direction, half: StairHalf, shape: StairShape) -> 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)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
||||||
pub enum TreeVariant {
|
pub enum TreeVariant {
|
||||||
Oak,
|
Oak,
|
||||||
|
|
Loading…
Reference in New Issue