5353default .chest .open_chests = {}
5454
5555minetest .register_on_player_receive_fields (function (player , formname , fields )
56+ local pn = player :get_player_name ()
57+
5658 if formname ~= " default:chest" then
59+ if default .chest .open_chests [pn ] then
60+ default .chest .chest_lid_close (pn )
61+ end
62+
5763 return
5864 end
59- if not player or not fields .quit then
60- return
61- end
62- local pn = player :get_player_name ()
6365
64- if not default .chest .open_chests [pn ] then
66+ if not ( fields . quit and default .chest .open_chests [pn ]) then
6567 return
6668 end
6769
6870 default .chest .chest_lid_close (pn )
71+
6972 return true
7073end )
7174
@@ -129,17 +132,22 @@ function default.chest.register_chest(prefixed_name, d)
129132 return itemstack
130133 end
131134
135+ local cn = clicker :get_player_name ()
136+
137+ if default .chest .open_chests [cn ] then
138+ default .chest .chest_lid_close (cn )
139+ end
140+
132141 minetest .sound_play (def .sound_open , {gain = 0.3 ,
133142 pos = pos , max_hear_distance = 10 }, true )
134143 if not default .chest .chest_lid_obstructed (pos ) then
135144 minetest .swap_node (pos ,
136145 { name = name .. " _open" ,
137146 param2 = node .param2 })
138147 end
139- minetest .after (0.2 , minetest .show_formspec ,
140- clicker :get_player_name (),
148+ minetest .after (0.2 , minetest .show_formspec , cn ,
141149 " default:chest" , default .chest .get_chest_formspec (pos ))
142- default .chest .open_chests [clicker : get_player_name () ] = { pos = pos ,
150+ default .chest .open_chests [cn ] = { pos = pos ,
143151 sound = def .sound_close , swap = name }
144152 end
145153 def .on_blast = function () end
@@ -200,6 +208,12 @@ function default.chest.register_chest(prefixed_name, d)
200208 return inv :is_empty (" main" )
201209 end
202210 def .on_rightclick = function (pos , node , clicker )
211+ local cn = clicker :get_player_name ()
212+
213+ if default .chest .open_chests [cn ] then
214+ default .chest .chest_lid_close (cn )
215+ end
216+
203217 minetest .sound_play (def .sound_open , {gain = 0.3 , pos = pos ,
204218 max_hear_distance = 10 }, true )
205219 if not default .chest .chest_lid_obstructed (pos ) then
@@ -208,9 +222,9 @@ function default.chest.register_chest(prefixed_name, d)
208222 param2 = node .param2 })
209223 end
210224 minetest .after (0.2 , minetest .show_formspec ,
211- clicker : get_player_name () ,
225+ cn ,
212226 " default:chest" , default .chest .get_chest_formspec (pos ))
213- default .chest .open_chests [clicker : get_player_name () ] = { pos = pos ,
227+ default .chest .open_chests [cn ] = { pos = pos ,
214228 sound = def .sound_close , swap = name }
215229 end
216230 def .on_blast = function (pos )
@@ -274,6 +288,18 @@ function default.chest.register_chest(prefixed_name, d)
274288 end
275289 })
276290 end
291+
292+ -- close opened chests on load
293+ minetest .register_lbm ({
294+ label = " close opened chests on load" ,
295+ name = " default:close_" .. prefixed_name :gsub (" :" , " _" ) .. " _open" ,
296+ nodenames = {prefixed_name .. " _open" },
297+ run_at_every_load = true ,
298+ action = function (pos , node )
299+ node .name = prefixed_name
300+ minetest .swap_node (pos , node )
301+ end
302+ })
277303end
278304
279305default .chest .register_chest (" default:chest" , {
0 commit comments