Browse Source

chest_lid_close: don't replace a node if it's not the expected open chest

fluxionary 8 months ago
parent
commit
83c10f59e1
1 changed files with 12 additions and 5 deletions
  1. 12 5
      mods/default/chests.lua

+ 12 - 5
mods/default/chests.lua

@@ -38,16 +38,23 @@ function default.chest.chest_lid_close(pn)
 
 	default.chest.open_chests[pn] = nil
 	for k, v in pairs(default.chest.open_chests) do
-		if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
+		if vector.equals(v.pos, pos) then
+			-- another player is also looking at the chest
 			return true
 		end
 	end
 
 	local node = minetest.get_node(pos)
-	minetest.after(0.2, minetest.swap_node, pos, { name = swap,
-			param2 = node.param2 })
-	minetest.sound_play(sound, {gain = 0.3, pos = pos,
-		max_hear_distance = 10}, true)
+	minetest.after(0.2, function()
+		local current_node = minetest.get_node(pos)
+		if current_node.name ~= swap .. "_open" then
+			-- the chest has already been replaced, don't try to replace what's there.
+			return
+		end
+		minetest.swap_node(pos, {name = swap, param2 = node.param2})
+		minetest.sound_play(sound, {gain = 0.3, pos = pos,
+			max_hear_distance = 10}, true)
+	end)
 end
 
 default.chest.open_chests = {}