Show title and author of book in description
[oweals/minetest_game.git] / mods / doors / init.lua
index a30120540d347b3ab5a14b257909a2ce24e8c361..53e27938c50456a2f4cbdee22b92dbb00985e3bb 100644 (file)
@@ -140,8 +140,22 @@ function _doors.door_toggle(pos, node, clicker)
        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
@@ -256,7 +270,8 @@ function doors.register(name, def)
 
                        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
@@ -364,13 +379,39 @@ function doors.register(name, def)
        end
        def.after_dig_node = function(pos, node, meta, digger)
                minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
-               nodeupdate({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 = function(pos, node, user, mode, new_param2)
+               return false
        end
-       def.on_rotate = false
 
        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)
@@ -491,9 +532,23 @@ end
 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
@@ -546,6 +601,30 @@ function doors.register_trapdoor(name, def)
                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)