steel_core/inventory/menu/
kind.rs1use steel_registry::blocks::{BlockRef, block_state_ext::BlockStateExt as _};
4use steel_registry::item_stack::ItemStack;
5use steel_registry::mob_effect::MobEffectRef;
6use steel_utils::{BlockPos, ErasedType};
7
8use crate::inventory::container::DEFAULT_DISTANCE_BUFFER;
9use crate::inventory::menu::behavior::MenuBehavior;
10use crate::world::World;
11use crate::{inventory::lock::ContainerLockGuard, player::Player};
12
13use crate::inventory::click::{Click, ClickOutcome, QuickCraft};
14
15pub trait MenuKind: ErasedType + Send + Sync {
24 fn slots_changed(
26 &mut self,
27 _behavior: &mut MenuBehavior,
28 _guard: &mut ContainerLockGuard,
29 _player: &Player,
30 ) {
31 }
32
33 fn removed(&mut self, _behavior: &mut MenuBehavior, _player: &Player) {}
35
36 fn on_rename(&mut self, _behavior: &mut MenuBehavior, _name: String, _player: &Player) {}
39
40 fn click_menu_button(
44 &mut self,
45 _behavior: &mut MenuBehavior,
46 _button_id: i32,
47 _player: &Player,
48 ) -> bool {
49 false
50 }
51
52 fn on_open(
55 &mut self,
56 _behavior: &mut MenuBehavior,
57 _guard: &mut ContainerLockGuard,
58 _player: &Player,
59 ) {
60 }
61
62 fn on_tick(
64 &mut self,
65 _behavior: &mut MenuBehavior,
66 _guard: &mut ContainerLockGuard,
67 _player: &Player,
68 ) {
69 }
70
71 fn on_slot_clicked(
75 &mut self,
76 _behavior: &mut MenuBehavior,
77 _guard: &mut ContainerLockGuard,
78 _click: Click,
79 _player: &Player,
80 ) -> ClickOutcome {
81 ClickOutcome::Fallthrough
82 }
83
84 fn on_drag(
87 &mut self,
88 _behavior: &mut MenuBehavior,
89 _guard: &mut ContainerLockGuard,
90 _action: QuickCraft,
91 _player: &Player,
92 ) -> ClickOutcome {
93 ClickOutcome::Fallthrough
94 }
95
96 fn can_drag_to(&self, _slot_index: usize) -> bool {
98 true
99 }
100
101 fn still_valid(&self, _behavior: &MenuBehavior, _player: &Player) -> bool {
103 true
104 }
105
106 fn can_take_item_for_pick_all(&self, _carried: &ItemStack, _slot_index: usize) -> bool {
108 true
109 }
110
111 fn on_update_effects(
114 &mut self,
115 _behavior: &mut MenuBehavior,
116 _guard: &mut ContainerLockGuard,
117 _primary: Option<MobEffectRef>,
118 _secondary: Option<MobEffectRef>,
119 ) -> bool {
120 true
121 }
122
123 fn quick_move(
126 &mut self,
127 _behavior: &mut MenuBehavior,
128 _guard: &mut ContainerLockGuard,
129 _slot_index: usize,
130 _player: &Player,
131 ) -> Option<ItemStack> {
132 None
133 }
134}
135
136#[must_use]
140pub fn still_valid_block(world: &World, pos: BlockPos, block: BlockRef, player: &Player) -> bool {
141 world.get_block_state(pos).get_block() == block
142 && player
143 .is_within_block_interaction_range_with_buffer(pos, f64::from(DEFAULT_DISTANCE_BUFFER))
144}