Pumpkin/pumpkin/src/block/blocks/brewing_stand.rs
2026-05-14 20:34:55 +02:00

75 lines
2.6 KiB
Rust

use std::sync::Arc;
use crate::block::{BlockFuture, PlacedArgs};
use crate::block::{
registry::BlockActionResult,
{BlockBehaviour, NormalUseArgs},
};
use crate::block::entities::brewing_stand::BrewingStandBlockEntity;
use pumpkin_data::translation;
use pumpkin_inventory::player::player_inventory::PlayerInventory;
use pumpkin_inventory::screen_handler::{BoxFuture, ScreenHandlerFactory, SharedScreenHandler};
use pumpkin_macros::pumpkin_block;
use pumpkin_util::text::TextComponent;
use pumpkin_world::inventory::Inventory;
struct BrewingScreenFactory(
Arc<dyn Inventory>,
Arc<dyn crate::block::entities::PropertyDelegate>,
);
impl ScreenHandlerFactory for BrewingScreenFactory {
fn create_screen_handler<'a>(
&'a self,
sync_id: u8,
player_inventory: &'a Arc<PlayerInventory>,
_player: &'a dyn pumpkin_inventory::screen_handler::InventoryPlayer,
) -> BoxFuture<'a, Option<SharedScreenHandler>> {
let inventory = self.0.clone();
let property_delegate = self.1.clone();
let pi = player_inventory.clone();
Box::pin(async move {
// Delegate to pumpkin-inventory brewing creator
pumpkin_inventory::brewing::create_brewing(sync_id, pi, inventory, property_delegate)
.await
.map(|handler| Arc::new(tokio::sync::Mutex::new(handler)) as SharedScreenHandler)
})
}
fn get_display_name(&self) -> TextComponent {
TextComponent::translate_cross(
translation::java::CONTAINER_BREWING,
translation::bedrock::CONTAINER_BREWING,
&[],
)
}
}
#[pumpkin_block("minecraft:brewing_stand")]
pub struct BrewingStandBlock;
impl BlockBehaviour for BrewingStandBlock {
fn normal_use<'a>(&'a self, args: NormalUseArgs<'a>) -> BlockFuture<'a, BlockActionResult> {
Box::pin(async move {
if let Some(block_entity) = args.world.get_block_entity(args.position)
&& let Some(inventory) = block_entity.clone().get_inventory()
&& let Some(pd) = block_entity.clone().to_property_delegate()
{
args.player
.open_handled_screen(&BrewingScreenFactory(inventory, pd), Some(*args.position))
.await;
}
BlockActionResult::Success
})
}
fn placed<'a>(&'a self, args: PlacedArgs<'a>) -> BlockFuture<'a, ()> {
Box::pin(async move {
let be = BrewingStandBlockEntity::new(*args.position);
args.world.add_block_entity(Arc::new(be));
})
}
}