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