From 0a9eee610089f4d42f9f71f762f336a774b720f7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 12 Mar 2017 04:20:06 +0100 Subject: [PATCH] Open and close doors by redstone signals Also fix weird door sound bug --- .../mesecons_compatibility/depends.txt | 2 - .../REDSTONE/mesecons_compatibility/init.lua | 151 ------------------ mods/ITEMS/mcl_doors/init.lua | 64 ++++---- 3 files changed, 34 insertions(+), 183 deletions(-) delete mode 100644 mods/ITEMS/REDSTONE/mesecons_compatibility/depends.txt delete mode 100644 mods/ITEMS/REDSTONE/mesecons_compatibility/init.lua diff --git a/mods/ITEMS/REDSTONE/mesecons_compatibility/depends.txt b/mods/ITEMS/REDSTONE/mesecons_compatibility/depends.txt deleted file mode 100644 index ed2fcd8a5..000000000 --- a/mods/ITEMS/REDSTONE/mesecons_compatibility/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -mesecons -doors diff --git a/mods/ITEMS/REDSTONE/mesecons_compatibility/init.lua b/mods/ITEMS/REDSTONE/mesecons_compatibility/init.lua deleted file mode 100644 index 022a4134e..000000000 --- a/mods/ITEMS/REDSTONE/mesecons_compatibility/init.lua +++ /dev/null @@ -1,151 +0,0 @@ -doors = {} - --- Registers a door - REDEFINITION ONLY | DOORS MOD MUST HAVE BEEN LOADED BEFORE --- name: The name of the door --- def: a table with the folowing fields: --- description --- inventory_image --- groups --- tiles_bottom: the tiles of the bottom part of the door {front, side} --- tiles_top: the tiles of the bottom part of the door {front, side} --- If the following fields are not defined the default values are used --- node_box_bottom --- node_box_top --- selection_box_bottom --- selection_box_top --- only_placer_can_open: if true only the player who placed the door can --- open it - -function doors:register_door(name, def) - def.groups.not_in_creative_inventory = 1 - - local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}} - - if not def.node_box_bottom then - def.node_box_bottom = box - end - if not def.node_box_top then - def.node_box_top = box - end - if not def.selection_box_bottom then - def.selection_box_bottom= box - end - if not def.selection_box_top then - def.selection_box_top = box - end - - local tt = def.tiles_top - local tb = def.tiles_bottom - - local function after_dig_node(pos, name) - if minetest.get_node(pos).name == name then - minetest.remove_node(pos) - end - end - - local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) - pos.y = pos.y+dir - if not minetest.get_node(pos).name == check_name then - return - end - local p2 = minetest.get_node(pos).param2 - p2 = params[p2+1] - - local meta = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace_dir, param2=p2}) - minetest.get_meta(pos):from_table(meta) - - pos.y = pos.y-dir - meta = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace, param2=p2}) - minetest.get_meta(pos):from_table(meta) - end - - 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}) - end - - 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}) - end - - local function check_player_priv(pos, player) - if not def.only_placer_can_open then - return true - end - local meta = minetest.get_meta(pos) - local pn = player:get_player_name() - return meta:get_string("doors_owner") == pn - end - - minetest.register_node(":"..name.."_b_1", { - tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"}, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - drop = name, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, - groups = def.groups, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y+1 - after_dig_node(pos, name.."_t_1") - end, - - on_rightclick = function(pos, node, puncher) - if check_player_priv(pos, puncher) then - on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) - end - end, - - mesecons = {effector = { - action_on = on_mesecons_signal_open - }}, - - can_dig = check_player_priv, - }) - - minetest.register_node(":"..name.."_b_2", { - tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]}, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - drop = name, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, - groups = def.groups, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y+1 - after_dig_node(pos, name.."_t_2") - end, - - on_rightclick = function(pos, node, puncher) - if check_player_priv(pos, puncher) then - on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) - end - end, - - mesecons = {effector = { - action_off = on_mesecons_signal_close - }}, - - can_dig = check_player_priv, - }) -end - diff --git a/mods/ITEMS/mcl_doors/init.lua b/mods/ITEMS/mcl_doors/init.lua index 07904c70a..54055cb2d 100644 --- a/mods/ITEMS/mcl_doors/init.lua +++ b/mods/ITEMS/mcl_doors/init.lua @@ -17,7 +17,7 @@ mcl_doors = {} -- only_placer_can_open: if true only the player who placed the door can -- open it -local function is_right(pos, clicker) +local function is_right(pos) local r1 = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z}) local r2 = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}) if string.find(r1.name, "door_") or string.find(r2.name, "door_") then @@ -137,16 +137,32 @@ function mcl_doors:register_door(name, def) return end local p2 = minetest.get_node(pos).param2 - p2 = params[p2+1] + local np2 = params[p2+1] local meta = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace_dir, param2=p2}) + minetest.set_node(pos, {name=replace_dir, param2=np2}) minetest.get_meta(pos):from_table(meta) pos.y = pos.y-dir meta = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace, param2=p2}) + minetest.set_node(pos, {name=replace, param2=np2}) minetest.get_meta(pos):from_table(meta) + + local door_switching_sound + if p2 == 1 or p2 == 3 then + door_switching_sound = def.sound_open + else + door_switching_sound = def.sound_close + end + minetest.sound_play(door_switching_sound, {pos = pos, gain = 0.5, max_hear_distance = 16}) + end + + 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}) + end + + 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}) end local function check_player_priv(pos, player) @@ -185,14 +201,13 @@ function mcl_doors:register_door(name, def) on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then - on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) - if is_right(pos, clicker) then - minetest.sound_play(def.sound_close, {pos = pos, gain = 0.5, max_hear_distance = 10}) - else - minetest.sound_play(def.sound_open, {pos = pos, gain = 0.5, max_hear_distance = 10}) - end + on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) end end, + + mesecons = { effector = { + action_on = on_mesecons_signal_open + }}, can_dig = check_player_priv, }) @@ -225,14 +240,9 @@ function mcl_doors:register_door(name, def) on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0}) - if is_right(pos, clicker) then - minetest.sound_play(def.sound_close, {pos = pos, gain = 0.5, max_hear_distance = 10}) - else - minetest.sound_play(def.sound_open, {pos = pos, gain = 0.5, max_hear_distance = 10}) - end end end, - + can_dig = check_player_priv, }) @@ -264,17 +274,16 @@ function mcl_doors:register_door(name, def) on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) - if is_right(pos, clicker) then - minetest.sound_play(def.sound_open, {pos = pos, gain = 0.5, max_hear_distance = 10}) - else - minetest.sound_play(def.sound_close, {pos = pos, gain = 0.5, max_hear_distance = 10}) - end end end, + + mesecons = { effector = { + action_on = on_mesecons_signal_close + }}, can_dig = check_player_priv, }) - + minetest.register_node(name.."_t_2", { tiles = {tt[2].."^[transformFY", tt[2], tt[2].."^[transformFX", tt[2], tt[1].."^[transformFX", tt[1]}, paramtype = "light", @@ -294,23 +303,18 @@ function mcl_doors:register_door(name, def) groups = def.groups, _mcl_hardness = def._mcl_hardness, sounds = def.sounds, - + after_dig_node = function(pos, oldnode, oldmetadata, digger) pos.y = pos.y-1 after_dig_node(pos, name.."_b_2", digger) end, - + on_rightclick = function(pos, node, clicker) if check_player_priv(pos, clicker) then on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2}) - if is_right(pos, clicker) then - minetest.sound_play(def.sound_open, {pos=pos, gain = 0.5, max_hear_distance = 10}) - else - minetest.sound_play(def.sound_close, {pos=pos, gain = 0.5, max_hear_distance = 10}) - end end end, - + can_dig = check_player_priv, })