steel_core/behavior/blocks/container/
crafting_table_block.rs1use std::sync::Arc;
6
7use steel_macros::block_behavior;
8use steel_registry::blocks::BlockRef;
9use steel_utils::{BlockPos, BlockStateId, translations};
10use text_components::TextComponent;
11
12use crate::behavior::InventoryAccess;
13use crate::behavior::block::BlockBehavior;
14use crate::behavior::context::{BlockHitResult, BlockPlaceContext, InteractionResult};
15use crate::inventory::menu::kinds::crafting;
16use crate::player::Player;
17use crate::world::World;
18
19#[block_behavior]
24pub struct CraftingTableBlock {
25 block: BlockRef,
26}
27
28impl CraftingTableBlock {
29 #[must_use]
31 pub const fn new(block: BlockRef) -> Self {
32 Self { block }
33 }
34}
35
36impl BlockBehavior for CraftingTableBlock {
37 fn get_state_for_placement(&self, _context: &BlockPlaceContext<'_>) -> Option<BlockStateId> {
38 Some(self.block.default_state())
39 }
40
41 fn use_without_item(
42 &self,
43 _state: BlockStateId,
44 _world: &Arc<World>,
45 pos: BlockPos,
46 player: &Player,
47 _hit_result: &BlockHitResult,
48 _inv: &mut InventoryAccess,
49 ) -> InteractionResult {
50 let inventory = player.inventory.clone();
51 player.open_menu(
52 TextComponent::translated(translations::CONTAINER_CRAFTING.msg()),
53 move |context| crafting(inventory, context.container_id, pos),
54 );
55 InteractionResult::Success
57 }
58}