diff --git a/src/model/mod.rs b/src/model/mod.rs index d681b7b..f2759bd 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -416,7 +416,7 @@ impl Factory { let w = ux2 - ux1; let h = uy2 - uy1; match face.rotation { - 90 => { + 270 => { uy2 = x + w; ux1 = tw*16 - (y + h); ux2 = tw*16 - y; @@ -428,7 +428,7 @@ impl Factory { ux1 = x + w; ux2 = x; }, - 270 => { + 90 => { uy2 = x; uy1 = x + w; ux2 = y + h; diff --git a/src/world/block/mod.rs b/src/world/block/mod.rs index 40441a6..9f95ce2 100644 --- a/src/world/block/mod.rs +++ b/src/world/block/mod.rs @@ -350,9 +350,18 @@ define_blocks! { }, model { ("minecraft", "cobblestone" ) }, } - Planks { // TODO + Planks { props { + variant: TreeVariant = [ + TreeVariant::Oak, + TreeVariant::Spruce, + TreeVariant::Birch, + TreeVariant::Jungle, + TreeVariant::Acacia, + TreeVariant::DarkOak + ], }, + data { Some(variant.plank_data()) }, material Material { renderable: true, never_cull: false, @@ -360,11 +369,21 @@ define_blocks! { force_shade: false, transparent: false, }, - model { ("minecraft", "planks" ) }, + model { ("minecraft", format!("{}_planks", variant.as_string()) ) }, } - Sapling { // TODO + Sapling { props { + variant: TreeVariant = [ + TreeVariant::Oak, + TreeVariant::Spruce, + TreeVariant::Birch, + TreeVariant::Jungle, + TreeVariant::Acacia, + TreeVariant::DarkOak + ], + stage: i32 = [0, 1], }, + data { Some(variant.plank_data() | ((stage as usize) << 3)) }, material Material { renderable: true, never_cull: false, @@ -372,7 +391,7 @@ define_blocks! { force_shade: false, transparent: false, }, - model { ("minecraft", "sapling" ) }, + model { ("minecraft", format!("{}_sapling", variant.as_string()) ) }, } Bedrock { props { @@ -442,9 +461,11 @@ define_blocks! { }, model { ("minecraft", "lava" ) }, } - Sand { // TODO + Sand { props { + red: bool = [false, true], }, + data Some(if red { 1 } else { 0 }), material Material { renderable: true, never_cull: false, @@ -452,7 +473,7 @@ define_blocks! { force_shade: false, transparent: false, }, - model { ("minecraft", "sand" ) }, + model { ("minecraft", if red { "red_sand" } else { "sand" } ) }, } Gravel { props { @@ -545,7 +566,10 @@ define_blocks! { tint TintType::Foliage, } Sponge { - props {}, + props { + wet: bool = [false, true], + }, + data { Some(if wet { 1 } else { 0 }) }, material Material { renderable: true, never_cull: false, @@ -554,6 +578,7 @@ define_blocks! { transparent: false, }, model { ("minecraft", "sponge" ) }, + variant format!("wet={}", wet), } Glass { props {}, @@ -589,7 +614,32 @@ define_blocks! { model { ("minecraft", "lapis_block" ) }, } Dispenser { - props {}, + props { + facing: Direction = [ + Direction::North, + Direction::South, + Direction::East, + Direction::West, + Direction::Up, + Direction::Down + ], + triggered: bool = [false, true], + }, + data { + let mut data = match facing { + Direction::Down => 0, + Direction::Up => 1, + Direction::North => 2, + Direction::South => 3, + Direction::West => 4, + Direction::East => 5, + _ => unreachable!(), + }; + if triggered { + data |= 0x8; + } + Some(data) + }, material Material { renderable: true, never_cull: false, @@ -598,9 +648,17 @@ define_blocks! { transparent: false, }, model { ("minecraft", "dispenser" ) }, + variant format!("facing={}", facing.as_string()), } Sandstone { - props {}, + props { + variant: SandstoneVariant = [ + SandstoneVariant::Normal, + SandstoneVariant::Chiseled, + SandstoneVariant::Smooth + ], + }, + data Some(variant.data()), material Material { renderable: true, never_cull: false, @@ -608,7 +666,7 @@ define_blocks! { force_shade: false, transparent: false, }, - model { ("minecraft", "sandstone" ) }, + model { ("minecraft", variant.as_string() ) }, } NoteBlock { props {}, @@ -622,48 +680,122 @@ define_blocks! { model { ("minecraft", "noteblock" ) }, } Bed { - props {}, + props { + facing: Direction = [Direction::North, Direction::South, Direction::East, Direction::West], + occupied: bool = [false, true], + part: BedPart = [BedPart::Head, BedPart::Foot], + }, + data { + let mut data = match facing { + Direction::South => 0, + Direction::West => 1, + Direction::North => 2, + Direction::East => 3, + _ => unreachable!(), + }; + if occupied { + data |= 0x4; + } + if part == BedPart::Head { + data |= 0x8; + } + Some(data) + }, material Material { renderable: true, never_cull: false, - should_cull_against: true, + should_cull_against: false, force_shade: false, transparent: false, }, model { ("minecraft", "bed" ) }, + variant format!("facing={},part={}", facing.as_string(), part.as_string()), } GoldenRail { - props {}, + props { + powered: bool = [false, true], + shape: RailShape = [ + RailShape::NorthSouth, RailShape::EastWest, + RailShape::AscendingNorth, RailShape::AscendingSouth, + RailShape::AscendingEast, RailShape::AscendingWest + ], + }, + data { + let mut data = shape.data(); + if powered { + data |= 0x8; + } + Some(data) + }, material Material { renderable: true, never_cull: false, - should_cull_against: true, + should_cull_against: false, force_shade: false, transparent: false, }, model { ("minecraft", "golden_rail" ) }, + variant format!("powered={},shape={}", powered, shape.as_string()), } DetectorRail { - props {}, + props { + powered: bool = [false, true], + shape: RailShape = [ + RailShape::NorthSouth, RailShape::EastWest, + RailShape::AscendingNorth, RailShape::AscendingSouth, + RailShape::AscendingEast, RailShape::AscendingWest + ], + }, + data { + let mut data = shape.data(); + if powered { + data |= 0x8; + } + Some(data) + }, material Material { renderable: true, never_cull: false, - should_cull_against: true, + should_cull_against: false, force_shade: false, transparent: false, }, model { ("minecraft", "detector_rail" ) }, + variant format!("powered={},shape={}", powered, shape.as_string()), } StickyPiston { - props {}, + props { + extended: bool = [false, true], + facing: Direction = [ + Direction::North, Direction::South, + Direction::East, Direction::West, + Direction::Up, Direction::Down + ], + }, + data { + let mut data = match facing { + Direction::Down => 0, + Direction::Up => 1, + Direction::North => 2, + Direction::South => 3, + Direction::East => 5, + Direction::West => 4, + _ => unreachable!(), + }; + if extended { + data |= 0x8; + } + Some(data) + }, material Material { renderable: true, never_cull: false, - should_cull_against: true, + should_cull_against: !extended, force_shade: false, transparent: false, }, model { ("minecraft", "stick_piston" ) }, + variant format!("extended={},facing={}", extended, facing.as_string()), } Web { props {}, @@ -677,7 +809,14 @@ define_blocks! { model { ("minecraft", "web" ) }, } TallGrass { - props {}, + props { + variant: TallGrassVariant = [TallGrassVariant::DeadBush, TallGrassVariant::TallGrass, TallGrassVariant::Fern], + }, + data Some(match variant { + TallGrassVariant::DeadBush => 0, + TallGrassVariant::TallGrass => 1, + TallGrassVariant::Fern => 2, + }), material Material { renderable: true, never_cull: false, @@ -685,7 +824,7 @@ define_blocks! { force_shade: false, transparent: false, }, - model { ("minecraft", "tallgrass" ) }, + model { ("minecraft", variant.as_string() ) }, } DeadBush { props {}, @@ -696,18 +835,41 @@ define_blocks! { force_shade: false, transparent: false, }, - model { ("minecraft", "deadbush" ) }, + model { ("minecraft", "dead_bush" ) }, } Piston { - props {}, + props { + extended: bool = [false, true], + facing: Direction = [ + Direction::North, Direction::South, + Direction::East, Direction::West, + Direction::Up, Direction::Down + ], + }, + data { + let mut data = match facing { + Direction::Down => 0, + Direction::Up => 1, + Direction::North => 2, + Direction::South => 3, + Direction::East => 5, + Direction::West => 4, + _ => unreachable!(), + }; + if extended { + data |= 0x8; + } + Some(data) + }, material Material { renderable: true, never_cull: false, - should_cull_against: true, + should_cull_against: !extended, force_shade: false, transparent: false, }, model { ("minecraft", "piston" ) }, + variant format!("extended={},facing={}", extended, facing.as_string()), } PistonHead { props {}, @@ -1585,7 +1747,7 @@ define_blocks! { force_shade: false, transparent: false, }, - model { ("minecraft", "StoneBrickStairs" ) }, + model { ("minecraft", "stone_brick_stairs" ) }, 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)}, } @@ -2845,6 +3007,108 @@ define_blocks! { model { ("steven", "missing_block" ) }, } } +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum TallGrassVariant { + DeadBush, + TallGrass, + Fern, +} + +impl TallGrassVariant { + pub fn as_string(&self) -> &'static str { + match *self { + TallGrassVariant::DeadBush => "dead_bush", + TallGrassVariant::TallGrass => "tall_grass", + TallGrassVariant::Fern => "fern", + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum RailShape { + NorthSouth, + EastWest, + AscendingNorth, + AscendingSouth, + AscendingEast, + AscendingWest, + NorthEast, + NorthWest, + SouthEast, + SouthWest, +} + +impl RailShape { + pub fn as_string(&self) -> &'static str { + match *self { + RailShape::NorthSouth => "north_south", + RailShape::EastWest => "east_west", + RailShape::AscendingNorth => "ascending_north", + RailShape::AscendingSouth => "ascending_south", + RailShape::AscendingEast => "ascending_east", + RailShape::AscendingWest => "ascending_west", + RailShape::NorthEast => "north_east", + RailShape::NorthWest => "north_west", + RailShape::SouthEast => "south_east", + RailShape::SouthWest => "south_west", + } + } + + pub fn data(&self) -> usize { + match *self { + RailShape::NorthSouth => 0, + RailShape::EastWest => 1, + RailShape::AscendingEast => 2, + RailShape::AscendingWest => 3, + RailShape::AscendingNorth => 4, + RailShape::AscendingSouth => 5, + RailShape::SouthEast => 6, + RailShape::SouthWest => 7, + RailShape::NorthWest => 8, + RailShape::NorthEast => 9, + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum BedPart { + Head, + Foot +} + +impl BedPart { + pub fn as_string(&self) -> &'static str { + match *self { + BedPart::Head => "head", + BedPart::Foot => "foot", + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum SandstoneVariant { + Normal, + Chiseled, + Smooth, +} + +impl SandstoneVariant { + pub fn as_string(&self) -> &'static str { + match *self { + SandstoneVariant::Normal => "sandstone", + SandstoneVariant::Chiseled => "chiseled_sandstone", + SandstoneVariant::Smooth => "smooth_sandstone", + } + } + + fn data(&self) -> usize { + match *self { + SandstoneVariant::Normal => 0, + SandstoneVariant::Chiseled => 1, + SandstoneVariant::Smooth => 2, + } + } +} #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] pub enum Axis { @@ -2863,6 +3127,7 @@ impl Axis { Axis::None => "none", } } + fn data(&self) -> usize { match *self { Axis::Y => 0, @@ -2991,6 +3256,7 @@ impl TreeVariant { TreeVariant::DarkOak => "dark_oak", } } + pub fn data(&self) -> usize { match *self { TreeVariant::Oak => 0, @@ -3001,6 +3267,17 @@ impl TreeVariant { TreeVariant::DarkOak => 1, } } + + pub fn plank_data(&self) -> usize { + match *self { + TreeVariant::Oak => 0, + TreeVariant::Spruce => 1, + TreeVariant::Birch => 2, + TreeVariant::Jungle => 3, + TreeVariant::Acacia => 4, + TreeVariant::DarkOak => 5, + } + } } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]