Iron door/trapdoor can be opened by redstone only

This commit is contained in:
Wuzzy 2017-03-12 05:32:34 +01:00
parent 85c304a0c8
commit 1aa3b19099
1 changed files with 62 additions and 29 deletions

View File

@ -16,6 +16,8 @@ mcl_doors = {}
-- selection_box_top -- selection_box_top
-- only_placer_can_open: if true only the player who placed the door can -- only_placer_can_open: if true only the player who placed the door can
-- open it -- open it
-- only_redstone_can_open: if true, the door can only be opened by redstone,
-- not by rightclicking it
function mcl_doors:register_door(name, def) function mcl_doors:register_door(name, def)
def.groups.not_in_creative_inventory = 1 def.groups.not_in_creative_inventory = 1
@ -125,7 +127,7 @@ function mcl_doors:register_door(name, def)
end end
end end
local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) local function on_open_close(pos, dir, check_name, replace, replace_dir, params)
pos.y = pos.y+dir pos.y = pos.y+dir
if not minetest.get_node(pos).name == check_name then if not minetest.get_node(pos).name == check_name then
return return
@ -155,11 +157,11 @@ function mcl_doors:register_door(name, def)
end end
local function on_mesecons_signal_open (pos, node) local function on_mesecons_signal_open (pos, node)
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
end end
local function on_mesecons_signal_close (pos, node) local function on_mesecons_signal_close (pos, node)
on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
end end
local function check_player_priv(pos, player) local function check_player_priv(pos, player)
@ -170,6 +172,16 @@ function mcl_doors:register_door(name, def)
local pn = player:get_player_name() local pn = player:get_player_name()
return meta:get_string("doors_owner") == pn return meta:get_string("doors_owner") == pn
end end
local on_rightclick
-- Disable on_rightclick if this is a redstone-only door
if not def.only_redstone_can_open then
on_rightclick = function(pos, node_clicker)
if check_player_priv(pos, clicker) then
on_open_close(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
end
end
end
minetest.register_node(name.."_b_1", { minetest.register_node(name.."_b_1", {
tiles = {tt[2].."^[transformFY", tt[2], tb[2].."^[transformFX", tb[2], tb[1], tb[1].."^[transformFX"}, tiles = {tt[2].."^[transformFY", tt[2], tb[2].."^[transformFX", tb[2], tb[1], tb[1].."^[transformFX"},
@ -196,11 +208,7 @@ function mcl_doors:register_door(name, def)
after_dig_node(pos, name.."_t_1", digger) after_dig_node(pos, name.."_t_1", digger)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = on_rightclick,
if check_player_priv(pos, clicker) then
on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0})
end
end,
mesecons = { effector = { mesecons = { effector = {
action_on = on_mesecons_signal_open action_on = on_mesecons_signal_open
@ -209,6 +217,16 @@ function mcl_doors:register_door(name, def)
can_dig = check_player_priv, can_dig = check_player_priv,
}) })
if def.only_redstone_can_open then
on_rightclick = nil
else
on_rightclick = function(pos, node_clicker)
if check_player_priv(pos, clicker) then
on_open_close(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0})
end
end
end
minetest.register_node(name.."_t_1", { minetest.register_node(name.."_t_1", {
tiles = {tt[2].."^[transformFY", tt[2], tt[2].."^[transformFX", tt[2], tt[1], tt[1].."^[transformFX"}, tiles = {tt[2].."^[transformFY", tt[2], tt[2].."^[transformFX", tt[2], tt[1], tt[1].."^[transformFX"},
paramtype = "light", paramtype = "light",
@ -234,14 +252,20 @@ function mcl_doors:register_door(name, def)
after_dig_node(pos, name.."_b_1", digger) after_dig_node(pos, name.."_b_1", digger)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = on_rightclick,
if check_player_priv(pos, clicker) then
on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0})
end
end,
can_dig = check_player_priv, can_dig = check_player_priv,
}) })
if def.only_redstone_can_open then
on_rightclick = nil
else
on_rightclick = function(pos, node_clicker)
if check_player_priv(pos, clicker) then
on_open_close(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
end
end
end
minetest.register_node(name.."_b_2", { minetest.register_node(name.."_b_2", {
tiles = {tt[2].."^[transformFY", tt[2], tb[2].."^[transformFX", tb[2], tb[1].."^[transformFX", tb[1]}, tiles = {tt[2].."^[transformFY", tt[2], tb[2].."^[transformFX", tb[2], tb[1].."^[transformFX", tb[1]},
@ -268,11 +292,7 @@ function mcl_doors:register_door(name, def)
after_dig_node(pos, name.."_t_2", digger) after_dig_node(pos, name.."_t_2", digger)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = on_rightclick,
if check_player_priv(pos, clicker) then
on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2})
end
end,
mesecons = { effector = { mesecons = { effector = {
action_on = on_mesecons_signal_close action_on = on_mesecons_signal_close
@ -281,6 +301,16 @@ function mcl_doors:register_door(name, def)
can_dig = check_player_priv, can_dig = check_player_priv,
}) })
if def.only_redstone_can_open then
on_rightclick = nil
else
on_rightclick = function(pos, node_clicker)
if check_player_priv(pos, clicker) then
on_open_close(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2})
end
end
end
minetest.register_node(name.."_t_2", { minetest.register_node(name.."_t_2", {
tiles = {tt[2].."^[transformFY", tt[2], tt[2].."^[transformFX", tt[2], tt[1].."^[transformFX", tt[1]}, tiles = {tt[2].."^[transformFY", tt[2], tt[2].."^[transformFX", tt[2], tt[1].."^[transformFX", tt[1]},
paramtype = "light", paramtype = "light",
@ -306,11 +336,7 @@ function mcl_doors:register_door(name, def)
after_dig_node(pos, name.."_b_2", digger) after_dig_node(pos, name.."_b_2", digger)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = on_rightclick,
if check_player_priv(pos, clicker) then
on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2})
end
end,
can_dig = check_player_priv, can_dig = check_player_priv,
}) })
@ -479,6 +505,8 @@ mcl_doors:register_door("mcl_doors:iron_door", {
sounds = mcl_sounds.node_sound_metal_defaults(), sounds = mcl_sounds.node_sound_metal_defaults(),
sound_open = "doors_steel_door_open", sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close", sound_close = "doors_steel_door_close",
only_redstone_can_open = true,
}) })
minetest.register_craft({ minetest.register_craft({
@ -524,6 +552,13 @@ function mcl_doors:register_trapdoor(name, def)
meta:set_int("state", state) meta:set_int("state", state)
end end
local on_rightclick
if not def.only_redstone_can_open then
on_rightclick = function(pos, node, clicker)
punch(pos)
end
end
minetest.register_node(name, { minetest.register_node(name, {
description = def.description, description = def.description,
drawtype = "nodebox", drawtype = "nodebox",
@ -552,9 +587,7 @@ function mcl_doors:register_trapdoor(name, def)
punch(pos) punch(pos)
end), end),
}}, }},
on_rightclick = function(pos, node, clicker) on_rightclick = on_rightclick,
punch(pos)
end,
}) })
minetest.register_node(name.."_open", { minetest.register_node(name.."_open", {
@ -573,9 +606,7 @@ function mcl_doors:register_trapdoor(name, def)
type = "fixed", type = "fixed",
fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5}
}, },
on_rightclick = function(pos, node, clicker) on_rightclick = on_rightclick,
punch(pos)
end,
mesecons = {effector = { mesecons = {effector = {
action_on = (function(pos, node) action_on = (function(pos, node)
punch(pos) punch(pos)
@ -618,6 +649,8 @@ mcl_doors:register_trapdoor("mcl_doors:iron_trapdoor", {
sounds = mcl_sounds.node_sound_metal_defaults(), sounds = mcl_sounds.node_sound_metal_defaults(),
sound_open = "doors_steel_door_open", sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close", sound_close = "doors_steel_door_close",
only_redstone_can_open = true,
}) })
minetest.register_craft({ minetest.register_craft({