diff --git a/crates/pumpkin/src/block/blocks/mod.rs b/crates/pumpkin/src/block/blocks/mod.rs index 8b0a63375..51281adc2 100644 --- a/crates/pumpkin/src/block/blocks/mod.rs +++ b/crates/pumpkin/src/block/blocks/mod.rs @@ -118,6 +118,7 @@ pub mod fletching_table; pub mod loom; pub mod smithing_table; pub mod sniffer_egg; +pub mod structure_block; pub mod trial_spawner; pub mod turtle_egg; pub mod vault; diff --git a/crates/pumpkin/src/block/blocks/structure_block.rs b/crates/pumpkin/src/block/blocks/structure_block.rs new file mode 100644 index 000000000..e30fa607d --- /dev/null +++ b/crates/pumpkin/src/block/blocks/structure_block.rs @@ -0,0 +1,33 @@ +use crate::block::registry::BlockActionResult; +use crate::block::{BlockBehaviour, BlockFuture, NormalUseArgs, OnPlaceArgs}; + +use pumpkin_data::BlockStateId; +use pumpkin_data::block_properties::{BlockProperties, StructureBlockLikeProperties}; +use pumpkin_macros::pumpkin_block; +use pumpkin_util::PermissionLvl; + +#[pumpkin_block("minecraft:structure_block")] +pub struct StructureBlock; + +impl BlockBehaviour for StructureBlock { + fn on_place<'a>(&'a self, args: OnPlaceArgs<'a>) -> BlockFuture<'a, BlockStateId> { + Box::pin(async move { + let props = StructureBlockLikeProperties::default(args.block); + props.to_state_id(args.block) + }) + } + + fn normal_use<'a>(&'a self, args: NormalUseArgs<'a>) -> BlockFuture<'a, BlockActionResult> { + Box::pin(async move { + if args.player.permission_lvl.load() < PermissionLvl::Two { + return BlockActionResult::Pass; + } + let Some(block_entity) = args.world.get_block_entity(args.position) else { + return BlockActionResult::Pass; + }; + args.world.update_block_entity(&block_entity); + + BlockActionResult::Success + }) + } +} diff --git a/crates/pumpkin/src/block/entities/mod.rs b/crates/pumpkin/src/block/entities/mod.rs index a16226cbb..29d4e8af3 100644 --- a/crates/pumpkin/src/block/entities/mod.rs +++ b/crates/pumpkin/src/block/entities/mod.rs @@ -356,6 +356,10 @@ pub fn create_block_entity( "creaking_heart" => Some(Arc::new(creaking_heart::CreakingHeartBlockEntity::new( position, ))), + "piston" => Some(Arc::new(piston::PistonBlockEntity::from_nbt( + &pumpkin_nbt::compound::NbtCompound::new(), + position, + ))), "brewing_stand" => Some(Arc::new(brewing_stand::BrewingStandBlockEntity::new( position, ))), diff --git a/crates/pumpkin/src/block/registry.rs b/crates/pumpkin/src/block/registry.rs index e30851976..9668f2c52 100644 --- a/crates/pumpkin/src/block/registry.rs +++ b/crates/pumpkin/src/block/registry.rs @@ -138,6 +138,7 @@ use crate::block::blocks::snow::LayeredSnowBlock; use crate::block::blocks::spawner::SpawnerBlock; use crate::block::blocks::sponge::{SpongeBlock, WetSpongeBlock}; use crate::block::blocks::stairs::StairBlock; +use crate::block::blocks::structure_block::StructureBlock; use crate::block::blocks::tnt::TNTBlock; use crate::block::blocks::torches::TorchBlock; use crate::block::blocks::trapdoor::TrapDoorBlock; @@ -257,6 +258,7 @@ pub fn default_registry() -> Arc { manager.register(CartographyTableBlock); manager.register(SmithingTableBlock); manager.register(FletchingTableBlock); + manager.register(StructureBlock); manager.register(ShortPlantBlock); manager.register(DryVegetationBlock); manager.register(LilyPadBlock);