Skip to content

Commit ec2f57d

Browse files
fluxionarysfan5
andauthored
Ensure chests close properly (#2965)
Co-authored-by: sfan5 <[email protected]>
1 parent fdcf458 commit ec2f57d

File tree

1 file changed

+36
-10
lines changed

1 file changed

+36
-10
lines changed

mods/default/chests.lua

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,22 @@ end
5353
default.chest.open_chests = {}
5454

5555
minetest.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
7073
end)
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+
})
277303
end
278304

279305
default.chest.register_chest("default:chest", {

0 commit comments

Comments
 (0)