From b7df3a9bd42b612b25194d5bf8b002a047fb5ff1 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 13 Feb 2017 01:28:36 +0100 Subject: [PATCH] Trapdoors: Simplify nodeboxes, add metal sounds, refactor code --- mods/doors/init.lua | 294 ++++++------------ .../{door_close.ogg => doors_door_close.ogg} | Bin .../{door_open.ogg => doors_door_open.ogg} | Bin mods/doors/sounds/doors_steel_door_close.ogg | Bin 0 -> 8574 bytes mods/doors/sounds/doors_steel_door_open.ogg | Bin 0 -> 5510 bytes 5 files changed, 98 insertions(+), 196 deletions(-) rename mods/doors/sounds/{door_close.ogg => doors_door_close.ogg} (100%) rename mods/doors/sounds/{door_open.ogg => doors_door_open.ogg} (100%) create mode 100644 mods/doors/sounds/doors_steel_door_close.ogg create mode 100644 mods/doors/sounds/doors_steel_door_open.ogg diff --git a/mods/doors/init.lua b/mods/doors/init.lua index e86434a71..b7ecd08ce 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -174,9 +174,9 @@ function doors:register_door(name, def) 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("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) else - minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) end end end, @@ -210,9 +210,9 @@ function doors:register_door(name, def) 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("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) else - minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) end end end, @@ -246,9 +246,9 @@ function doors:register_door(name, def) 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("door_open", {gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_open", {gain = 0.3, max_hear_distance = 10}) else - minetest.sound_play("door_close", {gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_close", {gain = 0.3, max_hear_distance = 10}) end end end, @@ -282,9 +282,9 @@ function doors:register_door(name, def) 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("door_open", {pos=pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_open", {pos=pos, gain = 0.3, max_hear_distance = 10}) else - minetest.sound_play("door_close", {gain = 0.3, max_hear_distance = 10}) + minetest.sound_play("doors_door_close", {gain = 0.3, max_hear_distance = 10}) end end end, @@ -464,116 +464,113 @@ minetest.register_alias("doors:door_wood_b_c", "doors:door_wood_b_1") minetest.register_alias("doors:door_wood_b_o", "doors:door_wood_b_1") -----trapdoor Wood---- +---- Trapdoor ---- -local me -local meta -local state = 0 +function doors:register_trapdoor(name, def) + local function update_door(pos, node) + minetest.set_node(pos, node) + end -local function update_door(pos, node) - minetest.set_node(pos, node) -end + local me + local meta + local state = 0 -local function punch(pos) - meta = minetest.get_meta(pos) - state = meta:get_int("state") - me = minetest.get_node(pos) - local tmp_node - local tmp_node2 - local oben = {x=pos.x, y=pos.y+1, z=pos.z} + if not def.sound_open then + def.sound_open = "doors_door_open" + end + if not def.sound_close then + def.sound_close = "doors_door_close" + end + + local function punch(pos) + meta = minetest.get_meta(pos) + state = meta:get_int("state") + me = minetest.get_node(pos) + local tmp_node + local tmp_node2 + local oben = {x=pos.x, y=pos.y+1, z=pos.z} if state == 1 then state = 0 - minetest.sound_play("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) - tmp_node = {name="doors:trapdoor", param1=me.param1, param2=me.param2} + minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 10}) + tmp_node = {name=name, param1=me.param1, param2=me.param2} else state = 1 - minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) - tmp_node = {name="doors:trapdoor_open", param1=me.param1, param2=me.param2} + minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 10}) + tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2} end update_door(pos, tmp_node) meta:set_int("state", state) -end + end + minetest.register_node(name, { + description = def.description, + drawtype = "nodebox", + tiles = def.tiles, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + is_ground_content = false, + paramtype = "light", + stack_max = 64, + paramtype2 = "facedir", + groups = def.groups, + sounds = def.sounds, + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -6/16, 8/16},}, + }, + on_creation = function(pos) + state = 0 + end, + mesecons = {effector = { + action_on = (function(pos, node) + punch(pos) + end), + }}, + on_rightclick = function(pos, node, clicker) + punch(pos) + end, + }) -minetest.register_node("doors:trapdoor", { - description = "Wooden Trapdoor", - drawtype = "nodebox", - tiles = {"door_trapdoor.png"}, - is_ground_content = false, - paramtype = "light", - stack_max = 64, - paramtype2 = "facedir", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,mesecon_effector_on=1,door=2}, - sounds = mcl_sounds.node_sound_wood_defaults(), - drop = "doors:trapdoor", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, -5/16, -6/16, 8/16},--left - {5/16, -8/16, -8/16, 8/16, -6/16, 8/16}, --right - {-8/16, -8/16, -8/16, 8/16, -6/16, -5/16},--down - {-8/16, -8/16, 5/16, 8/16, -6/16, 8/16}, --up - {-2/16, -8/16, -5/16, 2/16, -6/16, 5/16}, --vert mid - {-5/16, -8/16, -2/16, 5/16, -6/16, 2/16}, --hori mid + minetest.register_node(name.."_open", { + drawtype = "nodebox", + tiles = def.tiles, + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", + pointable = true, + groups = def.groups, + sounds = def.sounds, + drop = name, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} }, - }, - selection_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, -5/16, -6/16, 8/16},--left - {5/16, -8/16, -8/16, 8/16, -6/16, 8/16}, --right - {-8/16, -8/16, -8/16, 8/16, -6/16, -5/16},--down - {-8/16, -8/16, 5/16, 8/16, -6/16, 8/16}, --up - {-2/16, -8/16, -5/16, 2/16, -6/16, 5/16}, --vert mid - {-5/16, -8/16, -2/16, 5/16, -6/16, 2/16}, --hori mid + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} }, - }, - on_creation = function(pos) - state = 0 - end, - mesecons = {effector = { + on_rightclick = function(pos, node, clicker) + punch(pos) + end, + mesecons = {effector = { action_on = (function(pos, node) punch(pos) end), - }}, - on_rightclick = function(pos, node, clicker) - punch(pos) - end, -}) + }}, + }) -minetest.register_node("doors:trapdoor_open", { - drawtype = "nodebox", +end + +doors:register_trapdoor("doors:trapdoor", { + description = "Wooden Trapdoor", tiles = {"door_trapdoor.png"}, - is_ground_content = false, - paramtype = "light", - paramtype2 = "facedir", - pointable = true, + wield_image = "door_trapdoor.png", groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,mesecon_effector_on=1,door=2}, sounds = mcl_sounds.node_sound_wood_defaults(), - drop = "doors:trapdoor", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} - }, - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} - }, - on_rightclick = function(pos, node, clicker) - punch(pos) - end, - mesecons = {effector = { - action_on = (function(pos, node) - punch(pos) - end), - }}, - }) - - - minetest.register_craft({ output = 'doors:trapdoor 2', recipe = { @@ -588,109 +585,14 @@ minetest.register_craft({ burntime = 15, }) ---- Iron Trapdoor ---- -local me -local meta -local state = 0 - -local function update_door(pos, node) - minetest.set_node(pos, node) -end - -local function punch(pos) - meta = minetest.get_meta(pos) - state = meta:get_int("state") - me = minetest.get_node(pos) - local tmp_node - local tmp_node2 - local oben = {x=pos.x, y=pos.y+1, z=pos.z} - if state == 1 then - state = 0 - minetest.sound_play("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) - tmp_node = {name="doors:iron_trapdoor", param1=me.param1, param2=me.param2} - else - state = 1 - minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) - tmp_node = {name="doors:iron_trapdoor_open", param1=me.param1, param2=me.param2} - end - update_door(pos, tmp_node) - meta:set_int("state", state) -end - - -minetest.register_node("doors:iron_trapdoor", { +doors:register_trapdoor("doors:iron_trapdoor", { description = "Iron Trapdoor", - drawtype = "nodebox", - tiles = {"iron_trapdoor.png", "iron_trapdoor.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png"}, - paramtype = "light", - is_ground_content = false, - stack_max = 64, - paramtype2 = "facedir", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,mesecon_effector_on=1,door=2}, - sounds = mcl_sounds.node_sound_wood_defaults(), - drop = "doors:iron_trapdoor", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, -5/16, -6/16, 8/16},--left - {5/16, -8/16, -8/16, 8/16, -6/16, 8/16}, --right - {-8/16, -8/16, -8/16, 8/16, -6/16, -5/16},--down - {-8/16, -8/16, 5/16, 8/16, -6/16, 8/16}, --up - {-2/16, -8/16, -5/16, 2/16, -6/16, 5/16}, --vert mid - {-5/16, -8/16, -2/16, 5/16, -6/16, 2/16}, --hori mid - }, - }, - selection_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, -5/16, -6/16, 8/16},--left - {5/16, -8/16, -8/16, 8/16, -6/16, 8/16}, --right - {-8/16, -8/16, -8/16, 8/16, -6/16, -5/16},--down - {-8/16, -8/16, 5/16, 8/16, -6/16, 8/16}, --up - {-2/16, -8/16, -5/16, 2/16, -6/16, 5/16}, --vert mid - {-5/16, -8/16, -2/16, 5/16, -6/16, 2/16}, --hori mid - }, - }, - mesecons = {effector = { - action_on = (function(pos, node) - punch(pos) - end), - }}, - on_creation = function(pos) - state = 0 - end, - on_rightclick = function(pos, node, clicker) - punch(pos) - end, -}) - - -minetest.register_node("doors:iron_trapdoor_open", { - drawtype = "nodebox", - tiles = {"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "iron_trapdoor.png", "iron_trapdoor.png"}, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - pointable = true, - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,door=2,mesecon_effector_on=1}, - sounds = mcl_sounds.node_sound_wood_defaults(), - drop = "doors:iron_trapdoor", - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} - }, - selection_box = { - type = "fixed", - fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} - }, - mesecons = {effector = { - action_on = (function(pos, node) - punch(pos) - end), - }}, - on_rightclick = function(pos, node, clicker) - punch(pos) - end, + tiles = {"iron_trapdoor.png"}, + wield_image = "iron_trapdoor.png", + groups = {cracky=2,mesecon_effector_on=1,door=2}, + sounds = mcl_sounds.node_sound_metal_defaults(), + sound_open = "doors_steel_door_open", + sound_close = "doors_steel_door_close", }) minetest.register_craft({ diff --git a/mods/doors/sounds/door_close.ogg b/mods/doors/sounds/doors_door_close.ogg similarity index 100% rename from mods/doors/sounds/door_close.ogg rename to mods/doors/sounds/doors_door_close.ogg diff --git a/mods/doors/sounds/door_open.ogg b/mods/doors/sounds/doors_door_open.ogg similarity index 100% rename from mods/doors/sounds/door_open.ogg rename to mods/doors/sounds/doors_door_open.ogg diff --git a/mods/doors/sounds/doors_steel_door_close.ogg b/mods/doors/sounds/doors_steel_door_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aea7be670b0763259c269521e035966fa1a8d4e6 GIT binary patch literal 8574 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 literal 0 HcmV?d00001