diff options
Diffstat (limited to 'trafficlight')
24 files changed, 429 insertions, 0 deletions
diff --git a/trafficlight/depends.txt b/trafficlight/depends.txt new file mode 100644 index 0000000..8d7b8d8 --- /dev/null +++ b/trafficlight/depends.txt @@ -0,0 +1,4 @@ +default +streetsmod +digilines? +mesecons?
\ No newline at end of file diff --git a/trafficlight/init.lua b/trafficlight/init.lua new file mode 100644 index 0000000..38b18c4 --- /dev/null +++ b/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", ""} + } +}) diff --git a/trafficlight/old2new.lua b/trafficlight/old2new.lua new file mode 100644 index 0000000..51ba9f3 --- /dev/null +++ b/trafficlight/old2new.lua @@ -0,0 +1,58 @@ +--[[ + StreetsMod: Convert old trafficlights +]] +minetest.register_node(":streets:trafficlight_bottom", { + diggable = false, + pointable = false, + drawtype = "airlike", + description = "I'm an old node, please drop me", + groups = {not_in_creative_inventory = 1} +}) +minetest.register_abm({ + nodenames = {"streets:trafficlight_bottom"}, + interval = 1, + chance = 1, + action = function(pos, node) + minetest.log("action", "Converting trafficlight at position " .. minetest.pos_to_string(pos)) + -- Replace controller with distributor + pos.y = pos.y - 2 + minetest.set_node(pos, {name = "streets:digiline_distributor"}) + -- Change bottom pole + pos.y = pos.y + 2 + minetest.set_node(pos, {name = "streets:bigpole", param2 = 2}) + -- Change middle pole + pos.y = pos.y + 1 + minetest.set_node(pos, {name = "streets:bigpole", param2 = 2}) + -- Change the top + pos.y = pos.y + 1 + local fd = minetest.get_node(pos).param2 + local ch = minetest.get_meta(pos):get_string("channel") + minetest.set_node(pos, {name = "streets:bigpole", param2 = 2}) + -- Place new top + if fd == 1 then + minetest.set_node({x = pos.x - 1, y = pos.y, z = pos.z}, {name = "streets:trafficlight_top_warn", param2 = fd}) + local meta = minetest.get_meta({x = pos.x - 1, y = pos.y, z = pos.z}) + meta:set_string("channel", ch) + meta:set_string("state", "warn") + meta:set_string("formspec", "field[channel;Channel;${channel}]") + elseif fd == 2 then + minetest.set_node({x = pos.x, y = pos.y, z = pos.z + 1}, {name = "streets:trafficlight_top_warn", param2 = fd}) + local meta = minetest.get_meta({x = pos.x, y = pos.y, z = pos.z + 1}) + meta:set_string("channel", ch) + meta:set_string("state", "warn") + meta:set_string("formspec", "field[channel;Channel;${channel}]") + elseif fd == 3 then + minetest.set_node({x = pos.x + 1, y = pos.y, z = pos.z}, {name = "streets:trafficlight_top_warn", param2 = fd}) + local meta = minetest.get_meta({x = pos.x + 1, y = pos.y, z = pos.z}) + meta:set_string("channel", ch) + meta:set_string("state", "warn") + meta:set_string("formspec", "field[channel;Channel;${channel}]") + elseif fd == 0 then + minetest.set_node({x = pos.x, y = pos.y, z = pos.z - 1}, {name = "streets:trafficlight_top_warn", param2 = fd}) + local meta = minetest.get_meta({x = pos.x, y = pos.y, z = pos.z - 1}) + meta:set_string("channel", ch) + meta:set_string("state", "warn") + meta:set_string("formspec", "field[channel;Channel;${channel}]") + end + end +})
\ No newline at end of file diff --git a/trafficlight/textures/streets_tl_bg.png b/trafficlight/textures/streets_tl_bg.png Binary files differnew file mode 100644 index 0000000..e4213db --- /dev/null +++ b/trafficlight/textures/streets_tl_bg.png diff --git a/trafficlight/textures/streets_tl_flashred.png b/trafficlight/textures/streets_tl_flashred.png Binary files differnew file mode 100644 index 0000000..82c118c --- /dev/null +++ b/trafficlight/textures/streets_tl_flashred.png diff --git a/trafficlight/textures/streets_tl_green.png b/trafficlight/textures/streets_tl_green.png Binary files differnew file mode 100644 index 0000000..7d7ba80 --- /dev/null +++ b/trafficlight/textures/streets_tl_green.png diff --git a/trafficlight/textures/streets_tl_left_flashred.png b/trafficlight/textures/streets_tl_left_flashred.png Binary files differnew file mode 100644 index 0000000..eb1d432 --- /dev/null +++ b/trafficlight/textures/streets_tl_left_flashred.png diff --git a/trafficlight/textures/streets_tl_left_green.png b/trafficlight/textures/streets_tl_left_green.png Binary files differnew file mode 100644 index 0000000..cd0ae67 --- /dev/null +++ b/trafficlight/textures/streets_tl_left_green.png diff --git a/trafficlight/textures/streets_tl_left_off.png b/trafficlight/textures/streets_tl_left_off.png Binary files differnew file mode 100644 index 0000000..74c88de --- /dev/null +++ b/trafficlight/textures/streets_tl_left_off.png diff --git a/trafficlight/textures/streets_tl_left_red.png b/trafficlight/textures/streets_tl_left_red.png Binary files differnew file mode 100644 index 0000000..db0694c --- /dev/null +++ b/trafficlight/textures/streets_tl_left_red.png diff --git a/trafficlight/textures/streets_tl_left_warn.png b/trafficlight/textures/streets_tl_left_warn.png Binary files differnew file mode 100644 index 0000000..e910682 --- /dev/null +++ b/trafficlight/textures/streets_tl_left_warn.png diff --git a/trafficlight/textures/streets_tl_left_yellow.png b/trafficlight/textures/streets_tl_left_yellow.png Binary files differnew file mode 100644 index 0000000..5eeddbb --- /dev/null +++ b/trafficlight/textures/streets_tl_left_yellow.png diff --git a/trafficlight/textures/streets_tl_off.png b/trafficlight/textures/streets_tl_off.png Binary files differnew file mode 100644 index 0000000..fb7dfaa --- /dev/null +++ b/trafficlight/textures/streets_tl_off.png diff --git a/trafficlight/textures/streets_tl_red.png b/trafficlight/textures/streets_tl_red.png Binary files differnew file mode 100644 index 0000000..4560199 --- /dev/null +++ b/trafficlight/textures/streets_tl_red.png diff --git a/trafficlight/textures/streets_tl_right_flashred.png b/trafficlight/textures/streets_tl_right_flashred.png Binary files differnew file mode 100644 index 0000000..14d1e4a --- /dev/null +++ b/trafficlight/textures/streets_tl_right_flashred.png diff --git a/trafficlight/textures/streets_tl_right_green.png b/trafficlight/textures/streets_tl_right_green.png Binary files differnew file mode 100644 index 0000000..f51ea81 --- /dev/null +++ b/trafficlight/textures/streets_tl_right_green.png diff --git a/trafficlight/textures/streets_tl_right_off.png b/trafficlight/textures/streets_tl_right_off.png Binary files differnew file mode 100644 index 0000000..7f5c3e5 --- /dev/null +++ b/trafficlight/textures/streets_tl_right_off.png diff --git a/trafficlight/textures/streets_tl_right_red.png b/trafficlight/textures/streets_tl_right_red.png Binary files differnew file mode 100644 index 0000000..8c25220 --- /dev/null +++ b/trafficlight/textures/streets_tl_right_red.png diff --git a/trafficlight/textures/streets_tl_right_warn.png b/trafficlight/textures/streets_tl_right_warn.png Binary files differnew file mode 100644 index 0000000..9d60365 --- /dev/null +++ b/trafficlight/textures/streets_tl_right_warn.png diff --git a/trafficlight/textures/streets_tl_right_yellow.png b/trafficlight/textures/streets_tl_right_yellow.png Binary files differnew file mode 100644 index 0000000..c92724a --- /dev/null +++ b/trafficlight/textures/streets_tl_right_yellow.png diff --git a/trafficlight/textures/streets_tl_warn.png b/trafficlight/textures/streets_tl_warn.png Binary files differnew file mode 100644 index 0000000..349fa84 --- /dev/null +++ b/trafficlight/textures/streets_tl_warn.png diff --git a/trafficlight/textures/streets_tl_yellow.png b/trafficlight/textures/streets_tl_yellow.png Binary files differnew file mode 100644 index 0000000..42b4803 --- /dev/null +++ b/trafficlight/textures/streets_tl_yellow.png diff --git a/trafficlight/textures/streets_trafficlight_inv.png b/trafficlight/textures/streets_trafficlight_inv.png Binary files differnew file mode 100644 index 0000000..fb76b72 --- /dev/null +++ b/trafficlight/textures/streets_trafficlight_inv.png diff --git a/trafficlight/textures/streets_trafficlight_template.png b/trafficlight/textures/streets_trafficlight_template.png Binary files differnew file mode 100644 index 0000000..f987c9b --- /dev/null +++ b/trafficlight/textures/streets_trafficlight_template.png |