@@ -153,19 +153,59 @@ core.register_entity("drawers:visual", {
153
153
end ,
154
154
155
155
on_rightclick = function (self , clicker )
156
- if core .is_protected (self .drawer_pos , clicker :get_player_name ()) then
157
- core .record_protection_violation (self .drawer_pos , clicker :get_player_name ())
158
- return
156
+ if core .is_protected (self .drawer_pos , clicker :get_player_name ()) then
157
+ core .record_protection_violation (self .drawer_pos , clicker :get_player_name ())
158
+ return
159
+ end
160
+
161
+ -- used to check if we need to play a sound in the end
162
+ local inventoryChanged = false
163
+
164
+ -- When the player uses the drawer with their bare hand all
165
+ -- stacks from the inventory will be added to the drawer.
166
+ if self .itemName ~= " " and
167
+ clicker :get_wielded_item ():get_name () == " " and
168
+ not clicker :get_player_control ().sneak then
169
+ -- try to insert all items from inventory
170
+ local i = 0
171
+ local inv = clicker :get_inventory ()
172
+
173
+ while i < inv :get_size (" main" ) do
174
+ -- set current stack to leftover of insertion
175
+ local leftover = self .try_insert_stack (
176
+ self ,
177
+ inv :get_stack (" main" , i ),
178
+ true
179
+ )
180
+
181
+ -- check if something was added
182
+ if leftover :get_count () < inv :get_stack (" main" , i ):get_count () then
183
+ inventoryChanged = true
184
+ end
185
+
186
+ -- set new stack
187
+ inv :set_stack (" main" , i , leftover )
188
+ i = i + 1
189
+ end
190
+ else
191
+ -- try to insert wielded item only
192
+ local leftover = self .try_insert_stack (
193
+ self ,
194
+ clicker :get_wielded_item (),
195
+ not clicker :get_player_control ().sneak
196
+ )
197
+
198
+ -- check if something was added
199
+ if clicker :get_wielded_item ():get_count () > leftover :get_count () then
200
+ inventoryChanged = true
201
+ end
202
+ -- set the leftover as new wielded item for the player
203
+ clicker :set_wielded_item (leftover )
159
204
end
160
- local leftover = self .try_insert_stack (self , clicker :get_wielded_item (),
161
- not clicker :get_player_control ().sneak )
162
205
163
- -- if smth. was added play the interact sound
164
- if clicker :get_wielded_item ():get_count () > leftover :get_count () then
206
+ if inventoryChanged then
165
207
self :play_interact_sound ()
166
208
end
167
- -- set the leftover as new wielded item for the player
168
- clicker :set_wielded_item (leftover )
169
209
end ,
170
210
171
211
on_punch = function (self , puncher , time_from_last_punch , tool_capabilities , dir )
0 commit comments