end
if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then
+ -- is player wielding the right key?
+ local item = clicker:get_wielded_item()
local owner = meta:get_string("doors_owner")
- if owner ~= "" then
+ if item:get_name() == "default:key" then
+ local key_meta = item:get_meta()
+ local secret = meta:get_string("key_lock_secret")
+
+ if key_meta:get_string("secret") == "" then
+ key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret)
+ end
+
+ if secret ~= key_meta:get_string("secret") then
+ return false
+ end
+
+ elseif owner ~= "" then
if clicker:get_player_name() ~= owner then
return false
end
local node = minetest.get_node(pointed_thing.under)
local pdef = minetest.registered_nodes[node.name]
- if pdef and pdef.on_rightclick then
+ if pdef and pdef.on_rightclick and
+ not placer:get_player_control().sneak then
return pdef.on_rightclick(pointed_thing.under,
node, placer, itemstack, pointed_thing)
end
minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
minetest.check_for_falling({x = pos.x, y = pos.y + 1, z = pos.z})
end
- def.on_rotate = false
+ def.on_rotate = function(pos, node, user, mode, new_param2)
+ return false
+ end
if def.protected then
def.can_dig = can_dig_door
def.on_blast = function() end
+ def.on_key_use = function(pos, player)
+ local door = doors.get(pos)
+ door:toggle(player)
+ end
+ def.on_skeleton_key_use = function(pos, player, newsecret)
+ local meta = minetest.get_meta(pos)
+ local owner = meta:get_string("doors_owner")
+ local pname = player:get_player_name()
+
+ -- verify placer is owner of lockable door
+ if owner ~= pname then
+ minetest.record_protection_violation(pos, pname)
+ minetest.chat_send_player(pname, "You do not own this locked door.")
+ return nil
+ end
+
+ local secret = meta:get_string("key_lock_secret")
+ if secret == "" then
+ secret = newsecret
+ meta:set_string("key_lock_secret", secret)
+ end
+
+ return secret, "a locked door", owner
+ end
else
def.on_blast = function(pos, intensity)
minetest.remove_node(pos)
function _doors.trapdoor_toggle(pos, node, clicker)
node = node or minetest.get_node(pos)
if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then
+ -- is player wielding the right key?
+ local item = clicker:get_wielded_item()
local meta = minetest.get_meta(pos)
local owner = meta:get_string("doors_owner")
- if owner ~= "" then
+ if item:get_name() == "default:key" then
+ local key_meta = item:get_meta()
+ local secret = meta:get_string("key_lock_secret")
+
+ if key_meta:get_string("secret") == "" then
+ key_meta:set_string("secret", minetest.parse_json(item:get_metadata()).secret)
+ end
+
+ if secret ~= key_meta:get_string("secret") then
+ return false
+ end
+
+ elseif owner ~= "" then
if clicker:get_player_name() ~= owner then
return false
end
end
def.on_blast = function() end
+ def.on_key_use = function(pos, player)
+ local door = doors.get(pos)
+ door:toggle(player)
+ end
+ def.on_skeleton_key_use = function(pos, player, newsecret)
+ local meta = minetest.get_meta(pos)
+ local owner = meta:get_string("doors_owner")
+ local pname = player:get_player_name()
+
+ -- verify placer is owner of lockable door
+ if owner ~= pname then
+ minetest.record_protection_violation(pos, pname)
+ minetest.chat_send_player(pname, "You do not own this trapdoor.")
+ return nil
+ end
+
+ local secret = meta:get_string("key_lock_secret")
+ if secret == "" then
+ secret = newsecret
+ meta:set_string("key_lock_secret", secret)
+ end
+
+ return secret, "a locked trapdoor", owner
+ end
else
def.on_blast = function(pos, intensity)
minetest.remove_node(pos)