From 301ae2ee1d8a9286951cea9f5d615a5eb4e71cda Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Wed, 29 May 2019 20:34:29 -0400 Subject: [PATCH] Rearrange mesecons, diglines, dimmable functions and related, tweak digiline stuff to be more generic, and add various digilines connections rules to complement mesecons rules. Mesecons must be present to get the "wallmounted" rules for digilines nodes. Without mesecons, nodes that want wall rules will get alldir rules instead. Add mesecons support to table and standing lamps (off -> max -> off). Add digilines support to all other lights that now support mesecons, except rope lights, since they're a mesecon conductor. (will approach that last one later) --- homedecor_lighting/depends.txt | 1 + homedecor_lighting/init.lua | 272 ++++++++++++++++++++------------- 2 files changed, 171 insertions(+), 102 deletions(-) diff --git a/homedecor_lighting/depends.txt b/homedecor_lighting/depends.txt index cc756490..9dfccf18 100644 --- a/homedecor_lighting/depends.txt +++ b/homedecor_lighting/depends.txt @@ -7,3 +7,4 @@ moreblocks? building_blocks? darkage? mesecons? +digilines? diff --git a/homedecor_lighting/init.lua b/homedecor_lighting/init.lua index 6398504a..23c3b0e0 100644 --- a/homedecor_lighting/init.lua +++ b/homedecor_lighting/init.lua @@ -11,26 +11,23 @@ local function is_protected(pos, clicker) return false end -local actions = { - action_off = function(pos, node) - local sep = string.find(node.name, "_o", -5) - local onoff = string.sub(node.name, sep + 1) - if minetest.get_meta(pos):get_int("toggled") > 0 then - minetest.swap_node(pos, { - name = string.sub(node.name, 1, sep - 1).."_off", - param2 = node.param2 - }) - end - end, - action_on = function(pos, node) - minetest.get_meta(pos):set_int("toggled", 1) - local sep = string.find(node.name, "_o", -5) - local onoff = string.sub(node.name, sep + 1) - minetest.swap_node(pos, { - name = string.sub(node.name, 1, sep - 1).."_on", - param2 = node.param2 - }) - end +-- control and brightness for dimmable lamps + +local repl = { + ["off"] = "low", + ["low"] = "med", + ["med"] = "hi", + ["hi"] = "max", + ["max"] = "off", + ["on"] = "off", +} + +local brightness_tab = { + 0xffd0d0d0, + 0xffd8d8d8, + 0xffe0e0e0, + 0xffe8e8e8, + 0xffffffff, } local rules_xz = { @@ -63,7 +60,34 @@ local rules_toponly = { {x = 0, y = 1, z = -1}, } +-- mesecons compatibility + +local actions + if minetest.get_modpath("mesecons") then + + actions = { + action_off = function(pos, node) + local sep = string.find(node.name, "_", -5) + local onoff = string.sub(node.name, sep + 1) + if minetest.get_meta(pos):get_int("toggled") > 0 then + minetest.swap_node(pos, { + name = string.sub(node.name, 1, sep - 1).."_off", + param2 = node.param2 + }) + end + end, + action_on = function(pos, node) + minetest.get_meta(pos):set_int("toggled", 1) + local sep = string.find(node.name, "_", -5) + local onoff = string.sub(node.name, sep + 1) + minetest.swap_node(pos, { + name = string.sub(node.name, 1, sep - 1).."_on", + param2 = node.param2 + }) + end + } + homedecor.mesecon_wall_light = { effector = table.copy(actions) } @@ -87,57 +111,34 @@ if minetest.get_modpath("mesecons") then end -- digilines compatibility --- the following functions are based on the so-named ones in Jeija's digilines mod - -local on_digiline_receive_std = function(pos, node, channel, msg) - local meta = minetest.get_meta(pos) - local setchan = meta:get_string("channel") - if setchan ~= channel then return end - local num = tonumber(msg) - if msg == "colon" or msg == "period" or msg == "off" or (num and (num >= 0 and num <= 9)) then - minetest.swap_node(pos, { name = "led_marquee:marquee_"..msg, param2 = node.param2}) - end -end - -local on_digiline_receive_string = function(pos, node, channel, msg) - local meta = minetest.get_meta(pos) - local setchan = meta:get_string("channel") - - if setchan ~= channel then return end - if msg and msg ~= "" and type(msg) == "string" then - if msg == "off" - or msg == "low" - or msg == "med" - or msg == "hi" - or msg == "max" then - local basename = string.sub(node.name, 1, string.find(node.name, "_", -5) - 1) - minetest.swap_node(pos, {name = basename.."_"..msg, param2 = node.param2}) - end - end -end - -local repl = { - ["off"] ="low", - ["low"] ="med", - ["med"] ="hi", - ["hi"] ="max", - ["max"] ="off", -} +-- this one is based on the so-named one in Jeija's digilines mod local player_last_clicked = {} -local dl_onreceive -local dl_digiline -local dl_on_punch -local function dl_on_rightclick(pos, node, clicker, itemstack, pointed_thing) - if is_protected(pos, clicker) then return end - local delim = string.find(node.name, "_", -5) - local basename = string.sub(node.name, 1, delim - 1) - local suffix = string.sub(node.name, delim + 1) - minetest.set_node(pos, {name = basename.."_"..repl[suffix], param2 = node.param2}) -end +local digiline_on_punch if minetest.get_modpath("digilines") then + + local on_digiline_receive_string = function(pos, node, channel, msg) + local meta = minetest.get_meta(pos) + local setchan = meta:get_string("channel") + + if setchan ~= channel then return end + if msg and msg ~= "" and type(msg) == "string" then + if msg == "off" + or msg == "low" + or msg == "med" + or msg == "hi" + or msg == "max" + or msg == "on" then + local basename = string.sub(node.name, 1, string.find(node.name, "_", -5) - 1) + if minetest.registered_nodes[basename.."_"..msg] then + minetest.swap_node(pos, {name = basename.."_"..msg, param2 = node.param2}) + end + end + end + end + minetest.register_on_player_receive_fields(function(player, formname, fields) local name = player:get_player_name() local pos = player_last_clicked[name] @@ -150,14 +151,54 @@ if minetest.get_modpath("digilines") then end end) - dl_digiline = { + if minetest.get_modpath("mesecons") then + homedecor.digiline_wall_light = { + effector = { + action = on_digiline_receive_string, + }, + wire = { + rules = mesecon.rules.wallmounted_get + } + } + else + homedecor.digiline_wall_light = { + effector = { + action = on_digiline_receive_string, + }, + wire = { + rules = rules_alldir + } + } + end + + homedecor.digiline_xz_light = { effector = { action = on_digiline_receive_string, }, - rules = rules_xz + wire = { + rules = rules_xz + } } - function dl_on_punch(pos, node, puncher, pointed_thing) + homedecor.digiline_alldir_light = { + effector = { + action = on_digiline_receive_string, + }, + wire = { + rules = rules_alldir + } + } + + homedecor.digiline_toponly_light = { + effector = { + action = on_digiline_receive_string, + }, + wire = { + rules = rules_toponly + } + } + + function digiline_on_punch(pos, node, puncher, pointed_thing) if is_protected(pos, puncher) then return end if puncher:get_player_control().sneak then @@ -168,23 +209,17 @@ if minetest.get_modpath("digilines") then minetest.show_formspec(name, "homedecor:lamp_set_channel", form) end end - - function dl_on_rightclick(pos, node, clicker, itemstack, pointed_thing) - if is_protected(pos, clicker) then return end - local delim = string.find(node.name, "_", -5) - local basename = string.sub(node.name, 1, delim - 1) - local suffix = string.sub(node.name, delim + 1) - minetest.swap_node(pos, {name = basename.."_"..repl[suffix], param2 = node.param2}) - end end -local brightness_tab = { - 0xffd0d0d0, - 0xffd8d8d8, - 0xffe0e0e0, - 0xffe8e8e8, - 0xffffffff, -} +-- turn on/off, cycle brightness + +function on_rightclick(pos, node, clicker, itemstack, pointed_thing) + if is_protected(pos, clicker) then return end + local delim = string.find(node.name, "_", -5) + local basename = string.sub(node.name, 1, delim - 1) + local suffix = string.sub(node.name, delim + 1) + minetest.swap_node(pos, {name = basename.."_"..repl[suffix], param2 = node.param2}) +end function homedecor.toggle_light(pos, node, clicker, itemstack, pointed_thing) if is_protected(pos, clicker) then return end @@ -194,6 +229,9 @@ function homedecor.toggle_light(pos, node, clicker, itemstack, pointed_thing) minetest.swap_node(pos, {name = newname, param2 = node.param2}) end +----- +-- The actual lights! :-) + for _, onoff in ipairs({"on", "off"}) do local onflag = (onoff == "on") @@ -277,7 +315,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:glowlight_half_on"}, inherit_color = true }, } }, - mesecons = homedecor.mesecon_wall_light + mesecons = homedecor.mesecon_wall_light, + digiline = homedecor.digiline_wall_light, + on_punch = digiline_on_punch }) sides_edges = "homedecor_glowlight_thin_sides_edges.png" @@ -340,7 +380,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:glowlight_quarter_on"}, inherit_color = true }, } }, - mesecons = homedecor.mesecon_wall_light + mesecons = homedecor.mesecon_wall_light, + digiline = homedecor.digiline_wall_light, + on_punch = digiline_on_punch }) tb_edges = "homedecor_glowlight_cube_tb_edges.png" @@ -404,7 +446,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:glowlight_small_cube_on"}, inherit_color = true }, } }, - mesecons = homedecor.mesecon_wall_light + mesecons = homedecor.mesecon_wall_light, + digiline = homedecor.digiline_wall_light, + on_punch = digiline_on_punch }) local lighttex @@ -437,7 +481,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:plasma_lamp_on"}}, } }, - mesecons = homedecor.mesecon_alldir_light + mesecons = homedecor.mesecon_alldir_light, + digiline = homedecor.digiline_alldir_light, + on_punch = digiline_on_punch }) local lighttex = "homedecor_blanktile.png" @@ -473,7 +519,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:plasma_ball_on"}}, } }, - mesecons = homedecor.mesecon_xz_light + mesecons = homedecor.mesecon_xz_light, + digiline = homedecor.digiline_xz_light, + on_punch = digiline_on_punch }) local gl_cbox = { @@ -505,7 +553,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:ground_lantern_on"}}, } }, - mesecons = homedecor.mesecon_xz_light + mesecons = homedecor.mesecon_xz_light, + digiline = homedecor.digiline_xz_light, + on_punch = digiline_on_punch }) local hl_cbox = { @@ -530,7 +580,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:hanging_lantern_on"}}, } }, - mesecons = homedecor.mesecon_alldir_light + mesecons = homedecor.mesecon_alldir_light, + digiline = homedecor.digiline_alldir_light, + on_punch = digiline_on_punch }) local cl_cbox = { @@ -555,7 +607,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:ceiling_lantern_on"}}, } }, - mesecons = homedecor.mesecon_toponly_light + mesecons = homedecor.mesecon_toponly_light, + digiline = homedecor.digiline_toponly_light, + on_punch = digiline_on_punch }) if minetest.get_modpath("darkage") then @@ -580,7 +634,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:lattice_lantern_large_on"}}, } }, - mesecons = homedecor.mesecon_alldir_light + mesecons = homedecor.mesecon_alldir_light, + digiline = homedecor.digiline_alldir_light, + on_punch = digiline_on_punch }) end @@ -620,7 +676,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:lattice_lantern_small_on"}}, } }, - mesecons = homedecor.mesecon_wall_light + mesecons = homedecor.mesecon_alldir_light, + digiline = homedecor.digiline_alldir_light, + on_punch = digiline_on_punch }) -- "gooseneck" style desk lamps @@ -658,7 +716,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:desk_lamp_on"}, inherit_color = true }, } }, - mesecons = homedecor.mesecon_xz_light + mesecons = homedecor.mesecon_xz_light, + digiline = homedecor.digiline_xz_light, + on_punch = digiline_on_punch }) -- "kitchen"/"dining room" ceiling lamp @@ -682,7 +742,9 @@ for _, onoff in ipairs({"on", "off"}) do {items = {"homedecor:ceiling_lamp_on"}}, } }, - mesecons = homedecor.mesecon_toponly_light + mesecons = homedecor.mesecon_toponly_light, + digiline = homedecor.digiline_toponly_light, + on_punch = digiline_on_punch }) -- rope lighting @@ -1067,9 +1129,10 @@ local function reg_lamp(suffix, nxt, light, brightness) {items = {"homedecor:table_lamp_hi"}, inherit_color = true }, } }, - digiline = dl_digiline, - on_rightclick = dl_on_rightclick, - on_punch = dl_on_punch + digiline = homedecor.digiline_xz_light, + mesecons = homedecor.mesecon_wall_light, + on_rightclick = on_rightclick, + on_punch = digiline_on_punch }) homedecor.register("standing_lamp_"..suffix, { @@ -1099,11 +1162,13 @@ local function reg_lamp(suffix, nxt, light, brightness) {items = {"homedecor:standing_lamp_hi"}, inherit_color = true }, } }, - digiline = dl_digiline, - on_rightclick = dl_on_rightclick, - on_punch = dl_on_punch + digiline = homedecor.digiline_xz_light, + mesecons = homedecor.mesecon_wall_light, + on_rightclick = on_rightclick, + on_punch = digiline_on_punch }) + -- for old maps that had the original 3dforniture mod minetest.register_alias("3dforniture:table_lamp_"..suffix, "homedecor:table_lamp_"..suffix) end @@ -1114,6 +1179,9 @@ reg_lamp("med", "hi", 7, 3 ) reg_lamp("hi", "max", 11, 4 ) reg_lamp("max", "off", 14, 5 ) +-- mesecons compatibility +minetest.register_alias("homedecor:table_lamp_on", "homedecor:table_lamp_max") +minetest.register_alias("homedecor:standing_lamp_on", "homedecor:standing_lamp_max") -- conversion LBM for param2 coloring