--[[ ## StreetsMod 2.0 ## Submod: trafficlight Optional: true ]] streets.tlBox = { { -0.1875, -0.5, 0.5, 0.1875, 0.5, 0.75 }, --Box { -0.125, -0.125, 0.85, 0.125, 0.125, 0.75 }, -- Pole Mounting Bracket { -0.125, 0.3125, 0.3125, -0.0625, 0.375, 0.5 }, --Top Visor, Left { -0.0625, 0.375, 0.3125, 0.0625, 0.4375, 0.5 }, --Top Visor, Center { 0.0625, 0.3125, 0.3125, 0.125, 0.38, 0.5 }, --Top Visor, Right { -0.125, 0, 0.3125, -0.0625, 0.0625, 0.5 }, --Middle Visor, Left { -0.0625, 0.0625, 0.3125, 0.0625, 0.125, 0.5 }, --Middle Visor, Center { 0.0625, 0, 0.3125, 0.125, 0.0625, 0.5 }, --Middle Visor, Right { -0.125, -0.3125, 0.3125, -0.0625, -0.25, 0.5 }, --Bottom Visor, Left { -0.0625, -0.25, 0.3125, 0.0625, -0.1875, 0.5 }, --Bottom Visor, Center { 0.0625, -0.3125, 0.3125, 0.125, -0.25, 0.5 }, --Bottom Visor, Right } streets.tleBox = { { -0.1875, -0.1875, 0.5, 0.1875, 0.5, 0.75 }, --Box { -0.125, 0.3125, 0.3125, -0.0625, 0.375, 0.5 }, --Top Visor, Left { -0.0625, 0.375, 0.3125, 0.0625, 0.4375, 0.5 }, --Top Visor, Center { 0.0625, 0.3125, 0.3125, 0.125, 0.38, 0.5 }, --Top Visor, Right { -0.125, 0, 0.3125, -0.0625, 0.0625, 0.5 }, --Middle Visor, Left { -0.0625, 0.0625, 0.3125, 0.0625, 0.125, 0.5 }, --Middle Visor, Center { 0.0625, 0, 0.3125, 0.125, 0.0625, 0.5 }, --Middle Visor, Right } streets.plBox = { { -0.1875, -0.5, 0.5, 0.1875, 0.5, 0.75 }, --Box { -0.125, -0.125, 0.85, 0.125, 0.125, 0.75 }, -- Pole Mounting Bracket { -0.1875, 0.0625, 0.3125, -0.1375, 0.4375, 0.5 }, --Top Visor, Left { -0.1375, 0.3875, 0.3125, 0.1375, 0.4375, 0.5 }, --Top Visor, Center { 0.1875, 0.0625, 0.3125, 0.1375, 0.4375, 0.5 }, --Top Visor, Right { -0.1875, -0.0625, 0.3125, -0.1375, -0.4375, 0.5 }, --Bottom Visor, Left { -0.1375, -0.0625, 0.3125, 0.1375, -0.1125, 0.5 }, --Bottom Visor, Center { 0.1875, -0.0625, 0.3125, 0.1375, -0.4375, 0.5 }, --Bottom Visor, Right } streets.bBox = { { -0.1875, -0.1875, 0.5, 0.1875, 0.1875, 0.75 }, --Box { -0.125, -0.125, 0.85, 0.125, 0.125, 0.75 }, -- Pole Mounting Bracket { -0.125, 0, 0.3125, -0.0625, 0.0625, 0.5 }, --Visor, Left { -0.0625, 0.0625, 0.3125, 0.0625, 0.125, 0.5 }, --Visor, Center { 0.0625, 0, 0.3125, 0.125, 0.0625, 0.5 }, --Visor, Right } streets.hbBox = { { -0.375, -0.25, 0.5, 0.375, 0.25, 0.75 }, --Box { -0.125, -0.125, 0.85, 0.125, 0.125, 0.75 }, -- Pole Mounting Bracket { -0.3, 0.0625, 0.3125, -0.2375, 0.125, 0.5 }, --Top Left Visor, Left { -0.2375, 0.125, 0.3125, -0.1125, 0.1875, 0.5 }, --Top Left Visor, Center { -0.1125, 0.0625, 0.3125, -0.05, 0.125, 0.5 }, --Top Left Visor, Right { 0.1125, 0.0625, 0.3125, 0.05, 0.125, 0.5 }, --Top Right Visor, Left { 0.2375, 0.125, 0.3125, 0.1125, 0.1875, 0.5 }, --Top Right Visor, Center { 0.3, 0.0625, 0.3125, 0.2375, 0.125, 0.5 }, --Top Right Visor, Right { -0.125, -0.125, 0.3125, -0.0625, -0.0625, 0.5 }, --Bottom Visor, Left { -0.0625, -0.0625, 0.3125, 0.0625, 0, 0.5 }, --Bottom Visor, Center { 0.0625, -0.125, 0.3125, 0.125, -0.0625, 0.5 }, --Bottom Visor, Right } streets.tlDigilineRules = { { x = 0, y = 0, z = -1 }, { x = 0, y = 0, z = 1 }, { x = 1, y = 0, z = 0 }, { x = -1, y = 0, z = 0 }, { x = 0, y = -1, z = 0 }, { x = 0, y = 1, z = 0 } } streets.tlSwitch = function(pos, to) if not pos or not to then return end minetest.swap_node(pos, { name = to, param2 = minetest.get_node(pos).param2 }) end streets.on_digiline_receive = function(pos, node, channel, msg) local setchan = minetest.get_meta(pos):get_string("channel") if setchan ~= channel then return end -- Tl states local name = minetest.get_node(pos).name if type(msg) ~= "string" then return end msg = string.upper(msg) if msg == "OFF" then if name:find("pedlight") then streets.tlSwitch(pos, "streets:pedlight_top_off") elseif name:find("extender_left") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_left_off") elseif name:find("extender_right") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_right_off") elseif name:find("left") then streets.tlSwitch(pos, "streets:trafficlight_top_left_off") elseif name:find("right") then streets.tlSwitch(pos, "streets:trafficlight_top_right_off") elseif name:find("beacon_hybrid") then streets.tlSwitch(pos, "streets:beacon_hybrid_off") elseif name:find("beacon") then streets.tlSwitch(pos, "streets:beacon_off") else streets.tlSwitch(pos, "streets:trafficlight_top_off") end elseif msg == "GREEN" then if name:find("pedlight") then streets.tlSwitch(pos, "streets:pedlight_top_walk") elseif name:find("extender_left") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_left_green") elseif name:find("extender_right") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_right_green") elseif name:find("left") then streets.tlSwitch(pos, "streets:trafficlight_top_left_green") elseif name:find("right") then streets.tlSwitch(pos, "streets:trafficlight_top_right_green") elseif name:find("beacon_hybrid") then --Not Supported elseif name:find("beacon") then --Not Supported else streets.tlSwitch(pos, "streets:trafficlight_top_green") end elseif msg == "RED" then if name:find("pedlight") then streets.tlSwitch(pos, "streets:pedlight_top_dontwalk") elseif name:find("extender_left") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_left_off") elseif name:find("extender_right") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_right_off") elseif name:find("left") then streets.tlSwitch(pos, "streets:trafficlight_top_left_red") elseif name:find("right") then streets.tlSwitch(pos, "streets:trafficlight_top_right_red") elseif name:find("beacon_hybrid") then streets.tlSwitch(pos, "streets:beacon_hybrid_red") elseif name:find("beacon") then --Not Supported else streets.tlSwitch(pos, "streets:trafficlight_top_red") end elseif msg == "FLASHGREEN" then if name:find("pedlight") then streets.tlSwitch(pos, "streets:pedlight_top_flashingwalk") elseif name:find("extender_left") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_left_flashgreen") elseif name:find("extender_right") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_right_flashgreen") elseif name:find("left") then streets.tlSwitch(pos, "streets:trafficlight_top_left_flashgreen") elseif name:find("right") then streets.tlSwitch(pos, "streets:trafficlight_top_right_flashgreen") elseif name:find("beacon_hybrid") then --Not Supported elseif name:find("beacon") then --Not Supported else streets.tlSwitch(pos, "streets:trafficlight_top_flashgreen") end elseif msg == "REDYELLOW" then if name:find("pedlight") then --Not Supported elseif name:find("extender_left") then --Not Supported elseif name:find("extender_right") then --Not Supported elseif name:find("left") then streets.tlSwitch(pos, "streets:trafficlight_top_left_redyellow") elseif name:find("right") then streets.tlSwitch(pos, "streets:trafficlight_top_right_redyellow") elseif name:find("beacon_hybrid") then --Not Supported elseif name:find("beacon") then --Not Supported else streets.tlSwitch(pos, "streets:trafficlight_top_redyellow") end elseif msg == "FLASHYELLOW" then if name:find("pedlight") then streets.tlSwitch(pos, "streets:pedlight_top_flashingdontwalk") elseif name:find("extender_left") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_left_off") elseif name:find("extender_right") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_right_off") elseif name:find("left") then streets.tlSwitch(pos, "streets:trafficlight_top_left_warn") elseif name:find("right") then streets.tlSwitch(pos, "streets:trafficlight_top_right_warn") elseif name:find("beacon_hybrid") then streets.tlSwitch(pos, "streets:beacon_hybrid_flashyellow") elseif name:find("beacon") then streets.tlSwitch(pos, "streets:beacon_flashyellow") else streets.tlSwitch(pos, "streets:trafficlight_top_warn") end elseif msg == "YELLOW" then if name:find("pedlight") then streets.tlSwitch(pos, "streets:pedlight_top_flashingdontwalk") elseif name:find("extender_left") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_left_yellow") elseif name:find("extender_right") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_right_yellow") elseif name:find("left") then streets.tlSwitch(pos, "streets:trafficlight_top_left_yellow") elseif name:find("right") then streets.tlSwitch(pos, "streets:trafficlight_top_right_yellow") elseif name:find("beacon_hybrid") then streets.tlSwitch(pos, "streets:beacon_hybrid_yellow") elseif name:find("beacon") then --Not Supported else streets.tlSwitch(pos, "streets:trafficlight_top_yellow") end elseif msg == "FLASHRED" then if name:find("pedlight") then streets.tlSwitch(pos, "streets:pedlight_top_flashingdontwalk") elseif name:find("extender_left") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_left_off") elseif name:find("extender_right") then streets.tlSwitch(pos, "streets:trafficlight_top_extender_right_off") elseif name:find("left") then streets.tlSwitch(pos, "streets:trafficlight_top_left_flashred") elseif name:find("right") then streets.tlSwitch(pos, "streets:trafficlight_top_right_flashred") elseif name:find("beacon_hybrid") then streets.tlSwitch(pos, "streets:beacon_hybrid_flashred") elseif name:find("beacon") then streets.tlSwitch(pos, "streets:beacon_flashred") else streets.tlSwitch(pos, "streets:trafficlight_top_flashred") end end end minetest.register_node(":streets:digiline_distributor", { description = "Digiline distributor", tiles = { "streets_lampcontroller_top.png", "streets_lampcontroller_bottom.png", "streets_lampcontroller_sides.png" }, groups = { cracky = 1 }, drawtype = "nodebox", paramtype = "light", node_box = { type = "fixed", fixed = { { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, { -0.05, 0.5, -0.05, 0.05, 1.6, 0.05 } } }, digiline = { wire = { rules = { { x = 0, y = 0, z = -1 }, { x = 0, y = 0, z = 1 }, { x = 1, y = 0, z = 0 }, { x = -1, y = 0, z = 0 }, { x = 0, y = 2, z = 0 } } } } }) minetest.register_node(":streets:beacon_hybrid_off", { description = "Hybrid Beacon", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2 }, inventory_image = "streets_hybrid_beacon_inv.png", light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.hbBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_hb_off.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:beacon_hybrid_yellow", { drop = "streets:beacon_hybrid_off", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.hbBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_hb_yellow.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:beacon_hybrid_red", { drop = "streets:beacon_hybrid_off", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.hbBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_hb_red.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:beacon_hybrid_flashyellow", { drop = "streets:beacon_hybrid_off", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.hbBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_hb_flashyellow.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:beacon_hybrid_flashred", { drop = "streets:beacon_hybrid_off", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.hbBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_hb_flashred.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:beacon_off", { description = "Beacon", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2 }, inventory_image = "streets_beacon_inv.png", light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.bBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_off.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:beacon_flashred", { drop = "streets:beacon_off", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.bBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_b_flashred.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:beacon_flashyellow", { drop = "streets:beacon_off", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.bBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_tl_warn.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top_extender_left_off", { description = "Traffic Light Left-Turn Module", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2 }, inventory_image = "streets_trafficlight_inv_extender_left.png", light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tleBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_left_off.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top_extender_left_yellow", { drop = "streets:trafficlight_top_extender_left_off", description = "Traffic Light Left-Turn Module", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tleBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tle_left_yellow.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top_extender_left_green", { drop = "streets:trafficlight_top_extender_left_off", description = "Traffic Light Left-Turn Module", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tleBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tle_left_green.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top_extender_left_flashgreen", { drop = "streets:trafficlight_top_extender_left_off", description = "Traffic Light Left-Turn Module", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tleBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_tle_left_flashgreen.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top_extender_right_off", { description = "Traffic Light Right-Turn Module", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2 }, inventory_image = "streets_trafficlight_inv_extender_right.png", light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tleBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_right_off.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top_extender_right_yellow", { drop = "streets:trafficlight_top_extender_right_off", description = "Traffic Light Right-Turn Module", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tleBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tle_right_yellow.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top_extender_right_green", { drop = "streets:trafficlight_top_extender_right_off", description = "Traffic Light Right-Turn Module", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tleBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tle_right_green.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top_extender_right_flashgreen", { drop = "streets:trafficlight_top_extender_right_off", description = "Traffic Light Right-Turn Module", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2, not_in_creative_inventory = 1 }, light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tleBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_tle_right_flashgreen.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:pedlight_top_off", { description = "Pedestrian Light", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2 }, inventory_image = "streets_pedlight_inv.png", light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.plBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_pl_off.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:pedlight_top_dontwalk", { drop = "streets:pedlight_top_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_pl_dontwalk.png" }, node_box = { type = "fixed", fixed = streets.plBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:pedlight_top_walk", { drop = "streets:pedlight_top_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_pl_walk.png" }, node_box = { type = "fixed", fixed = streets.plBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:pedlight_top_flashingdontwalk", { drop = "streets:pedlight_top_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_pl_flashingdontwalk.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, node_box = { type = "fixed", fixed = streets.plBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:pedlight_top_flashingwalk", { drop = "streets:pedlight_top_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_pl_flashingwalk.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, node_box = { type = "fixed", fixed = streets.plBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) for _, i in pairs({ "", "_left", "_right" }) do minetest.register_node(":streets:trafficlight_top" .. i .. "_off", { description = (i == "" and "Traffic Light") or (i == "_left" and "Traffic Light (Left Turn)") or (i == "_right" and "Traffic Light (Right Turn)"), drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", groups = { cracky = 1, level = 2 }, inventory_image = ((i == "") and "streets_trafficlight_inv_straight.png") or ((i == "_left") and "streets_trafficlight_inv_left.png") or ((i == "_right") and "streets_trafficlight_inv_right.png"), light_source = 11, sunlight_propagates = true, node_box = { type = "fixed", fixed = streets.tlBox }, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl" .. i .. "_off.png" }, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[channel;Channel;${channel}]") end, on_receive_fields = function(pos, formname, fields, sender) local name = sender:get_player_name() if minetest.is_protected(pos, name) and not minetest.check_player_privs(name, { protection_bypass = true }) then minetest.record_protection_violation(pos, name) return end if (fields.channel) then minetest.get_meta(pos):set_string("channel", fields.channel) minetest.get_meta(pos):set_string("state", "Off") end end, }) minetest.register_node(":streets:trafficlight_top" .. i .. "_red", { drop = "streets:trafficlight_top" .. i .. "_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl" .. i .. "_red.png" }, node_box = { type = "fixed", fixed = streets.tlBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:trafficlight_top" .. i .. "_yellow", { drop = "streets:trafficlight_top" .. i .. "_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl" .. i .. "_yellow.png" }, node_box = { type = "fixed", fixed = streets.tlBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:trafficlight_top" .. i .. "_redyellow", { drop = "streets:trafficlight_top" .. i .. "_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl" .. i .. "_redyellow.png" }, node_box = { type = "fixed", fixed = streets.tlBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:trafficlight_top" .. i .. "_green", { drop = "streets:trafficlight_top" .. i .. "_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl" .. i .. "_green.png" }, node_box = { type = "fixed", fixed = streets.tlBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:trafficlight_top" .. i .. "_warn", { drop = "streets:trafficlight_top" .. i .. "_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_tl" .. i .. "_warn.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, node_box = { type = "fixed", fixed = streets.tlBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:trafficlight_top" .. i .. "_flashred", { drop = "streets:trafficlight_top" .. i .. "_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_tl" .. i .. "_flashred.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, node_box = { type = "fixed", fixed = streets.tlBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) minetest.register_node(":streets:trafficlight_top" .. i .. "_flashgreen", { drop = "streets:trafficlight_top" .. i .. "_off", groups = { cracky = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", { name = "streets_tl" .. i .. "_flashgreen.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 }, } }, node_box = { type = "fixed", fixed = streets.tlBox }, light_source = 6, digiline = { receptor = {}, wire = { rules = streets.tlDigilineRules }, effector = { action = function(pos, node, channel, msg) streets.on_digiline_receive(pos, node, channel, msg) end } }, }) end minetest.register_craft({ output = "streets:trafficlight_top_off", recipe = { { "default:steel_ingot", "dye:red", "default:steel_ingot" }, { "default:steel_ingot", "dye:yellow", "default:steel_ingot" }, { "default:steel_ingot", "dye:green", "default:steel_ingot" } } }) minetest.register_craft({ output = "streets:trafficlight_top_left_off", recipe = { { "dye:red", "default:steel_ingot", "default:steel_ingot" }, { "dye:yellow", "default:steel_ingot", "default:steel_ingot" }, { "dye:green", "default:steel_ingot", "default:steel_ingot" } } }) minetest.register_craft({ output = "streets:trafficlight_top_right_off", recipe = { { "default:steel_ingot", "default:steel_ingot", "dye:red" }, { "default:steel_ingot", "default:steel_ingot", "dye:yellow" }, { "default:steel_ingot", "default:steel_ingot", "dye:green" } } }) minetest.register_craft({ output = "streets:pedlight_top_off", recipe = { { "default:steel_ingot", "dye:orange", "default:steel_ingot" }, { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, { "default:steel_ingot", "dye:white", "default:steel_ingot" } } }) minetest.register_craft({ output = "streets:trafficlight_top_extender_left_off", recipe = { { "dye:yellow", "default:steel_ingot", "default:steel_ingot" }, { "dye:green", "default:steel_ingot", "default:steel_ingot" } } }) minetest.register_craft({ output = "streets:trafficlight_top_extender_right_off", recipe = { { "default:steel_ingot", "default:steel_ingot", "dye:yellow" }, { "default:steel_ingot", "default:steel_ingot", "dye:green" } } }) minetest.register_craft({ output = "streets:beacon_off", recipe = { { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, { "default:steel_ingot", "dye:red", "default:steel_ingot" }, { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } } }) minetest.register_craft({ output = "streets:beacon_hybrid_off", recipe = { { "dye:red", "default:steel_ingot", "dye:red" }, { "default:steel_ingot", "dye:yellow", "default:steel_ingot" }, { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } } }) minetest.register_craft({ output = "streets:digiline_distributor", recipe = { { "", "digilines:wire_std_00000000", "" }, { "digilines:wire_std_00000000", "mesecons_luacontroller:luacontroller0000", "digilines:wire_std_00000000" }, { "", "digilines:wire_std_00000000", "" } } }) streets.portable_tl_on_receive_fields = function(pos, formname, fields, sender) local meta = minetest.get_meta(pos) if fields.normal then meta:set_string("mode", "Normal") elseif fields.yyflash then meta:set_string("mode", "Y-Y Flash") elseif fields.yrflash then meta:set_string("mode", "Y-R Flash") elseif fields.rrflash then meta:set_string("mode", "R-R Flash") elseif fields.save then if tonumber(fields.yellow) then meta:set_int("yellow", fields.yellow) end if tonumber(fields.allred) then meta:set_int("allred", fields.allred) end if tonumber(fields.maingreen) then meta:set_int("maingreen", fields.maingreen) end if tonumber(fields.sidegreen) then meta:set_int("sidegreen", fields.sidegreen) end end end streets.portable_tl_tick = function(pos, meta) local yellow = meta:get_int("yellow") local allred = meta:get_int("allred") local sidegreen = meta:get_int("sidegreen") local maingreen = meta:get_int("maingreen") local tick = meta:get_int("tick") local mode = meta:get_string("mode") local phase = meta:get_string("phase") local time = "" if mode == "Normal" then local phaselen = 0 if phase == "All Red A" or phase == "All Red B" then phaselen = allred elseif phase == "Yellow A" or phase == "Yellow B" then phaselen = yellow elseif phase == "Side Green" then phaselen = sidegreen elseif phase == "Main Green" then phaselen = maingreen end tick = tick + 1 if tick >= phaselen then tick = 0 if phase == "All Red A" then phase = "Side Green" elseif phase == "Side Green" then phase = "Yellow B" elseif phase == "Yellow B" then phase = "All Red B" elseif phase == "All Red B" then phase = "Main Green" elseif phase == "Main Green" then phase = "Yellow A" elseif phase == "Yellow A" then phase = "All Red A" end if phase == "All Red A" or phase == "All Red B" then phaselen = allred elseif phase == "Yellow A" or phase == "Yellow B" then phaselen = yellow elseif phase == "Side Green" then phaselen = sidegreen elseif phase == "Main Green" then phaselen = maingreen end end time = string.format("%s of %s Seconds Remaining", phaselen - tick, phaselen) end meta:set_int("tick", tick) local need_swap = phase ~= meta:get_string(phase) local swap_to = "streets:trafficlight_portable_rrflash" meta:set_string("phase", phase) if mode == "R-R Flash" then need_swap = true swap_to = "streets:trafficlight_portable_rrflash" elseif mode == "Y-Y Flash" then need_swap = true swap_to = "streets:trafficlight_portable_yyflash" elseif mode == "Y-R Flash" then need_swap = true swap_to = "streets:trafficlight_portable_yrflash" end if need_swap then if mode == "Normal" then if phase == "All Red A" or phase == "All Red B" then swap_to = "streets:trafficlight_portable_allred" elseif phase == "Yellow A" then swap_to = "streets:trafficlight_portable_yellowa" elseif phase == "Yellow B" then swap_to = "streets:trafficlight_portable_yellowb" elseif phase == "Main Green" then swap_to = "streets:trafficlight_portable_maingreen" elseif phase == "Side Green" then swap_to = "streets:trafficlight_portable_sidegreen" end end local node = minetest.get_node(pos) minetest.swap_node(pos, { name = swap_to, param2 = node.param2 }) end local formspec = "size[8,4]" .. "label[0,0;Mode: " .. mode .. "]" .. "label[0,0.5;" .. (mode == "Normal" and "Phase: " .. phase or "") .. "]" .. "label[0,1;" .. time .. "]" .. "label[0,2;Select Mode:]" .. "button[0,2.5;2,1;normal;Normal]" .. "button[2,2.5;2,1;rrflash;R-R Flash]" .. "button[0,3.5;2,1;yyflash;Y-Y Flash]" .. "button[2,3.5;2,1;yrflash;Y-R Flash]" .. "label[5.5,0;Time Adjustments:]" if mode == "Normal" then formspec = formspec .. "label[5.5,1;Cannot edit times\nwhile running.\nSelect a flash mode first.]" else formspec = formspec .. "field[4.5,1;2,1;yellow;Yellow;${yellow}]" .. "field[6.5,1;2,1;allred;All Red;${allred}]" .. "field[4.5,2;2,1;maingreen;Main Green;${maingreen}]" .. "field[6.5,2;2,1;sidegreen;Side Green;${sidegreen}]" .. "button[5.25,3;2,1;save;Save]" end meta:set_string("formspec", formspec) end minetest.register_node(":streets:trafficlight_portable_off", { description = "Portable Traffic Light", inventory_image = "streets_trafficlight_inv_portable.png", groups = { cracky = 1, portable_tl = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_off.png", "streets_tl_off.png", "streets_tl_off.png", "streets_tl_off.png" }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_int("yellow", 3) meta:set_int("allred", 2) meta:set_int("sidegreen", 5) meta:set_int("maingreen", 10) meta:set_int("tick", 0) meta:set_string("mode", "R-R Flash") meta:set_string("phase", "All Red A") end, light_source = 6, }) minetest.register_node(":streets:trafficlight_portable_allred", { drop = "streets:trafficlight_portable_off", groups = { cracky = 1, portable_tl = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_red.png", "streets_tl_red.png", "streets_tl_red.png", "streets_tl_red.png" }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, light_source = 6, }) minetest.register_node(":streets:trafficlight_portable_yellowa", { drop = "streets:trafficlight_portable_off", groups = { cracky = 1, portable_tl = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_red.png", "streets_tl_red.png", "streets_tl_yellow.png", "streets_tl_yellow.png" }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, light_source = 6, }) minetest.register_node(":streets:trafficlight_portable_yellowb", { drop = "streets:trafficlight_portable_off", groups = { cracky = 1, portable_tl = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_yellow.png", "streets_tl_yellow.png", "streets_tl_red.png", "streets_tl_red.png" }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, light_source = 6, }) minetest.register_node(":streets:trafficlight_portable_maingreen", { drop = "streets:trafficlight_portable_off", groups = { cracky = 1, portable_tl = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_red.png", "streets_tl_red.png", "streets_tl_green.png", "streets_tl_green.png" }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, light_source = 6, }) minetest.register_node(":streets:trafficlight_portable_sidegreen", { drop = "streets:trafficlight_portable_off", groups = { cracky = 1, portable_tl = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_green.png", "streets_tl_green.png", "streets_tl_red.png", "streets_tl_red.png" }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, light_source = 6, }) streets.portable_tl_tile_flashred = { name = "streets_tl_flashred.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 } } streets.portable_tl_tile_flashyellow = { name = "streets_tl_warn.png", animation = { type = "vertical_frames", aspect_w = 64, aspect_h = 64, length = 1.2 } } minetest.register_node(":streets:trafficlight_portable_rrflash", { drop = "streets:trafficlight_portable_off", groups = { cracky = 1, portable_tl = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", streets.portable_tl_tile_flashred, streets.portable_tl_tile_flashred, streets.portable_tl_tile_flashred, streets.portable_tl_tile_flashred }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, light_source = 6, }) minetest.register_node(":streets:trafficlight_portable_yyflash", { drop = "streets:trafficlight_portable_off", groups = { cracky = 1, portable_tl = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", streets.portable_tl_tile_flashyellow, streets.portable_tl_tile_flashyellow, streets.portable_tl_tile_flashyellow, streets.portable_tl_tile_flashyellow }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, light_source = 6, }) minetest.register_node(":streets:trafficlight_portable_yrflash", { drop = "streets:trafficlight_portable_off", groups = { cracky = 1, portable_tl = 1, not_in_creative_inventory = 1 }, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, drawtype = "nodebox", on_receive_fields = streets.portable_tl_on_receive_fields, tiles = { "streets_tl_bg.png", "streets_tl_bg.png", streets.portable_tl_tile_flashred, streets.portable_tl_tile_flashred, streets.portable_tl_tile_flashyellow, streets.portable_tl_tile_flashyellow }, node_box = { type = "fixed", fixed = { { -0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875 }, --Box --Needs visors at some point. Converting to a mesh would be best. } }, light_source = 6, }) minetest.register_abm({ nodenames = "group:portable_tl", interval = 1, chance = 1, action = function(pos) streets.portable_tl_tick(pos, minetest.get_meta(pos)) end, }) minetest.register_craft({ output = "streets:trafficlight_portable_off", type = "shapeless", recipe = { "streets:trafficlight_top_off", "mesecons_luacontroller:luacontroller0000" } }) minetest.register_node("streets:pedbutton_left", { drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_pedbutton_us_back.png", "streets_pedbutton_us_left.png" }, paramtype = "light", paramtype2 = "facedir", legacy_wallmounted = true, walkable = false, sunlight_propagates = true, selection_box = { type = "fixed", fixed = { -0.5, -0.5, 0.65, 0.5, 0.5, 0.85 } }, node_box = { type = "fixed", fixed = { { -0.1, -0.1, 0.7, 0.1, 0.1, 0.85 }, { -0.5, -0.5, 0.7, 0.5, 0.5, 0.7 }, { -0.06, -0.41, 0.7, 0.05, -0.32, 0.65 } } }, { receptor = {} }, groups = { cracky = 1 }, description = "Pedestrian Crossing Button Assembly - Left", on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "size[8,4;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;6,2;msg;Message;${msg}]button_exit[2.25,3;3,1;submit;Save]") end, on_receive_fields = function(pos, formname, fields, sender) local meta = minetest.get_meta(pos) if fields.channel and fields.msg and fields.channel ~= "" and fields.msg ~= "" then meta:set_string("channel", fields.channel) meta:set_string("msg", fields.msg) meta:set_string("formspec", "") minetest.swap_node(pos, { name = "streets:pedbutton_left_off", param2 = minetest.get_node(pos).param2 }) else minetest.chat_send_player(sender:get_player_name(), "Channel and message must both be set!") end end, }) minetest.register_node("streets:pedbutton_left_off", { drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_pedbutton_us_back.png", "streets_pedbutton_us_left.png" }, paramtype = "light", paramtype2 = "facedir", legacy_wallmounted = true, walkable = false, sunlight_propagates = true, selection_box = { type = "fixed", fixed = { -0.5, -0.5, 0.65, 0.5, 0.5, 0.85 } }, node_box = { type = "fixed", fixed = { { -0.1, -0.1, 0.7, 0.1, 0.1, 0.85 }, { -0.5, -0.5, 0.7, 0.5, 0.5, 0.7 }, { -0.06, -0.41, 0.7, 0.05, -0.32, 0.65 } } }, digiline = { receptor = {} }, groups = { cracky = 1, not_in_creative_inventory = 1 }, drop = "streets:pedbutton_left", on_rightclick = function(pos) local meta = minetest.get_meta(pos) digiline:receptor_send(pos, digiline.rules.default, meta:get_string("channel"), meta:get_string("msg")) end, on_punch = function(pos) local meta = minetest.get_meta(pos) digiline:receptor_send(pos, digiline.rules.default, meta:get_string("channel"), meta:get_string("msg")) end, }) minetest.register_node("streets:pedbutton_right", { drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_pedbutton_us_back.png", "streets_pedbutton_us_right.png" }, paramtype = "light", paramtype2 = "facedir", legacy_wallmounted = true, walkable = false, sunlight_propagates = true, selection_box = { type = "fixed", fixed = { -0.5, -0.5, 0.65, 0.5, 0.5, 0.85 } }, node_box = { type = "fixed", fixed = { { -0.1, -0.1, 0.7, 0.1, 0.1, 0.85 }, { -0.5, -0.5, 0.7, 0.5, 0.5, 0.7 }, { -0.06, -0.41, 0.7, 0.05, -0.32, 0.65 } } }, { receptor = {} }, groups = { cracky = 1 }, description = "Pedestrian Crossing Button Assembly - Right", on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "size[8,4;]field[1,1;6,2;channel;Channel;${channel}]field[1,2;6,2;msg;Message;${msg}]button_exit[2.25,3;3,1;submit;Save]") end, on_receive_fields = function(pos, formname, fields, sender) local meta = minetest.get_meta(pos) if fields.channel and fields.msg and fields.channel ~= "" and fields.msg ~= "" then meta:set_string("channel", fields.channel) meta:set_string("msg", fields.msg) meta:set_string("formspec", "") minetest.swap_node(pos, { name = "streets:pedbutton_right_off", param2 = minetest.get_node(pos).param2 }) else minetest.chat_send_player(sender:get_player_name(), "Channel and message must both be set!") end end, }) minetest.register_node("streets:pedbutton_right_off", { drawtype = "nodebox", tiles = { "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_tl_bg.png", "streets_pedbutton_us_back.png", "streets_pedbutton_us_right.png" }, paramtype = "light", paramtype2 = "facedir", legacy_wallmounted = true, walkable = false, sunlight_propagates = true, selection_box = { type = "fixed", fixed = { -0.5, -0.5, 0.65, 0.5, 0.5, 0.85 } }, node_box = { type = "fixed", fixed = { { -0.1, -0.1, 0.7, 0.1, 0.1, 0.85 }, { -0.5, -0.5, 0.7, 0.5, 0.5, 0.7 }, { -0.06, -0.41, 0.7, 0.05, -0.32, 0.65 } } }, digiline = { receptor = {} }, groups = { cracky = 1, not_in_creative_inventory = 1 }, drop = "streets:pedbutton_right", on_rightclick = function(pos) local meta = minetest.get_meta(pos) digiline:receptor_send(pos, digiline.rules.default, meta:get_string("channel"), meta:get_string("msg")) end, on_punch = function(pos) local meta = minetest.get_meta(pos) digiline:receptor_send(pos, digiline.rules.default, meta:get_string("channel"), meta:get_string("msg")) end, }) minetest.register_craft({ output = "streets:pedbutton_left", type = "shapeless", recipe = { "streets:sign_us_pushtocross_left", "digilines:wire_std_00000000" } }) minetest.register_craft({ output = "streets:pedbutton_right", type = "shapeless", recipe = { "streets:sign_us_pushtocross_right", "digilines:wire_std_00000000" } })