diff --git a/pumpkin/src/block/blocks/barrier.rs b/pumpkin/src/block/blocks/barrier.rs new file mode 100644 index 000000000..5575b58f2 --- /dev/null +++ b/pumpkin/src/block/blocks/barrier.rs @@ -0,0 +1,39 @@ +use crate::block::{BlockBehaviour, GetStateForNeighborUpdateArgs, OnPlaceArgs}; +use async_trait::async_trait; +use pumpkin_data::block_properties::{ + BlockProperties, MangroveRootsLikeProperties as BarrierLikeProperties, +}; +use pumpkin_data::fluid::Fluid; +use pumpkin_macros::pumpkin_block; +use pumpkin_world::BlockStateId; +use pumpkin_world::tick::TickPriority; + +#[pumpkin_block("minecraft:barrier")] +pub struct BarrierBlock; + +#[async_trait] +impl BlockBehaviour for BarrierBlock { + async fn on_place(&self, args: OnPlaceArgs<'_>) -> BlockStateId { + let mut props = BarrierLikeProperties::default(args.block); + props.waterlogged = args.replacing.water_source(); + props.to_state_id(args.block) + } + + async fn get_state_for_neighbor_update( + &self, + args: GetStateForNeighborUpdateArgs<'_>, + ) -> BlockStateId { + let props = BarrierLikeProperties::from_state_id(args.state_id, args.block); + if props.waterlogged { + args.world + .schedule_fluid_tick( + &Fluid::WATER, + *args.position, + Fluid::WATER.flow_speed as u8, + TickPriority::Normal, + ) + .await; + } + props.to_state_id(args.block) + } +} diff --git a/pumpkin/src/block/blocks/mangrove_roots.rs b/pumpkin/src/block/blocks/mangrove_roots.rs new file mode 100644 index 000000000..d4c8cb4d6 --- /dev/null +++ b/pumpkin/src/block/blocks/mangrove_roots.rs @@ -0,0 +1,37 @@ +use crate::block::{BlockBehaviour, GetStateForNeighborUpdateArgs, OnPlaceArgs}; +use async_trait::async_trait; +use pumpkin_data::block_properties::{BlockProperties, MangroveRootsLikeProperties}; +use pumpkin_data::fluid::Fluid; +use pumpkin_macros::pumpkin_block; +use pumpkin_world::BlockStateId; +use pumpkin_world::tick::TickPriority; + +#[pumpkin_block("minecraft:mangrove_roots")] +pub struct MangroveRootsBlock; + +#[async_trait] +impl BlockBehaviour for MangroveRootsBlock { + async fn on_place(&self, args: OnPlaceArgs<'_>) -> BlockStateId { + let mut props = MangroveRootsLikeProperties::default(args.block); + props.waterlogged = args.replacing.water_source(); + props.to_state_id(args.block) + } + + async fn get_state_for_neighbor_update( + &self, + args: GetStateForNeighborUpdateArgs<'_>, + ) -> BlockStateId { + let props = MangroveRootsLikeProperties::from_state_id(args.state_id, args.block); + if props.waterlogged { + args.world + .schedule_fluid_tick( + &Fluid::WATER, + *args.position, + Fluid::WATER.flow_speed as u8, + TickPriority::Normal, + ) + .await; + } + props.to_state_id(args.block) + } +} diff --git a/pumpkin/src/block/blocks/mod.rs b/pumpkin/src/block/blocks/mod.rs index cae858390..742d8703e 100644 --- a/pumpkin/src/block/blocks/mod.rs +++ b/pumpkin/src/block/blocks/mod.rs @@ -1,6 +1,7 @@ pub mod anvil; pub mod bamboo; pub mod barrel; +pub mod barrier; pub mod bed; pub mod cactus; pub mod cake; @@ -35,6 +36,7 @@ pub mod jukebox; pub mod ladder; pub mod lanterns; pub mod logs; +pub mod mangrove_roots; pub mod nether_portal; pub mod note; pub mod piston; diff --git a/pumpkin/src/block/registry.rs b/pumpkin/src/block/registry.rs index 03ffa91eb..ceccf4e91 100644 --- a/pumpkin/src/block/registry.rs +++ b/pumpkin/src/block/registry.rs @@ -1,6 +1,7 @@ use crate::block::blocks::anvil::AnvilBlock; use crate::block::blocks::bamboo::BambooBlock; use crate::block::blocks::barrel::BarrelBlock; +use crate::block::blocks::barrier::BarrierBlock; use crate::block::blocks::bed::BedBlock; use crate::block::blocks::cactus::CactusBlock; use crate::block::blocks::carpet::{CarpetBlock, MossCarpetBlock, PaleMossCarpetBlock}; @@ -23,6 +24,7 @@ use crate::block::blocks::glass_panes::GlassPaneBlock; use crate::block::blocks::grindstone::GrindstoneBlock; use crate::block::blocks::iron_bars::IronBarsBlock; use crate::block::blocks::logs::LogBlock; +use crate::block::blocks::mangrove_roots::MangroveRootsBlock; use crate::block::blocks::nether_portal::NetherPortalBlock; use crate::block::blocks::note::NoteBlock; use crate::block::blocks::piston::piston::PistonBlock; @@ -215,6 +217,8 @@ pub fn default_registry() -> Arc { manager.register(ChainBlock); manager.register(LanternBlock); manager.register(EndRodBlock); + manager.register(BarrierBlock); + manager.register(MangroveRootsBlock); manager.register(FallingBlock);