summaryrefslogtreecommitdiff
path: root/streets/trafficlight/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'streets/trafficlight/init.lua')
-rw-r--r--streets/trafficlight/init.lua367
1 files changed, 367 insertions, 0 deletions
diff --git a/streets/trafficlight/init.lua b/streets/trafficlight/init.lua
new file mode 100644
index 0000000..38b18c4
--- /dev/null
+++ b/streets/trafficlight/init.lua
@@ -0,0 +1,367 @@
+--[[
+ StreetsMod: inDev Trafficlights
+]]
+dofile(streets.modpath .. "/../trafficlight/old2new.lua")
+
+streets.tlBox = {
+ --[[ Thank you, rubenwardy, for your awesome NodeboxEditor! Not perfect, but still great! ]]
+ {-0.1875,-0.5,0.5,0.1875,0.5,0.75}, --nodebox1
+ {-0.0625,0.375,0.3125,0.0625,0.4375,0.5}, --nodebox2
+ {-0.0625,0.0625,0.3125,0.0625,0.125,0.5}, --nodebox3
+ {-0.0625,-0.25,0.3125,0.0625,-0.1875,0.5}, --nodebox4
+ {0.0625,0.3125,0.3125,0.125,0.38,0.5}, --nodebox5
+ {-0.125,0.3125,0.3125,-0.0625,0.375,0.5}, --nodebox6
+ {0.0625,0,0.3125,0.125,0.0625,0.5}, --nodebox7
+ {-0.125,0,0.3125,-0.0625,0.0625,0.5}, --nodebox8
+ {0.0625,-0.3125,0.3125,0.125,-0.25,0.5}, --nodebox9
+ {-0.125,-0.3125,0.3125,-0.0625,-0.25,0.5}, --nodebox10
+ {-0.125, -0.125, 0.85, 0.125, 0.125, 0.75}, -- NodeBox11
+}
+
+streets.tlRhythm = {
+ toRed = {
+ {name = "streets:trafficlight_top_yellow", pauseBefore = 0},
+ {name = "streets:trafficlight_top_red", pauseBefore = 3}
+ },
+ toGreen = {
+ {name = "streets:trafficlight_top_green", pauseBefore = 0}
+ },
+ toOff = {
+ {name = "streets:trafficlight_top_off", pauseBefore = 0}
+ },
+ toWarn = {
+ {name = "streets:trafficlight_top_warn", pauseBefore = 0}
+ },
+ toFlashRed = {
+ {name = "streets:trafficlight_top_flashred", pauseBefore = 0}
+ }
+}
+
+streets.tlRhythm_left = {
+ toRed = {
+ {name = "streets:trafficlight_top_left_yellow", pauseBefore = 0},
+ {name = "streets:trafficlight_top_left_red", pauseBefore = 3}
+ },
+ toGreen = {
+ {name = "streets:trafficlight_top_left_green", pauseBefore = 0}
+ },
+ toOff = {
+ {name = "streets:trafficlight_top_left_off", pauseBefore = 0}
+ },
+ toWarn = {
+ {name = "streets:trafficlight_top_left_warn", pauseBefore = 0}
+ },
+ toFlashRed = {
+ {name = "streets:trafficlight_top_left_flashred", pauseBefore = 0}
+ }
+}
+
+streets.tlRhythm_right = {
+ toRed = {
+ {name = "streets:trafficlight_top_right_yellow", pauseBefore = 0},
+ {name = "streets:trafficlight_top_right_red", pauseBefore = 3}
+ },
+ toGreen = {
+ {name = "streets:trafficlight_top_right_green", pauseBefore = 0}
+ },
+ toOff = {
+ {name = "streets:trafficlight_top_right_off", pauseBefore = 0}
+ },
+ toWarn = {
+ {name = "streets:trafficlight_top_right_warn", pauseBefore = 0}
+ },
+ toFlashRed = {
+ {name = "streets:trafficlight_top_right_flashred", pauseBefore = 0}
+ }
+}
+
+streets.tlSwitch = function(def)
+ if not def.pos or not def.to then
+ return
+ end
+ local rhythm = {}
+ local nodename = minetest.get_node(def.pos).name
+ if nodename:find("left") then
+ rhythm = streets.tlRhythm_left
+ elseif nodename:find("right") then
+ rhythm = streets.tlRhythm_right
+ else
+ rhythm = streets.tlRhythm
+ end
+ if not rhythm[def.to] then
+ return
+ end
+ local meta = minetest.get_meta(def.pos)
+ -- Only switch if new state ~= current state
+ if "to" .. meta:get_string("state") == def.to then
+ return
+ end
+ -- Switch the trafficlight
+ for k, v in pairs(rhythm[def.to]) do
+ minetest.get_meta(def.pos):set_string("state", def.to:gsub("to", ""))
+ minetest.after(v.pauseBefore, function()
+ minetest.swap_node(def.pos, {name = v.name, param2 = minetest.get_node(def.pos).param2})
+ end)
+ end
+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
+ if msg == "OFF" then
+ streets.tlSwitch({
+ pos = pos,
+ to = "toOff"
+ })
+ elseif msg == "GREEN" then
+ streets.tlSwitch({
+ pos = pos,
+ to = "toGreen"
+ })
+ elseif msg == "RED" then
+ streets.tlSwitch({
+ pos = pos,
+ to = "toRed"
+ })
+ elseif msg == "WARN" then
+ streets.tlSwitch({
+ pos = pos,
+ to = "toWarn"
+ })
+ elseif msg == "FLASHRED" then
+ streets.tlSwitch({
+ pos = pos,
+ to = "toFlashRed"
+ })
+ elseif msg == "GET" then
+ local state = minetest.get_meta(pos):get_string("state")
+ if not state or state == "" then
+ state = "UNDEFINED"
+ end
+ digiline:receptor_send(pos, digiline.rules.default, channel, state)
+ end
+end
+
+minetest.register_node(":streets:digiline_distributor",{
+ description = streets.S("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}
+ }
+ }
+ }
+})
+
+for _,i in pairs({"","_left","_right"}) do
+ minetest.register_node(":streets:trafficlight_top"..i.."_off",{
+ description = streets.S((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 = "streets_trafficlight_inv.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 = {},
+ 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)
+ 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_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 = {},
+ 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_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 = {},
+ effector = {
+ action = function(pos, node, channel, msg)
+ streets.on_digiline_receive(pos, node, channel, msg)
+ end
+ }
+ },
+ })
+
+ minetest.register_alias("streets:trafficlight_top"..i.."_redyellow","streets:trafficlight_top"..i.."_green")
+
+ minetest.register_node(":streets:trafficlight_top"..i.."_green",{
+ drop = "streets:trafficlight_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_tl"..i.."_green.png"},
+ node_box = {
+ type = "fixed",
+ fixed = streets.tlBox
+ },
+ light_source = 6,
+ digiline = {
+ receptor = {},
+ 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_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.5},
+ }},
+ node_box = {
+ type = "fixed",
+ fixed = streets.tlBox
+ },
+ light_source = 6,
+ digiline = {
+ receptor = {},
+ 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_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.5},
+ }},
+ node_box = {
+ type = "fixed",
+ fixed = streets.tlBox
+ },
+ light_source = 6,
+ digiline = {
+ receptor = {},
+ 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:digiline_distributor",
+ recipe = {
+ {"", "digilines:wire_std_00000000", ""},
+ {"digilines:wire_std_00000000", "mesecons_luacontroller:luacontroller0000", "digilines:wire_std_00000000"},
+ {"", "digilines:wire_std_00000000", ""}
+ }
+})