From cacf04e2d11f85c297068080eec4bb596d751ba7 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Sat, 25 May 2019 23:52:42 -0400 Subject: [PATCH] Add mesecons support for the rest of the other relevant lights Each light connects only according to what sides make sense. For example: * a plasma lamp cube or large lattice lamp will connect from all 6 sides * a ground lantern will only connect from its NSEW sides, not its top or bottom * a glowlight slab, glowlight cube, or lattice cube uses the same rules as mesecons lamps, so its four edges and it back/bottom, whatever its orientation, but not its top/front. * a (kitchen) ceiling lamp, and a (hanging, exterior) ceiling lantern will only connect from the top. Rope lights are defined as a conductor, just like a mesecons wire, so if mesecons is present, they will default to off unless powered by a mesecons wire/switch/etc. You can still right-click-toggle individual segments on/off. Ceiling rope light connection rules are a little funky, but they work (I wanted them to only connect from the top, but I couldn't get it just right). Floor-orientation connections are straightforward. --- homedecor_lighting/init.lua | 160 +++++++++++++++++++++++++++--------- 1 file changed, 121 insertions(+), 39 deletions(-) diff --git a/homedecor_lighting/init.lua b/homedecor_lighting/init.lua index ad35e6d3..5ccea605 100644 --- a/homedecor_lighting/init.lua +++ b/homedecor_lighting/init.lua @@ -2,31 +2,79 @@ local S = homedecor.gettext +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 +} + +local rules_xz = { + {x = -1, y = 0, z = 0}, -- borrowed from extrawires crossing + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, +} + +local rules_alldir = { + {x = 0, y = 0, z = -1}, -- borrowed from lightstones + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 1, y = 1, z = 0}, + {x = 1, y = -1, z = 0}, + {x = -1, y = 1, z = 0}, + {x = -1, y = -1, z = 0}, + {x = 0, y = 1, z = 1}, + {x = 0, y = -1, z = 1}, + {x = 0, y = 1, z = -1}, + {x = 0, y = -1, z = -1}, + {x = 0, y = -1, z = 0}, +} + +local rules_toponly = { + {x = 1, y = 1, z = 0}, + {x = -1, y = 1, z = 0}, + {x = 0, y = 1, z = 1}, + {x = 0, y = 1, z = -1}, +} + if minetest.get_modpath("mesecons") then homedecor.mesecon_wall_light = { - effector = { - 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, - rules = mesecon.rules.wallmounted_get - } + effector = table.copy(actions) } + homedecor.mesecon_wall_light.effector.rules = mesecon.rules.wallmounted_get + + homedecor.mesecon_xz_light = { + effector = table.copy(actions) + } + homedecor.mesecon_xz_light.effector.rules = rules_xz + + homedecor.mesecon_alldir_light = { + effector = table.copy(actions), + } + homedecor.mesecon_alldir_light.effector.rules = rules_alldir + + homedecor.mesecon_toponly_light = { + effector = table.copy(actions) + } + homedecor.mesecon_toponly_light.effector.rules = rules_toponly + end local brightness_tab = { @@ -291,7 +339,8 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:plasma_lamp_on"}}, } - } + }, + mesecons = homedecor.mesecon_alldir_light }) local lighttex = "homedecor_blanktile.png" @@ -326,7 +375,8 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:plasma_ball_on"}}, } - } + }, + mesecons = homedecor.mesecon_xz_light }) local gl_cbox = { @@ -357,7 +407,8 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:ground_lantern_on"}}, } - } + }, + mesecons = homedecor.mesecon_xz_light }) local hl_cbox = { @@ -381,7 +432,8 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:hanging_lantern_on"}}, } - } + }, + mesecons = homedecor.mesecon_alldir_light }) local cl_cbox = { @@ -405,7 +457,8 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:ceiling_lantern_on"}}, } - } + }, + mesecons = homedecor.mesecon_toponly_light }) if minetest.get_modpath("darkage") then @@ -425,11 +478,12 @@ for _, onoff in ipairs({"on", "off"}) do light_source = onflag and default.LIGHT_MAX or nil, sounds = default.node_sound_glass_defaults(), on_rightclick = homedecor.toggle_light, - drop = { - items = { - {items = {"homedecor:lattice_lantern_large_on"}}, - } - } + drop = { + items = { + {items = {"homedecor:lattice_lantern_large_on"}}, + } + }, + mesecons = homedecor.mesecon_alldir_light }) end @@ -468,7 +522,8 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:lattice_lantern_small_on"}}, } - } + }, + mesecons = homedecor.mesecon_wall_light }) -- "gooseneck" style desk lamps @@ -505,7 +560,8 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:desk_lamp_on"}, inherit_color = true }, } - } + }, + mesecons = homedecor.mesecon_xz_light }) -- "kitchen"/"dining room" ceiling lamp @@ -528,9 +584,12 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:ceiling_lamp_on"}}, } - } + }, + mesecons = homedecor.mesecon_toponly_light }) +-- rope lighting + minetest.register_node(":homedecor:rope_light_on_floor_"..onoff, { description = "Rope lighting (on floor)", inventory_image = "homedecor_rope_light_on_floor.png", @@ -554,7 +613,11 @@ for _, onoff in ipairs({"on", "off"}) do { -6/16, -8/16, 4/16, 6/16, -6/16, 6/16 } }, }, - connects_to = { "homedecor:rope_light_on_floor" }, + connects_to = { + "homedecor:rope_light_on_floor_on", + "homedecor:rope_light_on_floor_off", + "group:mesecon_conductor_craftable" + }, mesh = "homedecor_chandelier.obj", groups = {cracky=3, not_in_creative_inventory = nici}, sounds = default.node_sound_stone_defaults(), @@ -563,6 +626,14 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:rope_light_on_floor_on"} }, } + }, + mesecons = { + conductor = { + state = mesecon and (onflag and mesecon.state.on or mesecon.state.off), + onstate = "homedecor:rope_light_on_floor_on", + offstate = "homedecor:rope_light_on_floor_off", + rules = rules_xz + }, } }) @@ -589,7 +660,11 @@ for _, onoff in ipairs({"on", "off"}) do { -6/16, 8/16, 4/16, 6/16, 6/16, 6/16 } }, }, - connects_to = { "homedecor:rope_light_on_ceiling" }, + connects_to = { + "homedecor:rope_light_on_ceiling_on", + "homedecor:rope_light_on_ceiling_off", + "group:mesecon_conductor_craftable" + }, mesh = "homedecor_chandelier.obj", groups = {cracky=3, not_in_creative_inventory = nici}, sounds = default.node_sound_stone_defaults(), @@ -598,6 +673,14 @@ for _, onoff in ipairs({"on", "off"}) do items = { {items = {"homedecor:rope_light_on_ceiling_on"}}, } + }, + mesecons = { + conductor = { + state = mesecon and (onflag and mesecon.state.on or mesecon.state.off), + onstate = "homedecor:rope_light_on_ceiling_on", + offstate = "homedecor:rope_light_on_ceiling_off", + rules = rules_alldir + }, } }) @@ -899,8 +982,7 @@ local function reg_lamp(suffix, nxt, light, brightness) items = { {items = {"homedecor:table_lamp_hi"}, inherit_color = true }, } - } - + }, }) homedecor.register("standing_lamp_"..suffix, {