68 lines
2.4 KiB
Rust
68 lines
2.4 KiB
Rust
use crate::block::BlockFuture;
|
|
use crate::block::GetStateForNeighborUpdateArgs;
|
|
use crate::block::OnPlaceArgs;
|
|
use pumpkin_data::BlockDirection;
|
|
use pumpkin_data::HorizontalFacingExt;
|
|
use pumpkin_data::block_properties::BlockProperties;
|
|
use pumpkin_data::block_properties::HorizontalFacing;
|
|
use pumpkin_data::tag::Taggable;
|
|
use pumpkin_data::{Block, tag};
|
|
use pumpkin_macros::pumpkin_block;
|
|
use pumpkin_util::math::position::BlockPos;
|
|
use pumpkin_world::BlockStateId;
|
|
|
|
type IronBarsProperties = pumpkin_data::block_properties::OakFenceLikeProperties;
|
|
|
|
use crate::block::BlockBehaviour;
|
|
use crate::world::World;
|
|
|
|
#[pumpkin_block("minecraft:iron_bars")]
|
|
pub struct IronBarsBlock;
|
|
|
|
impl BlockBehaviour for IronBarsBlock {
|
|
fn on_place<'a>(&'a self, args: OnPlaceArgs<'a>) -> BlockFuture<'a, BlockStateId> {
|
|
Box::pin(async move {
|
|
let mut bars_props = IronBarsProperties::default(args.block);
|
|
bars_props.waterlogged = args.replacing.water_source();
|
|
|
|
compute_bars_state(bars_props, args.world, args.block, args.position)
|
|
})
|
|
}
|
|
|
|
fn get_state_for_neighbor_update<'a>(
|
|
&'a self,
|
|
args: GetStateForNeighborUpdateArgs<'a>,
|
|
) -> BlockFuture<'a, BlockStateId> {
|
|
Box::pin(async move {
|
|
let bars_props = IronBarsProperties::from_state_id(args.state_id, args.block);
|
|
compute_bars_state(bars_props, args.world, args.block, args.position)
|
|
})
|
|
}
|
|
}
|
|
|
|
pub fn compute_bars_state(
|
|
mut bars_props: IronBarsProperties,
|
|
world: &World,
|
|
block: &Block,
|
|
block_pos: &BlockPos,
|
|
) -> u16 {
|
|
for direction in BlockDirection::horizontal() {
|
|
let other_block_pos = block_pos.offset(direction.to_offset());
|
|
let (other_block, other_block_state) = world.get_block_and_state(&other_block_pos);
|
|
|
|
let connected = other_block == block
|
|
|| other_block_state.is_side_solid(direction.opposite().to_block_direction())
|
|
|| other_block.has_tag(&tag::Block::C_GLASS_PANES)
|
|
|| other_block.has_tag(&tag::Block::MINECRAFT_WALLS);
|
|
|
|
match direction {
|
|
HorizontalFacing::North => bars_props.north = connected,
|
|
HorizontalFacing::South => bars_props.south = connected,
|
|
HorizontalFacing::West => bars_props.west = connected,
|
|
HorizontalFacing::East => bars_props.east = connected,
|
|
}
|
|
}
|
|
|
|
bars_props.to_state_id(block)
|
|
}
|