Show title and author of book in description
[oweals/minetest_game.git] / mods / doors / init.lua
index 73a73a136e13f7ee779d982857e5ebc3fe9cd02a..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 = screwdriver and screwdriver.rotate_simple or 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)
@@ -422,7 +463,7 @@ doors.register("door_steel", {
                inventory_image = "doors_item_steel.png",
                protected = true,
                groups = {cracky = 1, level = 2},
-               sounds = default.node_sound_stone_defaults(),
+               sounds = default.node_sound_metal_defaults(),
                sound_open = "doors_steel_door_open",
                sound_close = "doors_steel_door_close",
                recipe = {
@@ -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
@@ -519,7 +574,7 @@ function doors.register_trapdoor(name, def)
        if not name:find(":") then
                name = "doors:" .. name
        end
-       
+
        local name_closed = name
        local name_opened = name.."_open"
 
@@ -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)
@@ -621,7 +700,7 @@ doors.register_trapdoor("doors:trapdoor_steel", {
        tile_front = "doors_trapdoor_steel.png",
        tile_side = "doors_trapdoor_steel_side.png",
        protected = true,
-       sounds = default.node_sound_stone_defaults(),
+       sounds = default.node_sound_metal_defaults(),
        sound_open = "doors_steel_door_open",
        sound_close = "doors_steel_door_close",
        groups = {cracky = 1, level = 2, door = 1},
@@ -745,3 +824,48 @@ doors.register_fencegate("doors:gate_aspen_wood", {
        material = "default:aspen_wood",
        groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}
 })
+
+
+----fuels----
+
+minetest.register_craft({
+       type = "fuel",
+       recipe = "doors:trapdoor",
+       burntime = 7,
+})
+
+minetest.register_craft({
+       type = "fuel",
+       recipe = "doors:door_wood",
+       burntime = 14,
+})
+
+minetest.register_craft({
+       type = "fuel",
+       recipe = "doors:gate_wood_closed",
+       burntime = 7,
+})
+
+minetest.register_craft({
+       type = "fuel",
+       recipe = "doors:gate_acacia_wood_closed",
+       burntime = 8,
+})
+
+minetest.register_craft({
+       type = "fuel",
+       recipe = "doors:gate_junglewood_closed",
+       burntime = 9,
+})
+
+minetest.register_craft({
+       type = "fuel",
+       recipe = "doors:gate_pine_wood_closed",
+       burntime = 6,
+})
+
+minetest.register_craft({
+       type = "fuel",
+       recipe = "doors:gate_aspen_wood_closed",
+       burntime = 5,
+})