summaryrefslogtreecommitdiff
path: root/infrastructure
diff options
context:
space:
mode:
Diffstat (limited to 'infrastructure')
-rw-r--r--infrastructure/README14
-rw-r--r--infrastructure/advanced_aircraft_warning_light.lua55
-rw-r--r--infrastructure/advanced_automatic_warning_device.lua464
-rw-r--r--infrastructure/advanced_boom_barrier.lua508
-rw-r--r--infrastructure/advanced_crosswalk_lighting.lua85
-rw-r--r--infrastructure/advanced_crosswalk_safety_sign.lua85
-rw-r--r--infrastructure/advanced_crosswalk_warning_light.lua124
-rw-r--r--infrastructure/advanced_curve_chevron.lua85
-rw-r--r--infrastructure/advanced_emergency_phone.lua107
-rw-r--r--infrastructure/advanced_lane_control_lights.lua91
-rw-r--r--infrastructure/advanced_road_signs.lua237
-rw-r--r--infrastructure/advanced_traffic_lights_pedestrians.lua252
-rw-r--r--infrastructure/advanced_warning_light.lua47
-rw-r--r--infrastructure/crafts.lua443
-rw-r--r--infrastructure/depends.txt8
-rw-r--r--infrastructure/init.lua26
-rw-r--r--infrastructure/nodes.lua1473
-rw-r--r--infrastructure/nodes_extension.lua162
-rw-r--r--infrastructure/settings.lua49
-rw-r--r--infrastructure/sounds/infrastructure_automatic_warning_device.oggbin0 -> 90708 bytes
-rw-r--r--infrastructure/sounds/infrastructure_boom_barrier.oggbin0 -> 35717 bytes
-rw-r--r--infrastructure/sounds/infrastructure_ebell.oggbin0 -> 26398 bytes
-rw-r--r--infrastructure/sounds/infrastructure_emergency_phone.oggbin0 -> 18073 bytes
-rw-r--r--infrastructure/sounds/infrastructure_traffic_lights_1.oggbin0 -> 13500 bytes
-rw-r--r--infrastructure/sounds/infrastructure_traffic_lights_2.oggbin0 -> 15454 bytes
-rw-r--r--infrastructure/textures/infrastructure_aircraft_warning_light_side_anim.pngbin0 -> 550 bytes
-rw-r--r--infrastructure/textures/infrastructure_aircraft_warning_light_top_anim.pngbin0 -> 701 bytes
-rw-r--r--infrastructure/textures/infrastructure_anti_dazzling_panel_side.pngbin0 -> 960 bytes
-rw-r--r--infrastructure/textures/infrastructure_anti_dazzling_panel_top_bottom.pngbin0 -> 652 bytes
-rw-r--r--infrastructure/textures/infrastructure_asphalt.pngbin0 -> 731 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device.pngbin0 -> 8347 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_bottom.pngbin0 -> 450 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle.pngbin0 -> 1268 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_center_anim.pngbin0 -> 3429 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_center_off.pngbin0 -> 2259 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_center_side.pngbin0 -> 1048 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_left_anim.pngbin0 -> 795 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_left_off.pngbin0 -> 373 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_left_side.pngbin0 -> 389 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_right_anim.pngbin0 -> 822 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_right_off.pngbin0 -> 413 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_right_side.pngbin0 -> 362 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_middle_side.pngbin0 -> 603 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_top.pngbin0 -> 2818 bytes
-rw-r--r--infrastructure/textures/infrastructure_automatic_warning_device_top_side.pngbin0 -> 878 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_arm_h_anim_darkfirst.pngbin0 -> 762 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_arm_h_anim_lightfirst.pngbin0 -> 811 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_arm_h_bottom_front_back.pngbin0 -> 315 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_bright.pngbin0 -> 600 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_arm_h_top.pngbin0 -> 359 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_arm_v_left.pngbin0 -> 550 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_arm_v_right.pngbin0 -> 527 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_h_bottom.pngbin0 -> 558 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_h_front_back.pngbin0 -> 504 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_h_left.pngbin0 -> 566 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_h_right.pngbin0 -> 562 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_h_top.pngbin0 -> 549 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_v_bottom.pngbin0 -> 509 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_v_front_back.pngbin0 -> 573 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_v_left.pngbin0 -> 532 bytes
-rw-r--r--infrastructure/textures/infrastructure_boom_barrier_v_right.pngbin0 -> 540 bytes
-rw-r--r--infrastructure/textures/infrastructure_cable_barrier_terminal_back.pngbin0 -> 1217 bytes
-rw-r--r--infrastructure/textures/infrastructure_cable_barrier_terminal_front.pngbin0 -> 1224 bytes
-rw-r--r--infrastructure/textures/infrastructure_concrete.pngbin0 -> 732 bytes
-rw-r--r--infrastructure/textures/infrastructure_corrugated_guide_rail_back.pngbin0 -> 1142 bytes
-rw-r--r--infrastructure/textures/infrastructure_corrugated_guide_rail_front.pngbin0 -> 1135 bytes
-rw-r--r--infrastructure/textures/infrastructure_corrugated_guide_rail_side.pngbin0 -> 1108 bytes
-rw-r--r--infrastructure/textures/infrastructure_corrugated_sheet.pngbin0 -> 1166 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_lighting_back.pngbin0 -> 1019 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_lighting_bottom.pngbin0 -> 749 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_lighting_front.pngbin0 -> 1025 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_safety_sign.pngbin0 -> 703 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_front_back.pngbin0 -> 498 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_side.pngbin0 -> 348 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_safety_sign_top.pngbin0 -> 479 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_safety_sign_top_front_back.pngbin0 -> 343 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_safety_sign_top_side.pngbin0 -> 199 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_warning_light_back.pngbin0 -> 460 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_warning_light_front_anim.pngbin0 -> 1343 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_warning_light_front_bright.pngbin0 -> 1021 bytes
-rw-r--r--infrastructure/textures/infrastructure_crosswalk_warning_light_front_dark.pngbin0 -> 606 bytes
-rw-r--r--infrastructure/textures/infrastructure_crowd_control_barricade_back.pngbin0 -> 1050 bytes
-rw-r--r--infrastructure/textures/infrastructure_crowd_control_barricade_front.pngbin0 -> 1078 bytes
-rw-r--r--infrastructure/textures/infrastructure_curve_chevron_left_bright.pngbin0 -> 960 bytes
-rw-r--r--infrastructure/textures/infrastructure_curve_chevron_left_dark.pngbin0 -> 382 bytes
-rw-r--r--infrastructure/textures/infrastructure_curve_chevron_right_bright.pngbin0 -> 988 bytes
-rw-r--r--infrastructure/textures/infrastructure_curve_chevron_right_dark.pngbin0 -> 387 bytes
-rw-r--r--infrastructure/textures/infrastructure_delineator_retroreflector_red.pngbin0 -> 736 bytes
-rw-r--r--infrastructure/textures/infrastructure_delineator_retroreflector_yellow.pngbin0 -> 792 bytes
-rw-r--r--infrastructure/textures/infrastructure_delineator_wrapper_left.pngbin0 -> 707 bytes
-rw-r--r--infrastructure/textures/infrastructure_delineator_wrapper_right.pngbin0 -> 713 bytes
-rw-r--r--infrastructure/textures/infrastructure_drainage_channel_grating.pngbin0 -> 1628 bytes
-rw-r--r--infrastructure/textures/infrastructure_emergency_phone_bottom.pngbin0 -> 544 bytes
-rw-r--r--infrastructure/textures/infrastructure_emergency_phone_front.pngbin0 -> 802 bytes
-rw-r--r--infrastructure/textures/infrastructure_emergency_phone_side.pngbin0 -> 768 bytes
-rw-r--r--infrastructure/textures/infrastructure_emergency_phone_top.pngbin0 -> 689 bytes
-rw-r--r--infrastructure/textures/infrastructure_energy_absorbing_terminal_back.pngbin0 -> 1160 bytes
-rw-r--r--infrastructure/textures/infrastructure_energy_absorbing_terminal_front.pngbin0 -> 865 bytes
-rw-r--r--infrastructure/textures/infrastructure_fitch_barrel_bottom.pngbin0 -> 713 bytes
-rw-r--r--infrastructure/textures/infrastructure_fitch_barrel_side.pngbin0 -> 979 bytes
-rw-r--r--infrastructure/textures/infrastructure_fitch_barrel_top.pngbin0 -> 625 bytes
-rw-r--r--infrastructure/textures/infrastructure_galvanized_steel.pngbin0 -> 1067 bytes
-rw-r--r--infrastructure/textures/infrastructure_grid_paver_bottom.pngbin0 -> 1093 bytes
-rw-r--r--infrastructure/textures/infrastructure_grid_paver_grass.pngbin0 -> 443 bytes
-rw-r--r--infrastructure/textures/infrastructure_grid_paver_top.pngbin0 -> 1597 bytes
-rw-r--r--infrastructure/textures/infrastructure_lane_control_lights_1.pngbin0 -> 1905 bytes
-rw-r--r--infrastructure/textures/infrastructure_lane_control_lights_2.pngbin0 -> 4010 bytes
-rw-r--r--infrastructure/textures/infrastructure_lane_control_lights_3.pngbin0 -> 4148 bytes
-rw-r--r--infrastructure/textures/infrastructure_lane_control_lights_4.pngbin0 -> 4159 bytes
-rw-r--r--infrastructure/textures/infrastructure_lane_control_lights_5.pngbin0 -> 4119 bytes
-rw-r--r--infrastructure/textures/infrastructure_lane_control_lights_6.pngbin0 -> 4160 bytes
-rw-r--r--infrastructure/textures/infrastructure_manhole_cover_side.pngbin0 -> 700 bytes
-rw-r--r--infrastructure/textures/infrastructure_manhole_cover_top_bottom.pngbin0 -> 670 bytes
-rw-r--r--infrastructure/textures/infrastructure_marker_bottom_side.pngbin0 -> 153 bytes
-rw-r--r--infrastructure/textures/infrastructure_marker_side_red.pngbin0 -> 180 bytes
-rw-r--r--infrastructure/textures/infrastructure_marker_side_yellow.pngbin0 -> 183 bytes
-rw-r--r--infrastructure/textures/infrastructure_marker_top_red_yellow.pngbin0 -> 198 bytes
-rw-r--r--infrastructure/textures/infrastructure_marker_top_yellow_yellow.pngbin0 -> 182 bytes
-rw-r--r--infrastructure/textures/infrastructure_noise_barrier.pngbin0 -> 1524 bytes
-rw-r--r--infrastructure/textures/infrastructure_razor_wire.pngbin0 -> 926 bytes
-rw-r--r--infrastructure/textures/infrastructure_riffled_sheet.pngbin0 -> 2145 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_crosswalk_back.pngbin0 -> 604 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_crosswalk_front.pngbin0 -> 1158 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_retroreflective_surface.pngbin0 -> 175 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_right_of_way_back.pngbin0 -> 664 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_right_of_way_front.pngbin0 -> 820 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_stop_back.pngbin0 -> 693 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_stop_front.pngbin0 -> 1208 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_yield_back.pngbin0 -> 575 bytes
-rw-r--r--infrastructure/textures/infrastructure_road_sign_yield_front.pngbin0 -> 742 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_cone_bottom.pngbin0 -> 752 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_cone_side.pngbin0 -> 371 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_cone_top.pngbin0 -> 609 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians.pngbin0 -> 1899 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_back.pngbin0 -> 495 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_1.pngbin0 -> 798 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_2.pngbin0 -> 798 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_3.pngbin0 -> 999 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_4.pngbin0 -> 999 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_back.pngbin0 -> 459 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_1.pngbin0 -> 938 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_2.pngbin0 -> 938 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_3.pngbin0 -> 693 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_4.pngbin0 -> 693 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_side.pngbin0 -> 568 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles.pngbin0 -> 3062 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_1.pngbin0 -> 851 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_2.pngbin0 -> 1264 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_3.pngbin0 -> 1518 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_4.pngbin0 -> 1264 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles_top_1.pngbin0 -> 1382 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles_top_2.pngbin0 -> 1612 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles_top_3.pngbin0 -> 817 bytes
-rw-r--r--infrastructure/textures/infrastructure_traffic_lights_vehicles_top_4.pngbin0 -> 1159 bytes
-rw-r--r--infrastructure/textures/infrastructure_truss.pngbin0 -> 1328 bytes
-rw-r--r--infrastructure/textures/infrastructure_warning_light_back.pngbin0 -> 481 bytes
-rw-r--r--infrastructure/textures/infrastructure_warning_light_bottom.pngbin0 -> 269 bytes
-rw-r--r--infrastructure/textures/infrastructure_warning_light_front_anim.pngbin0 -> 1219 bytes
-rw-r--r--infrastructure/textures/infrastructure_warning_light_left.pngbin0 -> 247 bytes
-rw-r--r--infrastructure/textures/infrastructure_warning_light_right.pngbin0 -> 236 bytes
-rw-r--r--infrastructure/textures/infrastructure_warning_light_top.pngbin0 -> 250 bytes
-rw-r--r--infrastructure/textures/infrastructure_wire_netting.pngbin0 -> 1030 bytes
-rw-r--r--infrastructure/textures/infrastructure_wire_rope_safety_barrier_back.pngbin0 -> 1134 bytes
-rw-r--r--infrastructure/textures/infrastructure_wire_rope_safety_barrier_front.pngbin0 -> 1146 bytes
164 files changed, 4315 insertions, 0 deletions
diff --git a/infrastructure/README b/infrastructure/README
new file mode 100644
index 0000000..feb88a1
--- /dev/null
+++ b/infrastructure/README
@@ -0,0 +1,14 @@
+This is my fork of the infrastructure mod. It's essentially aimed at servers running webdesigner97's streetsmod that want stuff from infrastructure too (dreambuilder_game in particular), and is intended to add on to streetsmod instead of replacing it.
+
+Originally based on Streets by webdesigner97
+Modified by Ragnarok/Vibender
+Modified again by cheapie
+
+Depends: default, moreblocks, mesecons, technic, streetsmod
+
+Licenses:
+ Code: WTFPL
+ Line textures: WTFPL
+ Other Textures: CC BY-SA 3.0 Unported, http://creativecommons.org/licenses/by-sa/3.0/
+ Sounds: CC BY-SA 3.0 Unported, http://creativecommons.org/licenses/by-sa/3.0/
+
diff --git a/infrastructure/advanced_aircraft_warning_light.lua b/infrastructure/advanced_aircraft_warning_light.lua
new file mode 100644
index 0000000..1361f7b
--- /dev/null
+++ b/infrastructure/advanced_aircraft_warning_light.lua
@@ -0,0 +1,55 @@
+-- Aircraft warning light
+minetest.register_node("infrastructure:aircraft_warning_light", {
+ description = "Aircraft warning light",
+ tiles = {
+ {name="infrastructure_aircraft_warning_light_top_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=4}},
+ "infrastructure_traffic_lights_side.png",
+ {name="infrastructure_aircraft_warning_light_side_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=4}},
+ {name="infrastructure_aircraft_warning_light_side_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=4}},
+ {name="infrastructure_aircraft_warning_light_side_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=4}},
+ {name="infrastructure_aircraft_warning_light_side_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=4}}
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ groups = {cracky = 1},
+ light_source = AIRCRAFT_WARNING_LIGHT_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/128, 1/4, -1/128, 1/128, 3/8, 1/128},
+
+ {-1/4, -1/8, 0, 1/4, 1/4, 0},
+ {0, -1/8, -1/4, 0, 1/4, 1/4},
+
+ {-1/16, -1/8, -1/16, 1/16, 1/16, 1/16},
+
+ {-1/4, -1/4, -1/8, 1/4, -1/8, 1/8},
+ {-1/8, -1/4, -1/4, 1/8, -1/8, 1/4},
+
+ {-1/8, -3/8, -1/8, 1/8, -1/4, 1/8},
+
+ {-3/16, -1/2, -3/16, 3/16, -3/8, 3/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/128, 1/4, -1/128, 1/128, 3/8, 1/128},
+
+ {-1/4, -1/8, 0, 1/4, 1/4, 0},
+ {0, -1/8, -1/4, 0, 1/4, 1/4},
+
+ {-1/16, -1/8, -1/16, 1/16, 1/16, 1/16},
+
+ {-1/4, -1/4, -1/8, 1/4, -1/8, 1/8},
+ {-1/8, -1/4, -1/4, 1/8, -1/8, 1/4},
+
+ {-1/8, -3/8, -1/8, 1/8, -1/4, 1/8},
+
+ {-3/16, -1/2, -3/16, 3/16, -3/8, 3/16}
+ }
+ }
+})
+
+minetest.register_alias("infrastructure:aircraft_warning_light_bright", "infrastructure:aircraft_warning_light")
+minetest.register_alias("infrastructure:aircraft_warning_light_dark", "infrastructure:aircraft_warning_light")
diff --git a/infrastructure/advanced_automatic_warning_device.lua b/infrastructure/advanced_automatic_warning_device.lua
new file mode 100644
index 0000000..b938c07
--- /dev/null
+++ b/infrastructure/advanced_automatic_warning_device.lua
@@ -0,0 +1,464 @@
+-- Automatic warning device
+
+infrastructure.sound_handles = {}
+
+function infrastructure.play_bell(pos)
+ local pos_hash = minetest.hash_node_position(pos)
+ if not infrastructure.sound_handles[pos_hash] then
+ infrastructure.sound_handles[pos_hash] = minetest.sound_play("infrastructure_ebell",
+ {pos = pos, gain = AUTOMATIC_WARNING_DEVICE_VOLUME, loop = true, max_hear_distance = 30,})
+ end
+end
+
+function infrastructure.stop_bell(pos)
+ local pos_hash = minetest.hash_node_position(pos)
+ local sound_handle = infrastructure.sound_handles[pos_hash]
+ if sound_handle then
+ minetest.sound_stop(sound_handle)
+ infrastructure.sound_handles[pos_hash] = nil
+ end
+end
+function infrastructure.left_light_direction(pos, param2)
+ if param2 == 0 then
+ pos.x = pos.x - 1
+ elseif param2 == 1 then
+ pos.z = pos.z + 1
+ elseif param2 == 2 then
+ pos.x = pos.x + 1
+ elseif param2 == 3 then
+ pos.z = pos.z - 1
+ end
+end
+
+function infrastructure.right_light_direction(pos, param2)
+ if param2 == 0 then
+ pos.x = pos.x + 2
+ elseif param2 == 1 then
+ pos.z = pos.z - 2
+ elseif param2 == 2 then
+ pos.x = pos.x - 2
+ elseif param2 == 3 then
+ pos.z = pos.z + 2
+ end
+end
+
+function infrastructure.lights_enabled(pos)
+ local node = minetest.get_node(pos)
+ local param2 = node.param2
+ minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_center_on", param2 = node.param2})
+ infrastructure.left_light_direction(pos, param2)
+ minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_left_on", param2 = node.param2})
+ infrastructure.right_light_direction(pos, param2)
+ minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_right_on", param2 = node.param2})
+end
+
+function infrastructure.lights_disabled(pos)
+ local node = minetest.get_node(pos)
+ local param2 = node.param2
+ minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_center_off", param2 = node.param2})
+ infrastructure.left_light_direction(pos, param2)
+ minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_left_off", param2 = node.param2})
+ infrastructure.right_light_direction(pos, param2)
+ minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_right_off", param2 = node.param2})
+end
+
+function infrastructure.activate_lights(pos)
+ pos.y = pos.y + 2
+ local node = minetest.get_node(pos)
+ if node.name == "infrastructure:automatic_warning_device_middle_center_off" then
+ infrastructure.play_bell(pos)
+ infrastructure.lights_enabled(pos)
+ elseif (node.name == "infrastructure:automatic_warning_device_middle_center_on") then
+ infrastructure.stop_bell(pos,node)
+ infrastructure.lights_disabled(pos, node)
+ end
+end
+
+minetest.register_node("infrastructure:automatic_warning_device_top", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_top_side.png",
+ "infrastructure_automatic_warning_device_top_side.png",
+ "infrastructure_automatic_warning_device_top_side.png",
+ "infrastructure_automatic_warning_device_top.png"
+ },
+ on_destruct = stop_bell,
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/16, -1/2, -1/16, 1/16, 0, 1/16},
+ {-1/8, 0, -1/8, 1/8, 3/8, 1/8},
+ {-1/4, 1/8, -1/4, 1/4, 1/4, 1/4},
+ {-1/2, -1/2, -1/16, 1/2, 0, -1/16},
+ {-1/8, -1/2, -1/16, 1/8, -1/4, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+})
+
+minetest.register_node("infrastructure:automatic_warning_device_middle_right_on", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_middle_right_side.png",
+ {name="infrastructure_automatic_warning_device_middle_right_anim.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}}
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ light_source = AUTOMATIC_WARNING_DEVICE_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, -1/16, -1/4, 1/2, -1/16},
+ {-1/2, -5/16, -1/16, -7/16, 1/16, 3/16},
+ {-1/2, 1/32, -5/16, -15/32, 3/32, -1/16},
+ {-15/32, -1/8, -3/16, -13/32, 1/32, -1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+})
+
+minetest.register_node("infrastructure:automatic_warning_device_middle_right_off", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_middle_right_side.png",
+ "infrastructure_automatic_warning_device_middle_right_off.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, -1/16, -1/4, 1/2, -1/16},
+ {-1/2, -5/16, -1/16, -7/16, 1/16, 3/16},
+ {-1/2, 1/32, -5/16, -15/32, 3/32, -1/16},
+ {-15/32, -1/8, -3/16, -13/32, 1/32, -1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+})
+
+minetest.register_node("infrastructure:automatic_warning_device_middle_left_on", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_middle_left_side.png",
+ {name="infrastructure_automatic_warning_device_middle_left_anim.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}}
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ light_source = AUTOMATIC_WARNING_DEVICE_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {1/4, -1/2, -1/16, 1/2, 1/2, -1/16},
+ {7/16, -5/16, -1/16, 1/2, 1/16, 3/16},
+ {15/32, 1/32, -5/16, 1/2, 3/32, -1/16},
+ {13/32, -1/8, -3/16, 15/32, 1/32, -1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+})
+
+minetest.register_node("infrastructure:automatic_warning_device_middle_left_off", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_middle_left_side.png",
+ "infrastructure_automatic_warning_device_middle_left_off.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {1/4, -1/2, -1/16, 1/2, 1/2, -1/16},
+ {7/16, -5/16, -1/16, 1/2, 1/16, 3/16},
+ {15/32, 1/32, -5/16, 1/2, 3/32, -1/16},
+ {13/32, -1/8, -3/16, 15/32, 1/32, -1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+})
+
+minetest.register_node("infrastructure:automatic_warning_device_middle_center_on", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_middle_center_side.png",
+ "infrastructure_automatic_warning_device_middle_center_side.png",
+ "infrastructure_automatic_warning_device_middle_center_side.png",
+ {name="infrastructure_automatic_warning_device_middle_center_anim.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}}
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ light_source = LIGHT_SOURCE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+ {-1/2, -1/2, -1/16, 1/2, 1/2, -1/16},
+ {-1/2, -5/16, -1/16, -3/16, 1/16, 3/16},
+ {3/16, -5/16, -1/16, 1/2, 1/16, 3/16},
+ {-3/16, -3/16, -1/16, 3/16, -1/16, 1/8},
+ {-1/2, 1/32, -5/16, -7/32, 3/32, -1/16},
+ {-7/32, -1/8, -3/16, -5/32, 1/32, -1/16},
+ {7/32, 1/32, -5/16, 1/2, 3/32, -1/16},
+ {5/32, -1/8, -3/16, 7/32, 1/32, -1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+})
+
+
+minetest.register_node("infrastructure:automatic_warning_device_middle_center_off", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_middle_center_side.png",
+ "infrastructure_automatic_warning_device_middle_center_side.png",
+ "infrastructure_automatic_warning_device_middle_center_side.png",
+ "infrastructure_automatic_warning_device_middle_center_off.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ light_source = LIGHT_SOURCE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+ {-1/2, -1/2, -1/16, 1/2, 1/2, -1/16},
+ {-1/2, -5/16, -1/16, -3/16, 1/16, 3/16},
+ {3/16, -5/16, -1/16, 1/2, 1/16, 3/16},
+ {-3/16, -3/16, -1/16, 3/16, -1/16, 1/8},
+ {-1/2, 1/32, -5/16, -7/32, 3/32, -1/16},
+ {-7/32, -1/8, -3/16, -5/32, 1/32, -1/16},
+ {7/32, 1/32, -5/16, 1/2, 3/32, -1/16},
+ {5/32, -1/8, -3/16, 7/32, 1/32, -1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+})
+
+
+minetest.register_node("infrastructure:automatic_warning_device_middle", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_middle_side.png",
+ "infrastructure_automatic_warning_device_middle_side.png",
+ "infrastructure_automatic_warning_device_middle_side.png",
+ "infrastructure_automatic_warning_device_middle.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+ {-3/8, -3/8, -1/8, 3/8, 3/8, -1/16},
+ {-1/8, -1/8, -1/16, 1/8, 1/8, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+})
+
+minetest.register_node("infrastructure:automatic_warning_device_bottom", {
+ description = "Automatic warning device",
+ inventory_image = "infrastructure_automatic_warning_device.png",
+ wield_image = "infrastructure_automatic_warning_device.png",
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_bottom.png",
+ "infrastructure_automatic_warning_device_bottom.png",
+ "infrastructure_automatic_warning_device_bottom.png",
+ "infrastructure_automatic_warning_device_bottom.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/16, 0, -1/16, 1/16, 1/2, 1/16},
+ {-1/2, -1/2, -1/4, 1/2, -3/8, 1/4},
+ {-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+ {-1/8, -3/8, -1/8, 1/8, 0, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ -- top
+ {-1/8, 0 + 3, -1/8, 1/8, 3/8 + 3, 1/8},
+ {-1/4, 1/8 + 3, -1/4, 1/4, 1/4 + 3, 1/4},
+ {-1/8, -1/2 + 3, -1/16 + 0.01, 1/8, -1/4 + 3, 1/8},
+ -- middle center, left and right
+ {-9/16, -5/16 + 2, -1/16, -3/16, 1/16 + 2, 3/16},
+ {3/16, -5/16 + 2, -1/16, 9/16, 1/16 + 2, 3/16},
+
+ {-3/16, -3/16 + 2, -1/16 + 0.01, 3/16, -1/16 + 2, 1/8},
+
+ {-1/2, 1/32 + 2, -5/16, -7/32, 3/32 + 2, -1/16 - 0.01},
+ {-7/32, -1/8 + 2, -3/16, -5/32, 1/32 + 2, -1/16 - 0.01},
+ {13/32 - 1, -1/8 + 2, -3/16, 15/32 - 1, 1/32 + 2, -1/16 - 0.01},
+
+ {7/32, 1/32 + 2, -5/16, 1/2, 3/32 + 2, -1/16 - 0.01},
+ {5/32, -1/8 + 2, -3/16, 7/32, 1/32 + 2, -1/16 - 0.01},
+ {-15/32 + 1, -1/8 + 2, -3/16, -13/32 + 1, 1/32 + 2, -1/16 - 0.01},
+ -- middle
+ {-3/8, -3/8 + 1, -1/8, 3/8, 3/8 + 1, -1/16},
+ {-1/8, -1/8 + 1, -1/16, 1/8, 1/8 + 1, 1/8},
+ -- bottom
+ {-1/2, -1/2, -1/4, 1/2, -3/8, 1/4},
+ {-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+ {-1/8, -3/8, -1/8, 1/8, 0, 1/8},
+ -- post
+ {-1/16, 0, -1/16, 1/16, 3, 1/16}
+ }
+ },
+
+ on_construct = function(pos)
+ local node = minetest.get_node(pos)
+ local param2 = node.param2
+
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec", "field[channel;Channel;${channel}]")
+
+ pos.y = pos.y + 1
+ node.name = "infrastructure:automatic_warning_device_middle"
+ minetest.set_node(pos, node)
+
+ pos.y = pos.y + 2
+ node.name = "infrastructure:automatic_warning_device_top"
+ minetest.set_node(pos, node)
+
+ pos.y = pos.y - 1
+ node.name = "infrastructure:automatic_warning_device_middle_center_1"
+ minetest.set_node(pos, node)
+
+ infrastructure.left_light_direction(pos, param2)
+ node.name = "infrastructure:automatic_warning_device_middle_left_1"
+ minetest.set_node(pos, node)
+
+ infrastructure.right_light_direction(pos, param2)
+ node.name = "infrastructure:automatic_warning_device_middle_right_1"
+ minetest.set_node(pos, node)
+ end,
+
+ on_destruct = function(pos)
+ local node = minetest.get_node(pos)
+ local param2 = node.param2
+ pos.y=pos.y+2
+ infrastructure.stop_bell(pos, node)
+ pos.y=pos.y-2
+
+ for i = 1, 3 do
+ pos.y = pos.y + 1
+ minetest.remove_node(pos)
+ end
+
+ pos.y = pos.y - 1
+
+ infrastructure.left_light_direction(pos, param2)
+ minetest.remove_node(pos)
+
+ infrastructure.right_light_direction(pos, param2)
+ minetest.remove_node(pos)
+ end,
+
+ on_punch = function(pos, node)
+ infrastructure.activate_lights(pos, node)
+ 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,
+
+ digiline = {
+ receptor = {},
+ effector = {
+ action = function(pos, node, channel, msg)
+ local setchan = minetest.get_meta(pos):get_string("channel")
+ if setchan ~= channel then
+ return
+ end
+ if (msg=="bell_on") then
+ infrastructure.play_bell(pos)
+ elseif (msg=="bell_off") then
+ infrastructure.stop_bell(pos)
+ elseif (msg=="lights_on") then
+ pos.y = pos.y+2
+ infrastructure.lights_enabled(pos)
+ elseif (msg=="lights_off") then
+ pos.y = pos.y+2
+ infrastructure.lights_disabled(pos)
+ end
+ end
+ }
+ }
+})
+
+
+
+
+minetest.register_alias("infrastructure:automatic_warning_device", "infrastructure:automatic_warning_device_bottom")
+minetest.register_alias("awd", "infrastructure:automatic_warning_device_bottom")
+minetest.register_alias("infrastructure:automatic_warning_device_middle_left_1","infrastructure:automatic_warning_device_middle_left_off")
+minetest.register_alias("infrastructure:automatic_warning_device_middle_left_2","infrastructure:automatic_warning_device_middle_left_off")
+minetest.register_alias("infrastructure:automatic_warning_device_middle_right_1","infrastructure:automatic_warning_device_middle_right_off")
+minetest.register_alias("infrastructure:automatic_warning_device_middle_right_2","infrastructure:automatic_warning_device_middle_right_off")
+minetest.register_alias("infrastructure:automatic_warning_device_middle_center_1","infrastructure:automatic_warning_device_middle_center_off")
+minetest.register_alias("infrastructure:automatic_warning_device_middle_center_2","infrastructure:automatic_warning_device_middle_center_off")
+minetest.register_alias("infrastructure:automatic_warning_device_middle_center_3","infrastructure:automatic_warning_device_middle_center_off")
diff --git a/infrastructure/advanced_boom_barrier.lua b/infrastructure/advanced_boom_barrier.lua
new file mode 100644
index 0000000..67a9b8b
--- /dev/null
+++ b/infrastructure/advanced_boom_barrier.lua
@@ -0,0 +1,508 @@
+-- Boom barrier
+function move_arm(pos, node)
+ local node = minetest.env:get_node(pos)
+ local param2 = node.param2
+
+ if param2 == 0 then
+ dir = "z-"
+ elseif param2 == 1 then
+ dir = "x-"
+ elseif param2 == 2 then
+ dir = "z+"
+ elseif param2 == 3 then
+ dir = "x+"
+ end
+
+ minetest.sound_play("infrastructure_boom_barrier", {
+ pos = pos,
+ gain = BOOM_BARRIER_VOLUME,
+ max_hear_distance = 50
+ })
+
+ if node.name == "infrastructure:boom_barrier_top_h" then
+ minetest.swap_node(pos, {name = "infrastructure:boom_barrier_top_v", param2 = node.param2})
+
+ if dir == "x+" then
+ for i = 1, 10 do
+ pos.x = pos.x + 1
+ if (string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_lightfirst")
+ or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_end")
+ or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_darkfirst")) == nil then
+ pos.x = pos.x - 1
+ break
+ end
+ minetest.env:remove_node(pos)
+ node.name = "infrastructure:boom_barrier_arm_v"
+ minetest.env:add_node({x=pos.x-i, y=pos.y+i, z=pos.z}, node)
+ end
+ elseif dir == "x-" then
+ for i = 1, 10 do
+ pos.x = pos.x - 1
+ if (string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_lightfirst")
+ or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_end")
+ or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_darkfirst")) == nil then
+ break
+ end
+ minetest.env:remove_node(pos)
+ node.name = "infrastructure:boom_barrier_arm_v"
+ minetest.env:add_node({x=pos.x+i, y=pos.y+i, z=pos.z}, node)
+ end
+ elseif dir == "z+" then
+ for i = 1, 10 do
+ pos.z = pos.z + 1
+ if (string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_lightfirst")
+ or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_end")
+ or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_darkfirst")) == nil then
+ break
+ end
+ minetest.env:remove_node(pos)
+ node.name = "infrastructure:boom_barrier_arm_v"
+ minetest.env:add_node({x=pos.x, y=pos.y+i, z=pos.z-i}, node)
+ end
+ elseif dir == "z-" then
+ for i = 1, 10 do
+ pos.z = pos.z - 1
+ if (string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_lightfirst")
+ or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_end")
+ or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_darkfirst")) == nil then
+ break
+ end
+ minetest.env:remove_node(pos)
+ node.name = "infrastructure:boom_barrier_arm_v"
+ minetest.env:add_node({x=pos.x, y=pos.y+i, z=pos.z+i}, node)
+ end
+ end
+
+ elseif node.name == "infrastructure:boom_barrier_top_v" then
+ minetest.swap_node(pos, {name = "infrastructure:boom_barrier_top_h", param2 = node.param2})
+ if dir == "x+" then
+ for i = 1, 10 do
+ pos.y = pos.y + 1
+ if string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_v") == nil then
+ break
+ end
+ minetest.env:remove_node(pos)
+ if i % 2 == 1 then
+ node.name = "infrastructure:boom_barrier_arm_h_lightfirst"
+ else
+ node.name = "infrastructure:boom_barrier_arm_h_darkfirst"
+ end
+ if minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name ~= "infrastructure:boom_barrier_arm_v" then
+ node.name = "infrastructure:boom_barrier_arm_h_end"
+ end
+ minetest.env:add_node({x=pos.x+i, y=pos.y-i, z=pos.z}, node)
+ end
+ elseif dir == "x-" then
+ for i = 1, 10 do
+ pos.y = pos.y + 1
+ if string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_v") == nil then
+ break
+ end
+ minetest.env:remove_node(pos)
+ if i % 2 == 1 then
+ node.name = "infrastructure:boom_barrier_arm_h_lightfirst"
+ else
+ node.name = "infrastructure:boom_barrier_arm_h_darkfirst"
+ end
+ if minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name ~= "infrastructure:boom_barrier_arm_v" then
+ node.name = "infrastructure:boom_barrier_arm_h_end"
+ end
+ minetest.env:add_node({x=pos.x-i, y=pos.y-i, z=pos.z}, node)
+ end
+ elseif dir == "z+" then
+ for i = 1, 10 do
+ pos.y = pos.y + 1
+ if string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_v") == nil then
+ break
+ end
+ minetest.env:remove_node(pos)
+ if i % 2 == 1 then
+ node.name = "infrastructure:boom_barrier_arm_h_lightfirst"
+ else
+ node.name = "infrastructure:boom_barrier_arm_h_darkfirst"
+ end
+ if minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name ~= "infrastructure:boom_barrier_arm_v" then
+ node.name = "infrastructure:boom_barrier_arm_h_end"
+ end
+ minetest.env:add_node({x=pos.x, y=pos.y-i, z=pos.z+i}, node)
+ end
+ elseif dir == "z-" then
+ for i = 1, 10 do
+ pos.y = pos.y + 1
+ if string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_v") == nil then
+ break
+ end
+ minetest.env:remove_node(pos)
+ if i % 2 == 1 then
+ node.name = "infrastructure:boom_barrier_arm_h_lightfirst"
+ else
+ node.name = "infrastructure:boom_barrier_arm_h_darkfirst"
+ end
+ if minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name ~= "infrastructure:boom_barrier_arm_v" then
+ node.name = "infrastructure:boom_barrier_arm_h_end"
+ end
+ minetest.env:add_node({x=pos.x, y=pos.y-i, z=pos.z-i}, node)
+ end
+ end
+ end
+end
+
+minetest.register_node("infrastructure:boom_barrier_top_h", {
+ description = "Boom barrier mechanism",
+ tiles = {
+ "infrastructure_boom_barrier_h_top.png",
+ "infrastructure_boom_barrier_h_bottom.png",
+ "infrastructure_boom_barrier_h_right.png",
+ "infrastructure_boom_barrier_h_left.png",
+ "infrastructure_boom_barrier_h_front_back.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
+ {-1/8, -1/2, -1/8, 1/8, -1/4, 1/8},
+
+ {-3/8, -1/2, -1/2, -1/4, -1/4, 1/8},
+ {-3/8, -1/2, -1/8, -1/4, 1/8, 1/8},
+ {-3/8, -1/8, -1/8, -1/4, 1/8, 1/2},
+ {-1/2, -3/16, 1/4, -3/8, 3/16, 1/2},
+ {-1/2, -1/8, 3/16, -3/8, 1/8, 1/2},
+ {-1/2, -1/16, 1/8, -3/8, 1/16, 1/2},
+
+ {1/4, -1/2, -1/2, 3/8, -1/4, 1/8},
+ {1/4, -1/2, -1/8, 3/8, 1/8, 1/8},
+ {1/4, -1/8, -1/8, 3/8, 1/8, 1/2},
+ {3/8, -3/16, 1/4, 1/2, 3/16, 1/2},
+ {3/8, -1/8, 3/16, 1/2, 1/8, 1/2},
+ {3/8, -1/16, 1/8, 1/2, 1/16, 1/2},
+
+ {-3/8, -1/2, -1/2, 3/8, -1/4, -3/8},
+
+ {-7/16, -1/16, -1/16, 7/16, 1/16, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
+ {-1/8, -1/2, -1/8, 1/8, -1/4, 1/8},
+
+ {-3/8, -1/2, -1/2, -1/4, -1/4, 1/8},
+ {-3/8, -1/2, -1/8, -1/4, 1/8, 1/8},
+ {-3/8, -1/8, -1/8, -1/4, 1/8, 1/2},
+ {-1/2, -3/16, 1/4, -3/8, 3/16, 1/2},
+ {-1/2, -1/8, 3/16, -3/8, 1/8, 1/2},
+ {-1/2, -1/16, 1/8, -3/8, 1/16, 1/2},
+
+ {1/4, -1/2, -1/2, 3/8, -1/4, 1/8},
+ {1/4, -1/2, -1/8, 3/8, 1/8, 1/8},
+ {1/4, -1/8, -1/8, 3/8, 1/8, 1/2},
+ {3/8, -3/16, 1/4, 1/2, 3/16, 1/2},
+ {3/8, -1/8, 3/16, 1/2, 1/8, 1/2},
+ {3/8, -1/16, 1/8, 1/2, 1/16, 1/2},
+
+ {-3/8, -1/2, -1/2, 3/8, -1/4, -3/8},
+
+ {-7/16, -1/16, -1/16, 7/16, 1/16, 1/16}
+ }
+ },
+
+ after_place_node = function(pos)
+ local node = minetest.env:get_node(pos)
+ node.name = "infrastructure:boom_barrier_bottom"
+ minetest.env:add_node(pos, node)
+ pos.y = pos.y + 1
+ node.name = "infrastructure:boom_barrier_top_h"
+ minetest.env:add_node(pos, node)
+ end,
+
+ after_dig_node = function(pos)
+ pos.y = pos.y - 1
+ minetest.env:remove_node(pos)
+ end,
+
+ on_punch = function(pos, node)
+ move_arm(pos, node)
+ end
+})
+
+minetest.register_node("infrastructure:boom_barrier_top_v", {
+ tiles = {
+ "infrastructure_boom_barrier_h_front_back.png",
+ "infrastructure_boom_barrier_v_bottom.png",
+ "infrastructure_boom_barrier_v_right.png",
+ "infrastructure_boom_barrier_v_left.png",
+ "infrastructure_boom_barrier_v_front_back.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ drop = "infrastructure:boom_barrier_top_h",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
+ {-1/8, -1/2, -1/8, 1/8, -1/4, 1/8},
+
+ {-3/8, -1/8, -1/2, -1/4, 1/2, -1/4},
+ {-3/8, -1/8, -1/2, -1/4, 1/8, 1/8},
+ {-3/8, -1/2, -1/8, -1/4, 1/8, 1/8},
+ {-1/2, -1/2, -3/16, -3/8, -1/4, 3/16},
+ {-1/2, -1/2, -1/8, -3/8, -3/16, 1/8},
+ {-1/2, -1/2, -1/16, -3/8, -1/8, 1/16},
+
+ {1/4, -1/8, -1/2, 3/8, 1/2, -1/4},
+ {1/4, -1/8, -1/2, 3/8, 1/8, 1/8},
+ {1/4, -1/2, -1/8, 3/8, 1/8, 1/8},
+ {3/8, -1/2, -3/16, 1/2, -1/4, 3/16},
+ {3/8, -1/2, -1/8, 1/2, -3/16, 1/8},
+ {3/8, -1/2, -1/16, 1/2, -1/8, 1/16},
+
+ {-3/8, 3/8, -1/2, 3/8, 1/2, -1/4},
+
+ {-7/16, -1/16, -1/16, 7/16, 1/16, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
+ {-1/8, -1/2, -1/8, 1/8, -1/4, 1/8},
+
+ {-3/8, -1/8, -1/2, -1/4, 1/2, -1/4},
+ {-3/8, -1/8, -1/2, -1/4, 1/8, 1/8},
+ {-3/8, -1/2, -1/8, -1/4, 1/8, 1/8},
+ {-1/2, -1/2, -3/16, -3/8, -1/4, 3/16},
+ {-1/2, -1/2, -1/8, -3/8, -3/16, 1/8},
+ {-1/2, -1/2, -1/16, -3/8, -1/8, 1/16},
+
+ {1/4, -1/8, -1/2, 3/8, 1/2, -1/4},
+ {1/4, -1/8, -1/2, 3/8, 1/8, 1/8},
+ {1/4, -1/2, -1/8, 3/8, 1/8, 1/8},
+ {3/8, -1/2, -3/16, 1/2, -1/4, 3/16},
+ {3/8, -1/2, -1/8, 1/2, -3/16, 1/8},
+ {3/8, -1/2, -1/16, 1/2, -1/8, 1/16},
+
+ {-3/8, 3/8, -1/2, 3/8, 1/2, -1/4},
+
+ {-7/16, -1/16, -1/16, 7/16, 1/16, 1/16}
+ }
+ },
+
+ after_dig_node = function(pos)
+ pos.y = pos.y - 1
+ minetest.env:remove_node(pos)
+ end,
+
+ on_punch = function(pos, node)
+ move_arm(pos, node)
+ end
+})
+
+minetest.register_node("infrastructure:boom_barrier_bottom", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_automatic_warning_device_bottom.png",
+ "infrastructure_automatic_warning_device_bottom.png",
+ "infrastructure_automatic_warning_device_bottom.png",
+ "infrastructure_automatic_warning_device_bottom.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ drop = "infrastructure:boom_barrier_top_h",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+ {-1/2, -1/2, -1/4, 1/2, -3/8, 1/4},
+ {-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+ {-1/8, -1/2, -1/8, 1/8, 0, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+ {-1/2, -1/2, -1/4, 1/2, -3/8, 1/4},
+ {-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+ {-1/8, -1/2, -1/8, 1/8, 0, 1/8}
+ }
+ },
+
+ after_dig_node = function(pos)
+ pos.y = pos.y + 1
+ minetest.env:remove_node(pos)
+ 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,
+
+ digiline = {
+ receptor = {},
+ effector = {
+ action = function(pos, node, channel, msg)
+ local setchan = minetest.get_meta(pos):get_string("channel")
+ if setchan ~= channel then
+ return
+ end
+ pos.y = pos.y + 1
+ local mechnode = minetest.env:get_node(pos)
+ if ((msg == "up" and mechnode.name=="infrastructure:boom_barrier_top_h") or (msg == "down" and mechnode.name=="infrastructure:boom_barrier_top_v")) then
+ move_arm(pos, mechnode)
+ end
+ end
+ }
+ },
+})
+
+minetest.register_node("infrastructure:boom_barrier_arm_h_lightfirst", {
+ description = "Boom barrier arm",
+ tiles = {
+ "infrastructure_boom_barrier_arm_h_top.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+ {name="infrastructure_boom_barrier_arm_h_anim_lightfirst.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}},
+ {name="infrastructure_boom_barrier_arm_h_anim_lightfirst.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}},
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ light_source = BOOM_BARRIER_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/2, 1/8, -7/16, 1/2},
+ {-1/8, -5/16, -1/2, 1/8, -1/4, 1/2},
+ {-1/8, -1/2, -1/2, -1/16, -1/4, 1/2},
+ {1/16, -1/2, -1/2, 1/8, -1/4, 1/2},
+ {0, -1/4, -1/8, 0, 0, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/2, 1/8, -1/4, 1/2}
+ }
+ }
+})
+
+minetest.register_node("infrastructure:boom_barrier_arm_h_darkfirst", {
+ tiles = {
+ "infrastructure_boom_barrier_arm_h_top.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+ {name="infrastructure_boom_barrier_arm_h_anim_darkfirst.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}},
+ {name="infrastructure_boom_barrier_arm_h_anim_darkfirst.png",animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.5}},
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ drop = "infrastructure:boom_barrier_arm_h_lightfirst",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/2, 1/8, -7/16, 1/2},
+ {-1/8, -5/16, -1/2, 1/8, -1/4, 1/2},
+ {-1/8, -1/2, -1/2, -1/16, -1/4, 1/2},
+ {1/16, -1/2, -1/2, 1/8, -1/4, 1/2},
+ {0, -1/4, -1/8, 0, 0, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/2, 1/8, -1/4, 1/2}
+ }
+ }
+})
+
+minetest.register_node("infrastructure:boom_barrier_arm_h_end", {
+ tiles = {
+ "infrastructure_boom_barrier_arm_h_top.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+ "infrastructure_boom_barrier_arm_h_left_right_bright.png",
+ "infrastructure_boom_barrier_arm_h_left_right_bright.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ drop = "infrastructure:boom_barrier_arm_h_lightfirst",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/2, 1/8, -7/16, 1/2},
+ {-1/8, -5/16, -1/2, 1/8, -1/4, 1/2},
+ {-1/8, -1/2, -1/2, -1/16, -1/4, 1/2},
+ {1/16, -1/2, -1/2, 1/8, -1/4, 1/2},
+ {0, -1/4, -1/8, 0, 0, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/2, 1/8, -1/4, 1/2}
+ }
+ }
+})
+
+minetest.register_alias("infrastructure:boom_barrier_arm_h_dark","infrastructure:boom_barrier_arm_h_darkfirst")
+minetest.register_alias("infrastructure:boom_barrier_arm_h_bright","infrastructure:boom_barrier_arm_h_lightfirst")
+
+minetest.register_node("infrastructure:boom_barrier_arm_v", {
+ tiles = {
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+ "infrastructure_boom_barrier_arm_v_left.png",
+ "infrastructure_boom_barrier_arm_v_right.png",
+ "infrastructure_boom_barrier_arm_h_top.png",
+ "infrastructure_boom_barrier_arm_h_bottom_front_back.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ drop = "infrastructure:boom_barrier_arm_h_lightfirst",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/2, 1/8, 1/2, -7/16},
+ {-1/8, -1/2, -5/16, 1/8, 1/2, -1/4},
+ {-1/8, -1/2, -1/2, -1/16, 1/2, -1/4},
+ {1/16, -1/2, -1/2, 1/8, 1/2, -1/4},
+ {0, -1/8, -1/4, 0, 1/8, 0}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/2, 1/8, 1/2, -1/4}
+ }
+ }
+})
+
+minetest.register_alias("infrastructure:boom_barrier_mechanism", "infrastructure:boom_barrier_top_h")
+minetest.register_alias("infrastructure:boom_barrier_arm", "infrastructure:boom_barrier_arm_h_lightfirst")
diff --git a/infrastructure/advanced_crosswalk_lighting.lua b/infrastructure/advanced_crosswalk_lighting.lua
new file mode 100644
index 0000000..4e669c1
--- /dev/null
+++ b/infrastructure/advanced_crosswalk_lighting.lua
@@ -0,0 +1,85 @@
+-- Crosswalk lighting
+ minetest.register_node("infrastructure:crosswalk_lighting_dark", {
+ description = "Crosswalk lighting",
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_crosswalk_lighting_bottom.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_crosswalk_lighting_back.png",
+ "infrastructure_crosswalk_lighting_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-3/8, -1/2, -1/4, 3/8, 1/2, -3/16},
+ {-3/8, -1/2, 3/16, 3/8, 1/2, 1/4},
+ {-1/4, 1/4, -3/16, -1/8, 3/8, 3/16},
+ {1/8, 1/4, -3/16, 1/4, 3/8, 3/16},
+ {-1/8, -1/2, -3/16, 1/8, -1/4, 3/16},
+ {-1/2, -1/2, -1/8, 1/2, -3/8, 1/8},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-3/8, -1/2, -1/4, 3/8, 1/2, 1/4}
+ },
+
+ on_punch = function(pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:crosswalk_lighting_bright", param2 = node.param2})
+ end,
+
+ mesecons = {effector = {
+ action_on = function (pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:crosswalk_lighting_bright", param2 = node.param2})
+ end,
+ }}
+ })
+
+ minetest.register_node("infrastructure:crosswalk_lighting_bright", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_crosswalk_lighting_bottom.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_crosswalk_lighting_back.png",
+ "infrastructure_crosswalk_lighting_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ light_source = CROSSWALK_LIGHTING_LIGHT_RANGE,
+ drop = "infrastructure:crosswalk_lighting_dark",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-3/8, -1/2, -1/4, 3/8, 1/2, -3/16},
+ {-3/8, -1/2, 3/16, 3/8, 1/2, 1/4},
+ {-1/4, 1/4, -3/16, -1/8, 3/8, 3/16},
+ {1/8, 1/4, -3/16, 1/4, 3/8, 3/16},
+ {-1/8, -1/2, -3/16, 1/8, -1/4, 3/16},
+ {-1/2, -1/2, -1/8, 1/2, -3/8, 1/8},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-3/8, -1/2, -1/4, 3/8, 1/2, 1/4}
+ },
+
+ on_punch = function(pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:crosswalk_lighting_dark", param2 = node.param2})
+ end,
+
+ mesecons = {effector = {
+ action_off = function (pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:crosswalk_lighting_dark", param2 = node.param2})
+ end,
+ }}
+ })
+
+ minetest.register_alias("infrastructure:crosswalk_lighting", "infrastructure:crosswalk_lighting_dark")
diff --git a/infrastructure/advanced_crosswalk_safety_sign.lua b/infrastructure/advanced_crosswalk_safety_sign.lua
new file mode 100644
index 0000000..6183322
--- /dev/null
+++ b/infrastructure/advanced_crosswalk_safety_sign.lua
@@ -0,0 +1,85 @@
+-- Crosswalk safety sign
+ minetest.register_node("infrastructure:crosswalk_safety_sign_top", {
+ tiles = {
+ "infrastructure_crosswalk_safety_sign_top.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_crosswalk_safety_sign_top_side.png",
+ "infrastructure_crosswalk_safety_sign_top_side.png",
+ "infrastructure_crosswalk_safety_sign_top_front_back.png",
+ "infrastructure_crosswalk_safety_sign_top_front_back.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1, not_in_creative_inventory = 1},
+ light_source = CROSSWALK_SAFETY_SIGN_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2, -1/16, 1/4, 0, -1/16},
+ {-1/4, -1/2, 1/16, 1/4, 0, 1/16},
+ {-1/16, -1/2, -1/16, 1/16, -1/4, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+ })
+
+ minetest.register_node("infrastructure:crosswalk_safety_sign_bottom", {
+ description = "Crosswalk safety sign",
+ inventory_image = "infrastructure_crosswalk_safety_sign.png",
+ wield_image = "infrastructure_crosswalk_safety_sign.png",
+ tiles = {
+ "infrastructure_crosswalk_safety_sign_top.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_crosswalk_safety_sign_bottom_side.png",
+ "infrastructure_crosswalk_safety_sign_bottom_side.png",
+ "infrastructure_crosswalk_safety_sign_bottom_front_back.png",
+ "infrastructure_crosswalk_safety_sign_bottom_front_back.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ light_source = CROSSWALK_SAFETY_SIGN_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -7/32, -1/16, 1/4, 1/2, -1/16},
+ {-1/4, -7/32, 1/16, 1/4, 1/2, 1/16},
+ {-1/16, -5/16, -1/16, 1/16, 1/2, 1/16},
+ {-1/8, -3/8, -1/8, 1/8, -5/16, 1/8},
+ {-1/4, -1/2, -1/2, 1/4, -3/8, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -7/32, -1/16, 1/4, 1, -1/16},
+ {-1/4, -7/32, 1/16, 1/4, 1, 1/16},
+
+ {-1/16, -5/16, -1/16 + 0.01, 1/16, 3/4, 1/16 - 0.01},
+
+ {-1/8, -3/8, -1/8, 1/8, -5/16, 1/8},
+ {-1/4, -1/2, -1/2, 1/4, -3/8, 1/2}
+ }
+ },
+
+ after_place_node = function(pos)
+ local node = minetest.env:get_node(pos)
+ node.name = "infrastructure:crosswalk_safety_sign_bottom"
+ minetest.env:add_node(pos, node)
+ pos.y = pos.y + 1
+ node.name = "infrastructure:crosswalk_safety_sign_top"
+ minetest.env:add_node(pos, node)
+ end,
+
+ after_dig_node = function(pos)
+ pos.y = pos.y + 1
+ minetest.env:remove_node(pos)
+ end,
+ })
+
+ minetest.register_alias("infrastructure:crosswalk_safety_sign", "infrastructure:crosswalk_safety_sign_bottom")
diff --git a/infrastructure/advanced_crosswalk_warning_light.lua b/infrastructure/advanced_crosswalk_warning_light.lua
new file mode 100644
index 0000000..213223a
--- /dev/null
+++ b/infrastructure/advanced_crosswalk_warning_light.lua
@@ -0,0 +1,124 @@
+-- Crosswalk warning light
+function on_off_light(pos, node)
+ if node.name == "infrastructure:crosswalk_warning_light_off" then
+ minetest.swap_node(pos, {name = "infrastructure:crosswalk_warning_light_on", param2 = node.param2})
+ elseif (node.name == "infrastructure:crosswalk_warning_light_on") then
+ minetest.swap_node(pos, {name = "infrastructure:crosswalk_warning_light_off", param2 = node.param2})
+ end
+end
+
+minetest.register_node("infrastructure:crosswalk_warning_light_off", {
+ description = "Crosswalk warning light",
+ inventory_image = "infrastructure_crosswalk_warning_light_front_bright.png",
+ wield_image = "infrastructure_crosswalk_warning_light_front_bright.png",
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_crosswalk_warning_light_back.png",
+ "infrastructure_crosswalk_warning_light_front_dark.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 0},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+ {-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+ {-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+ {-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+ {1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+ {-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+ {-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+
+ {-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+ {-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+ {1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+ {-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+ {-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+ }
+ },
+
+ on_punch = function(pos, node)
+ on_off_light(pos, node)
+ end,
+
+ mesecons = {effector = {
+ action_on = function(pos, node)
+ on_off_light(pos, node)
+ end,
+ }}
+})
+
+minetest.register_node("infrastructure:crosswalk_warning_light_on", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_crosswalk_warning_light_back.png",
+ {name="infrastructure_crosswalk_warning_light_front_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=1.5}}
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ drop = "infrastructure:crosswalk_warning_light_off",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+ {-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+ {-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+ {-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+ {1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+ {-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+ {-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+
+ {-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+ {-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+ {1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+ {-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+ {-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+ }
+ },
+
+ on_punch = function(pos, node)
+ on_off_light(pos, node)
+ end,
+
+ mesecons = {effector = {
+ action_on = function(pos, node)
+ on_off_light(pos, node)
+ end,
+ }}
+})
+
+minetest.register_alias("infrastructure:crosswalk_warning_light", "infrastructure:crosswalk_warning_light_off")
+minetest.register_alias("infrastructure:crosswalk_warning_bright", "infrastructure:crosswalk_warning_light_on")
+minetest.register_alias("infrastructure:crosswalk_warning_dark", "infrastructure:crosswalk_warning_light_on")
diff --git a/infrastructure/advanced_curve_chevron.lua b/infrastructure/advanced_curve_chevron.lua
new file mode 100644
index 0000000..7d3b65d
--- /dev/null
+++ b/infrastructure/advanced_curve_chevron.lua
@@ -0,0 +1,85 @@
+-- Curve chevron
+ minetest.register_node("infrastructure:curve_chevron_dark", {
+ description = "Flashing curve chevron",
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_curve_chevron_left_dark.png",
+ "infrastructure_curve_chevron_right_dark.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, -1/8, 1/2, 1/2, -1/16},
+ {-1/2, -1/2, 1/16, 1/2, 1/2, 1/8},
+ {-3/8, 1/4, -1/16, -1/4, 3/8, 1/16},
+ {1/4, 1/4, -1/16, 3/8, 3/8, 1/16},
+ {-3/8, -3/8, -1/16, -1/4, -1/4, 1/16},
+ {1/4, -3/8, -1/16, 3/8, -1/4, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/8, 1/2, 1/2, 1/8}
+ },
+
+ on_punch = function(pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:curve_chevron_bright", param2 = node.param2})
+ end,
+
+ mesecons = {effector = {
+ action_on = function (pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:curve_chevron_bright", param2 = node.param2})
+ end,
+ }}
+ })
+
+ minetest.register_node("infrastructure:curve_chevron_bright", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_curve_chevron_left_bright.png",
+ "infrastructure_curve_chevron_right_bright.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ light_source = CURVE_CHEVRON_LIGHT_RANGE,
+ drop = "infrastructure:curve_chevron_dark",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, -1/8, 1/2, 1/2, -1/16},
+ {-1/2, -1/2, 1/16, 1/2, 1/2, 1/8},
+ {-3/8, 1/4, -1/16, -1/4, 3/8, 1/16},
+ {1/4, 1/4, -1/16, 3/8, 3/8, 1/16},
+ {-3/8, -3/8, -1/16, -1/4, -1/4, 1/16},
+ {1/4, -3/8, -1/16, 3/8, -1/4, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/8, 1/2, 1/2, 1/8}
+ },
+
+ on_punch = function(pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:curve_chevron_dark", param2 = node.param2})
+ end,
+
+ mesecons = {effector = {
+ action_off = function (pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:curve_chevron_dark", param2 = node.param2})
+ end
+ }}
+ })
+
+ minetest.register_alias("infrastructure:curve_chevron", "infrastructure:curve_chevron_dark")
diff --git a/infrastructure/advanced_emergency_phone.lua b/infrastructure/advanced_emergency_phone.lua
new file mode 100644
index 0000000..c511db1
--- /dev/null
+++ b/infrastructure/advanced_emergency_phone.lua
@@ -0,0 +1,107 @@
+-- Emergency phone (only if enabled)
+ if ENABLE_EMERGENCY_PHONE then
+ minetest.register_node("infrastructure:emergency_phone_top", {
+ description = "Emergency phone",
+ tiles = {
+ "infrastructure_emergency_phone_top.png",
+ "infrastructure_emergency_phone_bottom.png",
+ "infrastructure_emergency_phone_side.png",
+ "infrastructure_emergency_phone_side.png",
+ "infrastructure_emergency_phone_side.png",
+ "infrastructure_emergency_phone_front.png"
+ },
+ drawtype = "nodebox",
+ drop = "streets:emergencyphone",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky=1,not_in_creative_inventory=1},
+ light_source = EMERGENCY_PHONE_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25},
+ {-0.25, -0.5, -0.3125, -0.1875, 0.5, -0.25},
+ {0.1875, -0.5, -0.3125, 0.25, 0.5, -0.25},
+ {-0.1875, 0.4375, -0.3125, 0.1875, 0.5, -0.25}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25},
+ {-0.25, -0.5, -0.3125, -0.1875, 0.5, -0.25},
+ {0.1875, -0.5, -0.3125, 0.25, 0.5, -0.25},
+ {-0.1875, 0.4375, -0.3125, 0.1875, 0.5, -0.25},
+ }
+ },
+
+ after_dig_node = function(pos)
+ pos.y = pos.y - 1
+ if minetest.get_node(pos).name == "infrastructure:emergency_phone_bottom" then
+ minetest.remove_node(pos)
+ end
+ end,
+
+ on_punch = function(pos, node, puncher)
+ if dial_handler ~= nil then
+ minetest.sound_stop(dial_handler)
+ dial_handler = nil
+ end
+ dial_handler = minetest.sound_play("infrastructure_emergency_phone", {
+ pos = pos,
+ gain = EMERGENCY_PHONE_VOLUME,
+ max_hear_distance = 50
+ })
+ if (puncher:is_player() and puncher:get_hp() < HEALTH_TO_RESTORING and puncher:get_hp() <= HEALTH_TO_TRIGGER) then
+ puncher:set_hp(HEALTH_TO_RESTORING)
+ minetest.chat_send_player(puncher:get_player_name(), "You got healed!")
+ minetest.chat_send_all("Server: -!- "..puncher:get_player_name().." used an emergency phone at "..pos.x..","..pos.y..","..pos.z);
+ end
+ end
+ })
+
+ minetest.register_node("infrastructure:emergency_phone_bottom", {
+ tiles = {"infrastructure_emergency_phone_bottom.png"},
+ drawtype = "nodebox",
+ drop = "streets:emergencyphone",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky=1,not_in_creative_inventory=1},
+ node_box = {
+ type = "fixed",
+ fixed = {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}
+ },
+
+ after_dig_node = function(pos)
+ pos.y = pos.y+1
+ if minetest.get_node(pos).name == "infrastructure:emergency_phone_top" then
+ minetest.remove_node(pos)
+ end
+ end,
+ })
+
+ minetest.register_alias("infrastructure:emergency_phone", "infrastructure:emergency_phone_top")
+
+ minetest.register_abm({
+ nodenames = {"streets:emergencyphone"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node)
+ local node = minetest.get_node(pos)
+ local node_above = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
+ if node_above.name == "air" then
+ node.name = "infrastructure:emergency_phone_bottom"
+ minetest.set_node(pos, node)
+ pos.y = pos.y+1
+ end
+ node.name = "infrastructure:emergency_phone_top"
+ minetest.set_node(pos, node)
+ end,
+ })
+ else
+ print("Infrastructure mod: -!- Emergency-Phone is disabled!")
+ end
diff --git a/infrastructure/advanced_lane_control_lights.lua b/infrastructure/advanced_lane_control_lights.lua
new file mode 100644
index 0000000..195f809
--- /dev/null
+++ b/infrastructure/advanced_lane_control_lights.lua
@@ -0,0 +1,91 @@
+-- Lane control lights
+
+for i = 1, 6 do
+ local groups = {}
+ if i == 1 then
+ groups = {cracky = 3}
+ else
+ groups = {cracky = 3, not_in_creative_inventory = 1}
+ end
+
+ minetest.register_node("infrastructure:lane_control_lights_"..tostring(i), {
+ description = "Lane control lights",
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_lane_control_lights_"..tostring(i)..".png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec", "field[channel;Channel;${channel}]")
+ end,
+ groups = {cracky = 3, not_in_creative_inventory = (i == 1 and 0 or 1)},
+ light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+ drop = "infrastructure:lane_control_lights_1",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-7/16, -7/16, -1/8, 7/16, 7/16, 1/8},
+ {-7/16, 0, -1/4, -3/8, 7/16, -1/8},
+ {3/8, 0, -1/4, 7/16, 7/16, -1/8},
+ {-7/16, 3/8, -5/16, 7/16, 7/16, -1/8},
+ {-1/16, -1/4, 0, 1/16, 1/4, 1/2 - 0.001},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001},
+ {-1/4, -1/16, 0, 1/4, 1/16, 1/2 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-7/16, -7/16, -1/8, 7/16, 7/16, 1/8},
+ {-7/16, 0, -1/4, -3/8, 7/16, -1/8},
+ {3/8, 0, -1/4, 7/16, 7/16, -1/8},
+ {-7/16, 3/8, -5/16, 7/16, 7/16, -1/8},
+ {-1/16, -1/4, 0, 1/16, 1/4, 1/2 - 0.001},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001},
+ {-1/4, -1/16, 0, 1/4, 1/16, 1/2 - 0.001}
+ }
+
+ },
+ on_receive_fields = function(pos, formname, fields)
+ if (fields.channel) then
+ minetest.get_meta(pos):set_string("channel", fields.channel)
+ end
+ end,
+ digiline = {
+ receptor = {},
+ effector = {
+ action = function(pos, node, channel, msg)
+ local setchan = minetest.get_meta(pos):get_string("channel")
+ if setchan ~= channel then
+ return
+ end
+ msg = msg:lower()
+ if (msg=="off") then
+ node.name = "infrastructure:lane_control_lights_1"
+ elseif (msg=="green") then
+ node.name = "infrastructure:lane_control_lights_3"
+ elseif (msg=="red") then
+ node.name = "infrastructure:lane_control_lights_2"
+ elseif (msg=="yellowleft") then
+ node.name = "infrastructure:lane_control_lights_5"
+ elseif (msg=="yellowright") then
+ node.name = "infrastructure:lane_control_lights_4"
+ elseif (msg=="yellow") then
+ node.name = "infrastructure:lane_control_lights_6"
+ end
+ minetest.set_node(pos,node)
+ minetest.get_meta(pos):set_string("channel",setchan)
+ end
+ }
+ }
+ })
+end
+
+minetest.register_alias("infrastructure:lane_control_lights", "infrastructure:lane_control_lights_1")
diff --git a/infrastructure/advanced_road_signs.lua b/infrastructure/advanced_road_signs.lua
new file mode 100644
index 0000000..b732bfd
--- /dev/null
+++ b/infrastructure/advanced_road_signs.lua
@@ -0,0 +1,237 @@
+-- Road signs
+ local signs = {"stop", "yield", "right_of_way"}
+
+ for i, sign_name in ipairs(signs) do
+ minetest.register_node("infrastructure:road_sign_"..sign_name, {
+ description = "Road sign "..sign_name,
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_road_sign_"..sign_name.."_back.png",
+ "infrastructure_road_sign_"..sign_name.."_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
+ {-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
+ {-3/16, -1/8, 7/16 + 0.01, 3/16, 1/8, 1/2 - 0.01}
+ }
+ },
+
+ after_place_node = function(pos, node)
+ local node = minetest.env:get_node(pos)
+ local param2 = node.param2
+ local sign_pos = {x=pos.x, y=pos.y, z=pos.z}
+
+ if param2 == 0 then
+ pos.z = pos.z + 1
+ elseif param2 == 1 then
+ pos.x = pos.x + 1
+ elseif param2 == 2 then
+ pos.z = pos.z - 1
+ elseif param2 == 3 then
+ pos.x = pos.x - 1
+ end
+
+ local node = minetest.env:get_node(pos)
+
+ if minetest.registered_nodes[node.name].drawtype == "fencelike" then
+ minetest.set_node(sign_pos, {name="infrastructure:road_sign_"..sign_name.."_on_post", param2=param2})
+ end
+ end
+ })
+
+ minetest.register_node("infrastructure:road_sign_"..sign_name.."_on_post", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_road_sign_"..sign_name.."_back.png",
+ "infrastructure_road_sign_"..sign_name.."_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ drop = "infrastructure:road_sign_"..sign_name,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
+ {-3/16, 1/16, 7/16 + 3/8, 3/16, 1/8, 13/16 + 3/8 - 0.001},
+ {-3/16, -1/8, 7/16 + 3/8, 3/16, -1/16, 13/16 + 3/8 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
+ {-3/16, 1/16, 7/16 + 3/8 + 0.01, 3/16, 1/8, 13/16 + 3/8 - 0.01},
+ {-3/16, -1/8, 7/16 + 3/8 + 0.01, 3/16, -1/16, 13/16 + 3/8 - 0.01}
+ }
+ }
+ })
+ end
+
+-- Road sign crosswalk
+ minetest.register_node("infrastructure:road_sign_crosswalk", {
+ description = "Road sign crosswalk",
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_road_sign_crosswalk_back.png",
+ "infrastructure_road_sign_crosswalk_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
+ {-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
+ {-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
+ }
+ },
+
+ after_place_node = function(pos, node)
+ local node = minetest.env:get_node(pos)
+ local param2 = node.param2
+ local sign_pos = {x=pos.x, y=pos.y, z=pos.z}
+
+ if param2 == 0 then
+ pos.z = pos.z + 1
+ elseif param2 == 1 then
+ pos.x = pos.x + 1
+ elseif param2 == 2 then
+ pos.z = pos.z - 1
+ elseif param2 == 3 then
+ pos.x = pos.x - 1
+ end
+
+ local node = minetest.env:get_node(pos)
+
+ if param2 == 0 then
+ pos.z = pos.z - 2
+ elseif param2 == 1 then
+ pos.x = pos.x - 2
+ elseif param2 == 2 then
+ pos.z = pos.z + 2
+ elseif param2 == 3 then
+ pos.x = pos.x + 2
+ end
+
+ if minetest.registered_nodes[node.name].drawtype == "fencelike" then
+ minetest.set_node(sign_pos, {name="infrastructure:road_sign_crosswalk_on_post", param2=param2})
+ minetest.env:add_node(pos, {name="infrastructure:road_sign_retroreflective_surface_on_post", param2=param2})
+ else
+ minetest.env:add_node(pos, {name="infrastructure:road_sign_retroreflective_surface", param2=param2})
+ end
+ end
+ })
+
+ minetest.register_node("infrastructure:road_sign_crosswalk_on_post", {
+ description = "Road sign crosswalk",
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_road_sign_crosswalk_back.png",
+ "infrastructure_road_sign_crosswalk_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ drop = "infrastructure:road_sign_crosswalk",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
+ {-3/16, 1/16, 7/16 + 3/8, 3/16, 1/8, 13/16 + 3/8 - 0.001},
+ {-3/16, -1/8, 7/16 + 3/8, 3/16, -1/16, 13/16 + 3/8 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
+ {-3/16, 1/16, 7/16 + 3/8 + 0.01, 3/16, 1/8, 13/16 + 3/8 - 0.01},
+ {-3/16, -1/8, 7/16 + 3/8 + 0.01, 3/16, -1/16, 13/16 + 3/8 - 0.01}
+ }
+ }
+ })
+
+ minetest.register_node("infrastructure:road_sign_retroreflective_surface", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_road_sign_retroreflective_surface.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = RETROREFLECTIVE_SURFACE_LIGHT_RANGE,
+ drop = "",
+ node_box = {
+ type = "fixed",
+ fixed = {-3/4, -3/4, 7/16 + 1 + 0.01, 3/4, 3/4, 7/16 + 1 + 0.01}
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-3/4, -3/4, 7/16 + 1 + 0.01, 3/4, 3/4, 7/16 + 1 + 0.01}
+ }
+ })
+
+ minetest.register_node("infrastructure:road_sign_retroreflective_surface_on_post", {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_road_sign_retroreflective_surface.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = RETROREFLECTIVE_SURFACE_LIGHT_RANGE,
+ drop = "",
+ node_box = {
+ type = "fixed",
+ fixed = {-3/4, -3/4, 7/16 + 3/8 + 1 + 0.01, 3/4, 3/4, 7/16 + 3/8 + 1 + 0.01}
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-3/4, -3/4, 7/16 + 3/8 + 1 + 0.01, 3/4, 3/4, 7/16 + 3/8 + 1 + 0.01}
+ }
+ })
diff --git a/infrastructure/advanced_traffic_lights_pedestrians.lua b/infrastructure/advanced_traffic_lights_pedestrians.lua
new file mode 100644
index 0000000..02da804
--- /dev/null
+++ b/infrastructure/advanced_traffic_lights_pedestrians.lua
@@ -0,0 +1,252 @@
+-- Traffic lights for pedestrians
+ beep_handler = {}
+
+ function semaphores_pedestrians(pos, node)
+ local p = minetest.hash_node_position(pos)
+ if node.name == "infrastructure:traffic_lights_pedestrians_bottom_1" then
+ minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_bottom_2", param2 = node.param2})
+ pos.y = pos.y + 1
+ minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_top_2", param2 = node.param2})
+ elseif node.name == "infrastructure:traffic_lights_pedestrians_bottom_2" then
+ minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_bottom_3", param2 = node.param2})
+ pos.y = pos.y + 1
+ minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_top_3", param2 = node.param2})
+ beep_handler[p] = minetest.sound_play("infrastructure_traffic_lights_1", {
+ loop = true,
+ pos = pos,
+ gain = TRAFFIC_LIGHTS_VOLUME,
+ max_hear_distance = 50
+ })
+ elseif node.name == "infrastructure:traffic_lights_pedestrians_bottom_3" then
+ minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_bottom_4", param2 = node.param2})
+ if beep_handler[p] ~= nil then
+ minetest.sound_stop(beep_handler[p])
+ beep_handler[p] = nil
+ end
+ pos.y = pos.y + 1
+ minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_top_4", param2 = node.param2})
+ beep_handler[p] = minetest.sound_play("infrastructure_traffic_lights_2", {
+ loop = true,
+ pos = pos,
+ gain = TRAFFIC_LIGHTS_VOLUME,
+ max_hear_distance = 50
+ })
+ elseif node.name == "infrastructure:traffic_lights_pedestrians_bottom_4" then
+ minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_bottom_1", param2 = node.param2})
+ pos.y = pos.y + 1
+ minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_top_1", param2 = node.param2})
+ if beep_handler[p] ~= nil then
+ minetest.sound_stop(beep_handler[p])
+ beep_handler[p] = nil
+ end
+ end
+ end
+
+ function quiet(pos)
+ local p = minetest.hash_node_position(pos)
+ if beep_handler[p] ~= nil then
+ minetest.sound_stop(beep_handler[p])
+ beep_handler[p] = nil
+ end
+ end
+
+ for i = 1, 4 do
+ minetest.register_node("infrastructure:traffic_lights_pedestrians_top_"..tostring(i), {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_pedestrians_top_back.png",
+ "infrastructure_traffic_lights_pedestrians_top_front_"..tostring(i)..".png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky=3, not_in_creative_inventory = 1},
+ light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -1/2, -1/8, 5/16, 0, 1/8},
+ {-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+ {-5/16, -1/8, -5/16, 5/16, -1/16, -1/8},
+ {-5/16, -3/8, -1/4, -1/4, -1/8, -1/8},
+ {1/4, -3/8, -1/4, 5/16, -1/8, -1/8},
+
+ {-1/8, 1/16, -1/8, 1/8, 5/16, 0},
+ {-1/16, 1/8, 0, 1/16, 1/4, 1/8},
+ {-1/16, 0, -1/16, 1/16, 1/8, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {0, 0, 0, 0, 0, 0}
+ }
+ })
+
+ minetest.register_node("infrastructure:traffic_lights_pedestrians_bottom_"..tostring(i), {
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_pedestrians_bottom_back.png",
+ "infrastructure_traffic_lights_pedestrians_bottom_front_"..tostring(i)..".png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+ drop = "infrastructure:traffic_lights_pedestrians_bottom_1",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -5/16, -1/8, 5/16, 1/2, 1/8},
+ {-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+ {-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+ {-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+ {1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+ {-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+ {-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ -- box
+ {-5/16, -5/16, -1/8, 5/16, 1, 1/8},
+ -- top
+ {-5/16, -1/8 + 1, -5/16, 5/16, -1/16 + 1, -1/8},
+ {-5/16, -3/8 + 1, -1/4, -1/4, -1/8 + 1, -1/8},
+ {1/4, -3/8 + 1, -1/4, 5/16, -1/8 + 1, -1/8},
+
+ {-1/8, 1/16 + 1, -1/8, 1/8, 5/16 + 1, 0},
+ {-1/16, 1/8 + 1, 0, 1/16, 1/4 + 1, 1/8},
+ {-1/16, 0 + 1, -1/16, 1/16, 1/4 + 1, 1/16},
+ -- bottom
+ {-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+ {-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+ {1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+ {-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+ {-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+ }
+ },
+
+ after_place_node = function(pos)
+ local node = minetest.env:get_node(pos)
+ pos.y = pos.y + 1
+ node.name = "infrastructure:traffic_lights_pedestrians_top_"..tostring(i)
+ minetest.env:add_node(pos, node)
+ end,
+
+ after_dig_node = function(pos)
+ local node = minetest.env:get_node(pos)
+ quiet(pos)
+ pos.y = pos.y + 1
+ node.name = "infrastructure:traffic_lights_pedestrians_top_"..tostring(i)
+ minetest.env:remove_node(pos)
+ end,
+
+ on_punch = function(pos, node)
+ semaphores_pedestrians(pos, node)
+ end,
+
+ mesecons = {effector = {
+ action_on = function(pos, node)
+ semaphores_pedestrians(pos, node)
+ end
+ }}
+ })
+ end
+
+ minetest.register_node("infrastructure:traffic_lights_pedestrians_bottom_1", {
+ description = "Traffic lights for pedestrians",
+ inventory_image = "infrastructure_traffic_lights_pedestrians.png",
+ wield_image = "infrastructure_traffic_lights_pedestrians.png",
+ tiles = {
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_side.png",
+ "infrastructure_traffic_lights_pedestrians_bottom_back.png",
+ "infrastructure_traffic_lights_pedestrians_bottom_front_1.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 0},
+ light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -5/16, -1/8, 5/16, 1/2, 1/8},
+ {-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+ {-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+ {-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+ {1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+ {-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+ {-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ -- box
+ {-5/16, -5/16, -1/8, 5/16, 1, 1/8},
+ -- top
+ {-5/16, -1/8 + 1, -5/16, 5/16, -1/16 + 1, -1/8},
+ {-5/16, -3/8 + 1, -1/4, -1/4, -1/8 + 1, -1/8},
+ {1/4, -3/8 + 1, -1/4, 5/16, -1/8 + 1, -1/8},
+
+ {-1/8, 1/16 + 1, -1/8, 1/8, 5/16 + 1, 0},
+ {-1/16, 1/8 + 1, 0, 1/16, 1/4 + 1, 1/8},
+ {-1/16, 0 + 1, -1/16, 1/16, 1/8 + 1, 1/16},
+ -- bottom
+ {-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+ {-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+ {1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+ {-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+ {-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+ {-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+ }
+ },
+
+ after_place_node = function(pos)
+ local node = minetest.env:get_node(pos)
+ pos.y = pos.y + 1
+ node.name = "infrastructure:traffic_lights_pedestrians_top_1"
+ minetest.env:add_node(pos, node)
+ end,
+
+ after_dig_node = function(pos)
+ local node = minetest.env:get_node(pos)
+ quiet(pos)
+ pos.y = pos.y + 1
+ node.name = "infrastructure:traffic_lights_pedestrians_top_1"
+ minetest.env:remove_node(pos)
+ end,
+
+ on_punch = function(pos, node)
+ semaphores_pedestrians(pos, node)
+ end,
+
+ mesecons = {effector = {
+ action_on = function(pos, node)
+ semaphores_pedestrians(pos, node)
+ end
+ }}
+ })
+
+ minetest.register_alias("infrastructure:traffic_lights_pedestrians", "infrastructure:traffic_lights_pedestrians_bottom_1")
diff --git a/infrastructure/advanced_warning_light.lua b/infrastructure/advanced_warning_light.lua
new file mode 100644
index 0000000..0ed5b62
--- /dev/null
+++ b/infrastructure/advanced_warning_light.lua
@@ -0,0 +1,47 @@
+-- Warning light
+
+minetest.register_node("infrastructure:warning_light", {
+ description = "Warning light",
+ tiles = {
+ "infrastructure_warning_light_top.png",
+ "infrastructure_warning_light_bottom.png",
+ "infrastructure_warning_light_right.png",
+ "infrastructure_warning_light_left.png",
+ "infrastructure_warning_light_back.png",
+ {name="infrastructure_warning_light_front_anim.png",animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=3}},
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 1},
+ light_source = WARNING_LIGHT_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -3/8, 0, 5/16, 0, 0},
+
+ {-1/4, -5/16, 0, 0, -1/16, 1/8},
+
+ {1/16, -1/2, -1/8, 5/16, -1/4, 1/8},
+
+ {-1/16, -1/2, -1/16, 1/16, -3/8, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -3/8, 0, 5/16, 0, 0},
+
+ {-1/4, -5/16, 0 + 0.01, 0, -1/16, 1/8},
+
+ {1/16, -1/2, -1/8, 5/16, -1/4, 1/8},
+
+ {-1/16, -1/2, -1/16, 1/16, -3/8, 1/16}
+ }
+ }
+})
+
+
+
+minetest.register_alias("infrastructure:warning_light_bright", "infrastructure:warning_light")
+minetest.register_alias("infrastructure:warning_light_dark", "infrastructure:warning_light")
diff --git a/infrastructure/crafts.lua b/infrastructure/crafts.lua
new file mode 100644
index 0000000..9897892
--- /dev/null
+++ b/infrastructure/crafts.lua
@@ -0,0 +1,443 @@
+-- **************************************************************************************************** MATERIALS
+
+-- Galvanized steel
+ if minetest.get_modpath("technic") then
+ technic.register_alloy_recipe({input = {"default:steel_ingot 6", "technic:zinc_ingot 1"}, output = "infrastructure:galvanized_steel 6", time = 4})
+ else
+ minetest.register_craft({
+ output = '"infrastructure:galvanized_steel" 6',
+ recipe = {
+ {'', 'default:copper_ingot', ''},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+ }
+ })
+ end
+
+-- Galvanized steel fence
+ minetest.register_craft({
+ output = '"infrastructure:fence_galvanized_steel" 6',
+ recipe = {
+ {'infrastructure:galvanized_steel', 'infrastructure:galvanized_steel', 'infrastructure:galvanized_steel'},
+ {'infrastructure:galvanized_steel', 'infrastructure:galvanized_steel', 'infrastructure:galvanized_steel'}
+ }
+ })
+
+-- **************************************************************************************************** PRECAST CONCRETE
+
+-- Concrete seperating wall
+ minetest.register_craft({
+ output = '"infrastructure:precast_concrete_seperating_wall" 5',
+ recipe = {
+ {'', 'infrastructure:concrete', ''},
+ {'', 'infrastructure:concrete', ''},
+ {'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+ }
+ })
+
+-- Concrete cylinder
+ minetest.register_craft({
+ output = '"infrastructure:precast_concrete_cylinder" 8',
+ recipe = {
+ {'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'},
+ {'infrastructure:concrete', '', 'infrastructure:concrete'},
+ {'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+ }
+ })
+
+-- Concrete grid paver
+ minetest.register_craft({
+ output = '"infrastructure:precast_concrete_grid_paver" 5',
+ recipe = {
+ {'infrastructure:concrete', '', 'infrastructure:concrete'},
+ {'', 'infrastructure:concrete', ''},
+ {'infrastructure:concrete', '', 'infrastructure:concrete'}
+ }
+ })
+
+-- **************************************************************************************************** STEEL STRUCTURES
+
+-- Truss
+ minetest.register_craft({
+ output = '"infrastructure:truss" 5',
+ recipe = {
+ {'infrastructure:galvanized_steel', '', 'infrastructure:galvanized_steel'},
+ {'', 'infrastructure:galvanized_steel', ''},
+ {'infrastructure:galvanized_steel', '', 'infrastructure:galvanized_steel'}
+ }
+ })
+
+-- Wire netting
+ minetest.register_craft({
+ output = '"infrastructure:wire_netting" 10',
+ recipe = {
+ {'', 'infrastructure:galvanized_steel', ''},
+ {'infrastructure:galvanized_steel', '', 'infrastructure:galvanized_steel'},
+ {'', 'infrastructure:galvanized_steel', ''}
+ }
+ })
+
+-- Razor wire
+ minetest.register_craft({
+ output = '"infrastructure:razor_wire" 5',
+ recipe = {
+ {'infrastructure:galvanized_steel'},
+ {'default:cactus'},
+ {'infrastructure:galvanized_steel'}
+ }
+ })
+
+-- Drainage channel grating
+ minetest.register_craft({
+ output = '"infrastructure:drainage_channel_grating" 2',
+ recipe = {
+ {'infrastructure:galvanized_steel', '', 'infrastructure:galvanized_steel'}
+ }
+ })
+
+-- Louver
+ minetest.register_craft({
+ output = '"infrastructure:drainage_channel_grating" 2',
+ recipe = {
+ {'infrastructure:galvanized_steel'},
+ {''},
+ {'infrastructure:galvanized_steel'}
+ }
+ })
+
+-- Riffled sheet
+ minetest.register_craft({
+ output = '"infrastructure:riffled_sheet" 4',
+ recipe = {
+ {'infrastructure:galvanized_steel', 'infrastructure:fence_galvanized_steel'},
+ {'infrastructure:fence_galvanized_steel', 'infrastructure:galvanized_steel'}
+ }
+ })
+
+-- Corrugated sheet
+ minetest.register_craft({
+ output = '"infrastructure:corrugated_sheet" 4',
+ recipe = {
+ {"","infrastructure:galvanized_steel",""},
+ {"infrastructure:galvanized_steel","","infrastructure:galvanized_steel"}
+ }
+ })
+
+-- Louvers
+ minetest.register_craft({
+ output = "infrastructure:louver_opened",
+ recipe = {
+ {"infrastructure:fence_galvanized_steel","infrastructure:galvanized_steel","infrastructure:fence_galvanized_steel"},
+ {"","",""},
+ {"infrastructure:fence_galvanized_steel","infrastructure:galvanized_steel","infrastructure:fence_galvanized_steel"}
+ }
+ })
+
+-- **************************************************************************************************** ADVANCED ITEMS
+
+-- Raised pavement marker yellow/yellow
+ minetest.register_craft({
+ output = '"infrastructure:marker_yellow_yellow" 1',
+ recipe = {
+ {'wool:yellow', 'infrastructure:asphalt', 'wool:yellow'},
+ {'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+ }
+ })
+
+-- Raised pavement marker red/yellow
+ minetest.register_craft({
+ output = '"infrastructure:marker_red_yellow" 1',
+ recipe = {
+ {'wool:yellow', 'infrastructure:asphalt', 'wool:red'},
+ {'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+ }
+ })
+
+-- Retroreflective delineators
+ minetest.register_craft({
+ output = '"infrastructure:delineator" 1',
+ recipe = {
+ {'wool:yellow', 'infrastructure:concrete', 'wool:red'},
+ {'', 'infrastructure:concrete', ''},
+ {'', 'infrastructure:concrete', ''}
+ }
+ })
+
+ minetest.register_craft({
+ output = '"infrastructure:delineator_guardrail" 1',
+ recipe = {
+ {'wool:yellow', 'infrastructure:concrete', 'wool:red'},
+ {'', 'infrastructure:concrete', ''}
+ }
+ })
+
+-- Wire rope safety barrier
+ minetest.register_craft({
+ output = '"infrastructure:wire_rope_safety_barrier" 1',
+ recipe = {
+ {'default:steel_ingot', '', 'default:steel_ingot'},
+ {'', 'default:steel_ingot', ''},
+ {'', 'default:steel_ingot', ''}
+ }
+ })
+
+-- Cable barrier terminal
+ minetest.register_craft({
+ output = '"infrastructure:cable_barrier_terminal" 1',
+ recipe = {
+ {'default:steel_ingot', '', ''},
+ {'', 'default:steel_ingot', ''},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+ }
+ })
+
+-- Corrugated guide rail
+ minetest.register_craft({
+ output = '"infrastructure:corrugated_guide_rail" 1',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'', 'default:steel_ingot', ''},
+ {'', 'default:steel_ingot', ''}
+ }
+ })
+
+-- Energy absorbing terminal
+ minetest.register_craft({
+ output = '"infrastructure:energy_absorbing_terminal" 1',
+ recipe = {
+ {'', 'default:steel_ingot', ''},
+ {'default:steel_ingot', 'default:steel_ingot', ''},
+ {'', 'default:steel_ingot', ''}
+ }
+ })
+
+ minetest.register_craft({
+ output = '"infrastructure:energy_absorbing_terminal" 1',
+ recipe = {
+ {'infrastructure:energy_absorbing_terminal_inversed'}
+ }
+ })
+
+ minetest.register_craft({
+ output = '"infrastructure:energy_absorbing_terminal_inversed" 1',
+ recipe = {
+ {'infrastructure:energy_absorbing_terminal'}
+ }
+ })
+
+-- Fitch barrel
+ minetest.register_craft({
+ output = '"infrastructure:fitch_barrel" 1',
+ recipe = {
+ {'wool:black', 'wool:black', 'wool:black'},
+ {'wool:yellow', 'default:sand', 'wool:yellow'},
+ {'wool:yellow', 'wool:yellow', 'wool:yellow'}
+ }
+ })
+
+-- Crowd control barricade
+ minetest.register_craft({
+ output = '"infrastructure:crowd_control_barricade" 1',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'default:steel_ingot', '', 'default:steel_ingot'}
+ }
+ })
+
+if ENABLE_EMERGENCY_PHONE then
+-- Emergency phone
+ minetest.register_craft({
+ output = '"infrastructure:emergency_phone" 1',
+ recipe = {
+ {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'},
+ {'default:mese_crystal', 'default:apple', 'default:mese_crystal'},
+ {'default:mese_crystal', 'default:stick', 'default:mese_crystal'}
+ }
+ })
+ minetest.register_craft({
+ output = '"infrastructure:emergency_phone" 1',
+ recipe = {
+ {'default:mese', 'default:mese', 'default:mese'},
+ {'default:mese', 'default:apple', 'default:mese'},
+ {'default:mese', 'default:stick', 'default:mese'}
+ }
+ })
+end
+
+-- Manhole cover
+ minetest.register_craft({
+ output = '"infrastructure:manhole_cover_closed" 1',
+ recipe = {
+ {'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'},
+ {'infrastructure:concrete', 'default:steel_ingot', 'infrastructure:concrete'},
+ {'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+ }
+ })
+
+-- Traffic lights for pedestrians
+ minetest.register_craft({
+ output = '"infrastructure:traffic_lights_pedestrians" 1',
+ recipe = {
+ {'', 'default:steel_ingot', ''},
+ {'default:steel_ingot', 'wool:red', 'default:steel_ingot'},
+ {'default:steel_ingot', 'wool:green', 'default:steel_ingot'}
+ }
+ })
+
+-- Crosswalk warning light
+ minetest.register_craft({
+ output = '"infrastructure:crosswalk_warning_light" 1',
+ recipe = {
+ {'', 'default:steel_ingot', ''},
+ {'default:steel_ingot', 'wool:yellow', 'default:steel_ingot'},
+ {'', 'wool:green', ''}
+ }
+ })
+
+-- Curve chevron
+ minetest.register_craft({
+ output = '"infrastructure:curve_chevron" 1',
+ recipe = {
+ {'wool:yellow', 'wool:black', 'wool:yellow'},
+ {'wool:black', 'wool:yellow', 'wool:yellow'},
+ {'wool:yellow', 'wool:black', 'wool:yellow'}
+ }
+ })
+
+-- Crosswalk lighting
+ minetest.register_craft({
+ output = '"infrastructure:crosswalk_lighting" 1',
+ recipe = {
+ {'wool:white', 'wool:white', 'wool:white'},
+ {'', 'mesecons_torch:mesecon_torch_on', ''},
+ {'wool:white', 'wool:white', 'wool:white'}
+ }
+ })
+
+-- Crosswalk safety sign
+ minetest.register_craft({
+ output = '"infrastructure:crosswalk_safety_sign" 1',
+ recipe = {
+ {'', 'wool:green', ''},
+ {'', 'wool:green', ''},
+ {'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+ }
+ })
+
+-- Road sign crosswalk
+ minetest.register_craft({
+ output = '"infrastructure:road_sign_crosswalk" 1',
+ recipe = {
+ {'wool:green', 'wool:green', 'wool:green'},
+ {'wool:green', 'wool:blue', 'wool:green'},
+ {'wool:green', 'wool:green', 'wool:green'}
+ }
+ })
+
+-- Road sign right_of_way
+ minetest.register_craft({
+ output = '"infrastructure:road_sign_right_of_way" 1',
+ recipe = {
+ {"", 'wool:white', ""},
+ {'wool:white', 'wool:yellow', 'wool:white'},
+ {"", 'wool:white', ""}
+ }
+ })
+
+-- Road sign stop
+ minetest.register_craft({
+ output = '"infrastructure:road_sign_stop" 1',
+ recipe = {
+ {'wool:red', 'wool:red', 'wool:red'},
+ {'wool:red', 'wool:white', 'wool:red'},
+ {'wool:red', 'wool:red', 'wool:red'}
+ }
+ })
+
+-- Road sign yield
+ minetest.register_craft({
+ output = '"infrastructure:road_sign_yield" 1',
+ recipe = {
+ {'wool:orange', 'wool:orange', 'wool:orange'},
+ {'wool:red', 'wool:orange', 'wool:red'},
+ {'', 'wool:red', ''}
+ }
+ })
+
+-- Automatic warning device
+ minetest.register_craft({
+ output = '"infrastructure:automatic_warning_device" 1',
+ recipe = {
+ {'wool:red', 'default:steel_ingot', 'wool:red'},
+ {'', 'default:steel_ingot', ''},
+ {'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+ }
+ })
+
+-- Boom barrier
+ minetest.register_craft({
+ output = '"infrastructure:boom_barrier_mechanism" 1',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', ''},
+ {'', 'default:steel_ingot', ''},
+ {'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+ }
+ })
+
+ minetest.register_craft({
+ output = '"infrastructure:boom_barrier_arm" 1',
+ recipe = {
+ {'', 'wool:red', ''},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+ }
+ })
+
+-- Aircraft warning light
+ minetest.register_craft({
+ output = '"infrastructure:aircraft_warning_light" 1',
+ recipe = {
+ {'', 'wool:red', ''},
+ {'wool:red', 'default:torch', 'wool:red'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+ }
+ })
+
+-- Warning light
+ minetest.register_craft({
+ output = '"infrastructure:warning_light" 1',
+ recipe = {
+ {'wool:yellow', 'wool:yellow', ''},
+ {'wool:yellow', 'default:torch', ''},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+ }
+ })
+
+-- Anti-dazzling panel
+ minetest.register_craft({
+ output = '"infrastructure:anti_dazzling_panel" 1',
+ recipe = {
+ {'wool:grey', 'wool:grey'},
+ {'wool:grey', 'wool:yellow'},
+ {'wool:grey', 'wool:grey'}
+ }
+ })
+
+-- Traffic cone
+ minetest.register_craft({
+ output = '"infrastructure:traffic_cone" 1',
+ recipe = {
+ {'', 'wool:orange', ''},
+ {'wool:orange', '', 'wool:orange'},
+ }
+ })
+
+-- Noise barrier
+ minetest.register_craft({
+ output = '"infrastructure:noise_barrier" 1',
+ recipe = {
+ {'default:steel_ingot', 'wool:green', 'default:steel_ingot'},
+ {'wool:green', 'default:steel_ingot', 'wool:green'},
+ {'default:steel_ingot', 'wool:green', 'default:steel_ingot'}
+ }
+ })
diff --git a/infrastructure/depends.txt b/infrastructure/depends.txt
new file mode 100644
index 0000000..af1119b
--- /dev/null
+++ b/infrastructure/depends.txt
@@ -0,0 +1,8 @@
+default
+moreblocks
+mesecons
+wool
+streetsmod
+prefab
+digilines
+technic?
diff --git a/infrastructure/init.lua b/infrastructure/init.lua
new file mode 100644
index 0000000..76d94f3
--- /dev/null
+++ b/infrastructure/init.lua
@@ -0,0 +1,26 @@
+infrastructure = {}
+
+-- Load settings
+dofile(minetest.get_modpath("infrastructure").."/settings.lua")
+
+-- Register nodes
+dofile(minetest.get_modpath("infrastructure").."/nodes.lua")
+-- Register special nodes
+dofile(minetest.get_modpath("infrastructure").."/nodes_extension.lua")
+-- Register advanced devices
+dofile(minetest.get_modpath("infrastructure").."/advanced_road_signs.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_emergency_phone.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_traffic_lights_pedestrians.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_crosswalk_warning_light.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_lane_control_lights.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_curve_chevron.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_crosswalk_lighting.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_crosswalk_safety_sign.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_automatic_warning_device.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_boom_barrier.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_aircraft_warning_light.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_warning_light.lua")
+-- Register crafting recipes
+dofile(minetest.get_modpath("infrastructure").."/crafts.lua")
+
+print("Infrastructure mod loaded succesfully!")
diff --git a/infrastructure/nodes.lua b/infrastructure/nodes.lua
new file mode 100644
index 0000000..e0455ee
--- /dev/null
+++ b/infrastructure/nodes.lua
@@ -0,0 +1,1473 @@
+-- **************************************************************************************************** MATERIALS
+
+-- Asphalt block
+ minetest.register_alias("infrastructure:asphalt", "streets:asphalt")
+
+-- Concrete block
+ minetest.register_alias("infrastructure:concrete", "technic:concrete")
+
+-- Concrete fence
+ minetest.register_alias("infrastructure:fence_concrete", "prefab:concrete_fence")
+
+-- Galvanized steel block
+ minetest.register_node("infrastructure:galvanized_steel", {
+ description = "Galvanized steel",
+ tiles = {"infrastructure_galvanized_steel.png"},
+ drawtype = "normal",
+ paramtype = "light",
+ groups = {cracky = 2},
+ })
+ minetest.register_alias("galvanized_steel", "infrastructure:galvanized_steel")
+
+-- Galvanized steel fence
+ minetest.register_node("infrastructure:fence_galvanized_steel", {
+ description = "Galvanized steel fence",
+ drawtype = "fencelike",
+ tiles = {"infrastructure_galvanized_steel.png"},
+ paramtype = "light",
+ is_ground_content = true,
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8},
+ },
+ groups = {cracky = 2},
+ })
+
+
+-- **************************************************************************************************** PRECAST CONCRETE
+
+-- Concrete seperating wall
+ minetest.register_node("infrastructure:precast_concrete_seperating_wall", {
+ description = "Precast concrete seperating wall",
+ tiles = {"infrastructure_concrete.png"},
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -1/2, -7/16, 5/16, -1/4, 7/16},
+ {-1/16, -1/4, -7/16, 1/16, 1/2, 7/16},
+ {-3/16, -1/2, -5/16, 3/16, 0, -1/4},
+ {-3/16, -1/2, 1/4, 3/16, 0, 5/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-5/16, -1/2, -7/16, 5/16, -1/4, 7/16},
+ {-1/16, -1/4, -7/16, 1/16, 1/2, 7/16},
+ {-3/16, -1/2, -5/16, 3/16, 0, -1/4},
+ {-3/16, -1/2, 1/4, 3/16, 0, 5/16}
+ }
+ }
+ })
+
+-- Concrete cylinder
+ minetest.register_node("infrastructure:precast_concrete_cylinder", {
+ description = "Precast concrete cylinder",
+ tiles = {"infrastructure_concrete.png"},
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ walkable = false,
+ climbable = true,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {3/8, -1/2, -1/2, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, -1/2, -3/8, 1/2, 1/2},
+ {-1/2, -1/2, 3/8, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, -1/2, 1/2, 1/2, -3/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {3/8, -1/2, -1/2, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, -1/2, -3/8, 1/2, 1/2},
+ {-1/2, -1/2, 3/8, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, -1/2, 1/2, 1/2, -3/8}
+ }
+ }
+ })
+
+-- Concrete grid paver
+ minetest.register_node("infrastructure:precast_concrete_grid_paver", {
+ description = "Precast concrete grid paver",
+ tiles = {
+ "infrastructure_grid_paver_top.png",
+ "infrastructure_grid_paver_bottom.png",
+ "infrastructure_concrete.png",
+ "infrastructure_concrete.png",
+ "infrastructure_concrete.png",
+ "infrastructure_concrete.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, -1/2, 1/2, -1/2, 1/2},
+ {-1/2, -1/2 + 1/128, -1/2, 1/2, -1/2 + 1/128, 1/2},
+ {-1/2, -1/2 + 2/128, -1/2, 1/2, -1/2 + 2/128, 1/2},
+ {-1/2, -1/2 + 3/128, -1/2, 1/2, -1/2 + 3/128, 1/2},
+ {-1/2, -1/2 + 4/128, -1/2, 1/2, -1/2 + 4/128, 1/2},
+ {-1/2, -1/2 + 5/128, -1/2, 1/2, -1/2 + 5/128, 1/2},
+ {-1/2, -1/2 + 6/128, -1/2, 1/2, -1/2 + 6/128, 1/2},
+ {-1/2, -1/2 + 7/128, -1/2, 1/2, -1/2 + 7/128, 1/2},
+ {-1/2, -1/2 + 8/128, -1/2, 1/2, -1/2 + 8/128, 1/2},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/2, 1/2, -1/2 + 8/128, 1/2}
+ },
+
+ after_place_node = function(pos)
+ pos.y = pos.y - 1
+ local node = minetest.get_node(pos)
+ if (node.name == "default:dirt_with_grass") then
+ pos.y = pos.y + 1
+ local node = minetest.get_node(pos)
+ node.name = "infrastructure:precast_concrete_grid_paver_with_grass"
+ minetest.swap_node(pos, node)
+ end
+ end
+ })
+
+ minetest.register_node("infrastructure:precast_concrete_grid_paver_with_grass", {
+ description = "Precast concrete grid paver with grass",
+ tiles = {
+ "infrastructure_grid_paver_top.png",
+ "infrastructure_grid_paver_bottom.png",
+ "infrastructure_grid_paver_grass.png",
+ "infrastructure_grid_paver_grass.png",
+ "infrastructure_grid_paver_grass.png",
+ "infrastructure_grid_paver_grass.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2,not_in_creative_inventory = 1},
+ drop = "infrastructure:precast_concrete_grid_paver",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, -1/2, 1/2, -1/2, 1/2},
+ {-1/2, -1/2 + 1/128, -1/2, 1/2, -1/2 + 1/128, 1/2},
+ {-1/2, -1/2 + 2/128, -1/2, 1/2, -1/2 + 2/128, 1/2},
+ {-1/2, -1/2 + 3/128, -1/2, 1/2, -1/2 + 3/128, 1/2},
+ {-1/2, -1/2 + 4/128, -1/2, 1/2, -1/2 + 4/128, 1/2},
+ {-1/2, -1/2 + 5/128, -1/2, 1/2, -1/2 + 5/128, 1/2},
+ {-1/2, -1/2 + 6/128, -1/2, 1/2, -1/2 + 6/128, 1/2},
+ {-1/2, -1/2 + 7/128, -1/2, 1/2, -1/2 + 7/128, 1/2},
+ {-1/2, -1/2 + 8/128, -1/2, 1/2, -1/2 + 8/128, 1/2},
+
+ {-3/8, -1/2, 1/4, -1/8, 0, 1/4},
+ {1/8, -1/2, 1/4, 3/8, 0, 1/4},
+
+ {-1/8, -1/2, 0, 1/8, 0, 0},
+
+ {-3/8, -1/2, -1/4, -1/8, 0, -1/4},
+ {1/8, -1/2, -1/4, 3/8, 0, -1/4},
+
+ {1/4, -1/2, -3/8, 1/4, 0, -1/8},
+ {1/4, -1/2, 1/8, 1/4, 0, 3/8},
+
+ {0, -1/2, -1/8, 0, 0, 1/8},
+
+ {-1/4, -1/2, -3/8, -1/4, 0, -1/8},
+ {-1/4, -1/2, 1/8, -1/4, 0, 3/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/2, 1/2, -1/2 + 8/128, 1/2}
+ },
+
+ on_punch = function(pos, node)
+ local node = minetest.get_node(pos)
+ node.name = "infrastructure:precast_concrete_grid_paver"
+ minetest.swap_node(pos, node)
+ end
+ })
+
+-- **************************************************************************************************** STEEL STRUCTURES
+
+-- Truss
+ minetest.register_node("infrastructure:truss", {
+ description = "Truss",
+ tiles = {"infrastructure_truss.png"},
+ drawtype = "nodebox",
+ paramtype = "light",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
+ {-1/2, 1/2, -1/2, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, 1/2, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, -1/2, -1/2, 1/2, 1/2},
+ {-1/2, -1/2, -1/2, 1/2, -1/2, 1/2},
+ {-1/2, -1/2, -1/2, 1/2, 1/2, -1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}
+ }
+ })
+
+-- Wire netting
+ minetest.register_node("infrastructure:wire_netting", {
+ description = "Wire netting",
+ tiles = {"infrastructure_wire_netting.png"},
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, 0, 1/2, 1/2, 0}
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/8, 1/2, 1/2, 1/8}
+ }
+ })
+
+-- Razor wire
+ minetest.register_node("infrastructure:razor_wire", {
+ description = "Razor wire",
+ tiles = {"infrastructure_razor_wire.png"},
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, 1/2, -1/2, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, -1/2, 1/2, -1/2, 1/2},
+ {-1/2, -1/2, 1/2, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, -1/2, 1/2, 1/2, -1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}
+ },
+
+ walkable = false,
+ damage_per_second = 8
+ })
+
+-- Drainage channel grating
+ minetest.register_node("infrastructure:drainage_channel_grating", {
+ description = "Truss",
+ tiles = {
+ "infrastructure_drainage_channel_grating.png",
+ "infrastructure_drainage_channel_grating.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/2, 0, -3/8, 1/2}
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/2, 0, -3/8, 1/2}
+ }
+ })
+
+-- Louver
+ minetest.register_node("infrastructure:louver_opened", {
+ description = "Louver",
+ tiles = {"infrastructure_galvanized_steel.png"},
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, 7/16, 0, 1/2, 1/2, 1/2},
+ {-1/2, -1/16, 0, 1/2, 0, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, 7/16, 0, 1/2, 1/2, 1/2},
+ {-1/2, -1/16, 0, 1/2, 0, 1/2}
+ }
+ },
+
+ on_punch = function(pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:louver_closed", param2 = node.param2})
+ end
+ })
+
+ minetest.register_node("infrastructure:louver_closed", {
+ tiles = {"infrastructure_galvanized_steel.png"},
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ drop = "infrastructure:louver_opened",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, 1/16, 7/16, 1/2, 1/2, 1/2},
+ {-1/2, -7/16, 7/16, 1/2, 0, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, 1/16, 7/16, 1/2, 1/2, 1/2},
+ {-1/2, -7/16, 7/16, 1/2, 0, 1/2}
+ }
+ },
+
+ on_punch = function(pos, node)
+ minetest.swap_node(pos, {name = "infrastructure:louver_opened", param2 = node.param2})
+ end
+ })
+
+ minetest.register_alias("infrastructure:louver", "infrastructure:louver_opened")
+
+-- Riffled sheet
+ minetest.register_node("infrastructure:riffled_sheet", {
+ description = "Riffled sheet",
+ tiles = {"infrastructure_riffled_sheet.png"},
+ inventory_image = "infrastructure_riffled_sheet.png",
+ wield_image = "infrastructure_riffled_sheet.png",
+ drawtype = "nodebox",
+ paramtype = "light",
+ groups = {cracky = 2, oddly_breakable_by_hand = 1},
+ node_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/2, -1/2, 1/2, -1/2 + 0.001, 1/2}
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-1/2, -1/4, -1/2, 1/2, -1/2 + 0.01, 1/2}
+ }
+ })
+
+-- Corrugated sheet
+ minetest.register_node("infrastructure:corrugated_sheet", {
+ description = "corrugated sheet",
+ tiles = {"infrastructure_corrugated_sheet.png"},
+ inventory_image = "infrastructure_corrugated_sheet.png",
+ wield_image = "infrastructure_corrugated_sheet.png",
+ drawtype = "raillike",
+ paramtype = "light",
+ groups = {cracky = 2, oddly_breakable_by_hand = 1},
+ })
+
+-- **************************************************************************************************** ADVANCED ITEMS
+
+-- Displacement
+ function displacement(pos, placer)
+ local displaced_node = minetest.get_node(pos)
+ local fdir = minetest.dir_to_facedir(placer:get_look_dir())
+ pos.y = pos.y - 1
+ local node = minetest.get_node(pos)
+
+ if ((string.find(node.name, "_three_quarter") ~= nil) or (string.find(node.name, "_displacement_1") ~= nil)) then
+ pos.y = pos.y + 1
+ minetest.set_node(pos, {name = displaced_node.name.."_displacement_1", param2 = fdir})
+ elseif (((string.find(node.name, "slab_") ~= nil) and (string.find(node.name, "_quarter") == nil)) or (string.find(node.name, "_displacement_2") ~= nil)) then
+ pos.y = pos.y + 1
+ minetest.set_node(pos, {name = displaced_node.name.."_displacement_2", param2 = fdir})
+ elseif (((string.find(node.name, "_quarter") ~= nil) and (string.find(node.name, "_three_quarter") == nil)) or (string.find(node.name, "_displacement_3") ~= nil)) then
+ pos.y = pos.y + 1
+ minetest.set_node(pos, {name = displaced_node.name.."_displacement_3", param2 = fdir})
+ end
+ end
+
+-- Raised pavement marker yellow/yellow
+ minetest.register_node("infrastructure:marker_yellow_yellow", {
+ description = "Raised pavement marker with yellow & yellow retroreflectors",
+ tiles = {
+ "infrastructure_marker_top_yellow_yellow.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_side_yellow.png",
+ "infrastructure_marker_side_yellow.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3},
+ walkable = false,
+ light_source = MARKER_LIGHT_RANGE,
+ sunlight_propagates = true,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/8, -1/16, -3/8, 1/8},
+ {-1/16, -1/2, -1/8, 1/16, -7/16, 1/8},
+ {1/16, -1/2, -1/8, 1/8, -3/8, 1/8},
+ {-1/16, -7/16, -1/16, 1/16, -3/8, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/8, -1/16, -3/8, 1/8},
+ {-1/16, -1/2, -1/8, 1/16, -7/16, 1/8},
+ {1/16, -1/2, -1/8, 1/8, -3/8, 1/8},
+ {-1/16, -7/16, -1/16, 1/16, -3/8, 1/16}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:marker_yellow_yellow_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_marker_top_yellow_yellow.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_side_yellow.png",
+ "infrastructure_marker_side_yellow.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ walkable = false,
+ light_source = MARKER_LIGHT_RANGE,
+ sunlight_propagates = true,
+ drop = "infrastructure:marker_yellow_yellow",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/8, -1/16, -3/8 - i/4, 1/8},
+ {-1/16, -1/2 - i/4, -1/8, 1/16, -7/16 - i/4, 1/8},
+ {1/16, -1/2 - i/4, -1/8, 1/8, -3/8 - i/4, 1/8},
+ {-1/16, -7/16 - i/4, -1/16, 1/16, -3/8 - i/4, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/8, -1/16, -3/8 - i/4, 1/8},
+ {-1/16, -1/2 - i/4, -1/8, 1/16, -7/16 - i/4, 1/8},
+ {1/16, -1/2 - i/4, -1/8, 1/8, -3/8 - i/4, 1/8},
+ {-1/16, -7/16 - i/4, -1/16, 1/16, -3/8 - i/4, 1/16}
+ }
+ }
+ })
+ end
+
+-- Raised pavement marker red/yellow
+ minetest.register_node("infrastructure:marker_red_yellow", {
+ description = "Raised pavement marker with red & yellow retroreflectors",
+ tiles = {
+ "infrastructure_marker_top_red_yellow.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_side_yellow.png",
+ "infrastructure_marker_side_red.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3},
+ walkable = false,
+ light_source = MARKER_LIGHT_RANGE,
+ sunlight_propagates = true,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/8, -1/16, -3/8, 1/8},
+ {-1/16, -1/2, -1/8, 1/16, -7/16, 1/8},
+ {1/16, -1/2, -1/8, 1/8, -3/8, 1/8},
+ {-1/16, -7/16, -1/16, 1/16, -3/8, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/8, -1/16, -3/8, 1/8},
+ {-1/16, -1/2, -1/8, 1/16, -7/16, 1/8},
+ {1/16, -1/2, -1/8, 1/8, -3/8, 1/8},
+ {-1/16, -7/16, -1/16, 1/16, -3/8, 1/16}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:marker_red_yellow_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_marker_top_red_yellow.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_bottom_side.png",
+ "infrastructure_marker_side_yellow.png",
+ "infrastructure_marker_side_red.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ walkable = false,
+ light_source = MARKER_LIGHT_RANGE,
+ sunlight_propagates = true,
+ drop = "infrastructure:marker_red_yellow",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/8, -1/16, -3/8 - i/4, 1/8},
+ {-1/16, -1/2 - i/4, -1/8, 1/16, -7/16 - i/4, 1/8},
+ {1/16, -1/2 - i/4, -1/8, 1/8, -3/8 - i/4, 1/8},
+ {-1/16, -7/16 - i/4, -1/16, 1/16, -3/8 - i/4, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/8, -1/16, -3/8 - i/4, 1/8},
+ {-1/16, -1/2 - i/4, -1/8, 1/16, -7/16 - i/4, 1/8},
+ {1/16, -1/2 - i/4, -1/8, 1/8, -3/8 - i/4, 1/8},
+ {-1/16, -7/16 - i/4, -1/16, 1/16, -3/8 - i/4, 1/16}
+ }
+ }
+ })
+ end
+
+-- Retroreflective delineators
+ minetest.register_node("infrastructure:delineator", {
+ description = "Retroreflective delineator",
+ tiles = {
+ "infrastructure_concrete.png",
+ "infrastructure_concrete.png",
+ "infrastructure_delineator_wrapper_right.png",
+ "infrastructure_delineator_wrapper_left.png",
+ "infrastructure_delineator_retroreflector_yellow.png",
+ "infrastructure_delineator_retroreflector_red.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3},
+ light_source = DELINEATOR_LIGHT_RANGE,
+ sunlight_propagates = true,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/8, 1/8, 1/2, -1/16},
+ {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+ {-1/8, -1/2, 1/16, 1/8, 1/2, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/8, 1/8, 1/2, -1/16},
+ {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+ {-1/8, -1/2, 1/16, 1/8, 1/2, 1/8}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ minetest.register_node("infrastructure:delineator_guardrail", {
+ description = "Retroreflective delineator for guardrail",
+ tiles = {
+ "infrastructure_concrete.png",
+ "infrastructure_concrete.png",
+ "infrastructure_delineator_wrapper_right.png",
+ "infrastructure_delineator_wrapper_left.png",
+ "[combine:32x32:0,12=infrastructure_delineator_retroreflector_yellow.png:0,-20=infrastructure_delineator_retroreflector_yellow.png",
+ "[combine:32x32:0,12=infrastructure_delineator_retroreflector_red.png:0,-20=infrastructure_delineator_retroreflector_red.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3},
+ light_source = DELINEATOR_LIGHT_RANGE,
+ sunlight_propagates = true,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -3/8, -1/32, 1/8, 1/8, 1/32},
+ {1/8, -5/8, -1/16, 3/16, -1/4, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -3/8, -1/32, 1/8, 1/8, 1/32},
+ {1/8, -5/8, -1/16, 3/16, -1/4, 1/16}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:delineator_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_concrete.png",
+ "infrastructure_concrete.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_delineator_wrapper_right.png:0,"..tostring(i * 8 - 32).."=infrastructure_delineator_wrapper_right.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_delineator_wrapper_left.png:0,"..tostring(i * 8 - 32).."=infrastructure_delineator_wrapper_left.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_delineator_retroreflector_yellow.png:0,"..tostring(i * 8 - 32).."=infrastructure_delineator_retroreflector_yellow.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_delineator_retroreflector_red.png:0,"..tostring(i * 8 - 32).."=infrastructure_delineator_retroreflector_red.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ light_source = DELINEATOR_LIGHT_RANGE,
+ sunlight_propagates = true,
+ drop = "infrastructure:delineator",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/8, 1/8, 1/2 - i/4, -1/16},
+ {-1/16, -1/2 - i/4, -1/16, 1/16, 1/2 - i/4, 1/16},
+ {-1/8, -1/2 - i/4, 1/16, 1/8, 1/2 - i/4, 1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/8, 1/8, 1/2 - i/4, -1/16},
+ {-1/16, -1/2 - i/4, -1/16, 1/16, 1/2 - i/4, 1/16},
+ {-1/8, -1/2 - i/4, 1/16, 1/8, 1/2 - i/4, 1/8}
+ }
+ }
+ })
+
+ minetest.register_node("infrastructure:delineator_guardrail_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_concrete.png",
+ "infrastructure_concrete.png",
+ "[combine:32x32:0,"..tostring(12 + i * 8).."=infrastructure_delineator_wrapper_right.png:0,"..tostring(i * 8 - 20).."=infrastructure_delineator_wrapper_right.png",
+ "[combine:32x32:0,"..tostring(12 + i * 8).."=infrastructure_delineator_wrapper_left.png:0,"..tostring(i * 8 - 20).."=infrastructure_delineator_wrapper_left.png",
+ "[combine:32x32:0,"..tostring(12 + i * 8).."=infrastructure_delineator_retroreflector_yellow.png:0,"..tostring(i * 8 - 20).."=infrastructure_delineator_retroreflector_yellow.png",
+ "[combine:32x32:0,"..tostring(12 + i * 8).."=infrastructure_delineator_retroreflector_red.png:0,"..tostring(i * 8 - 20).."=infrastructure_delineator_retroreflector_red.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 3, not_in_creative_inventory = 1},
+ light_source = DELINEATOR_LIGHT_RANGE,
+ sunlight_propagates = true,
+ drop = "infrastructure:delineator_guardrail",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -3/8 - i/4, -1/32, 1/8, 1/8 - i/4, 1/32},
+ {1/8, -5/8 - i/4, -1/16, 3/16, -1/4 - i/4, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -3/8 - i/4, -1/32, 1/8, 1/8 - i/4, 1/32},
+ {1/8, -5/8 - i/4, -1/16, 3/16, -1/4 - i/4, 1/16}
+ }
+ }
+ })
+ end
+
+-- Wire rope safety barrier
+ minetest.register_node("infrastructure:wire_rope_safety_barrier", {
+ description = "Wire rope safety barrier",
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_wire_rope_safety_barrier_back.png",
+ "infrastructure_wire_rope_safety_barrier_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ light_source = 1,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/16, 1/8, -1/4, 1/16},
+ {-1/8, -1/2, -1/16, -1/16, -3/16, 1/16},
+ {1/16, -1/2, -1/16, 1/8, 1/16, 1/16},
+ {-1/8, -1/8, -1/16, 1/8, 0, 1/16},
+ {-1/8, -1/8, -1/16, -1/16, 1/2, 1/16},
+ {-1/8, 1/8, -1/16, 1/8, 1/4, 1/16},
+ {1/16, 1/8, -1/16, 1/8, 1/2, 1/16},
+
+ {-1/32, 1/4, -1/2, 1/32, 5/16, 1/2},
+ {-1/32, 0, -1/2, 1/32, 1/16, 1/2},
+ {-1/32, -1/4, -1/2, 1/32, -3/16, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/16, 1/8, 1/2, 1/16},
+
+ {-1/32, 1/4, -1/2, 1/32, 5/16, 1/2},
+ {-1/32, 0, -1/2, 1/32, 1/16, 1/2},
+ {-1/32, -1/4, -1/2, 1/32, -3/16, 1/2}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:wire_rope_safety_barrier_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_wire_rope_safety_barrier_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_wire_rope_safety_barrier_back.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_wire_rope_safety_barrier_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_wire_rope_safety_barrier_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = 1,
+ drop = "infrastructure:wire_rope_safety_barrier",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/16, 1/8, -1/4 - i/4, 1/16},
+ {-1/8, -1/2 - i/4, -1/16, -1/16, -3/16 - i/4, 1/16},
+ {1/16, -1/2 - i/4, -1/16, 1/8, 1/16 - i/4, 1/16},
+ {-1/8, -1/8 - i/4, -1/16, 1/8, 0 - i/4, 1/16},
+ {-1/8, -1/8 - i/4, -1/16, -1/16, 1/2 - i/4, 1/16},
+ {-1/8, 1/8 - i/4, -1/16, 1/8, 1/4 - i/4, 1/16},
+ {1/16, 1/8 - i/4, -1/16, 1/8, 1/2 - i/4, 1/16},
+
+ {-1/32, 1/4 - i/4, -1/2, 1/32, 5/16 - i/4, 1/2},
+ {-1/32, 0 - i/4, -1/2, 1/32, 1/16 - i/4, 1/2},
+ {-1/32, -1/4 - i/4, -1/2, 1/32, -3/16 - i/4, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/16, 1/8, 1/2 - i/4, 1/16},
+
+ {-1/32, 1/4 - i/4, -1/2, 1/32, 5/16 - i/4, 1/2},
+ {-1/32, 0 - i/4, -1/2, 1/32, 1/16 - i/4, 1/2},
+ {-1/32, -1/4 - i/4, -1/2, 1/32, -3/16 - i/4, 1/2}
+ }
+ }
+ })
+ end
+
+-- Cable barrier terminal
+ minetest.register_node("infrastructure:cable_barrier_terminal", {
+ description = "Cable barrier terminal",
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_cable_barrier_terminal_back.png",
+ "infrastructure_cable_barrier_terminal_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ light_source = 1,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+ {-1/4, -3/8, -1/4, 1/4, 1/2, -1/8},
+ {-1/4, -3/8, -1/8, -3/16, 0, 1/8},
+ {3/16, -3/8, -1/8, 1/4, 0, 1/8},
+
+ {-1/16, 7/32, -3/8, 1/16, 11/32, 1/4},
+ {-1/16, -1/32, -3/8, 1/16, 3/32, 1/4},
+ {-1/16, -9/32, -3/8, 1/16, -5/32, 1/4},
+
+ {-1/32, 1/4, 0, 1/32, 5/16, 1/2},
+ {-1/32, 0, 0, 1/32, 1/16, 1/2},
+ {-1/32, -1/4, 0, 1/32, -3/16, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+ {-1/4, -3/8, -1/4, 1/4, 1/2, -1/8},
+ {-1/4, -3/8, -1/8, -3/16, 0, 1/8},
+ {3/16, -3/8, -1/8, 1/4, 0, 1/8},
+
+ {-1/16, 7/32, -3/8, 1/16, 11/32, 1/4},
+ {-1/16, -1/32, -3/8, 1/16, 3/32, 1/4},
+ {-1/16, -9/32, -3/8, 1/16, -5/32, 1/4},
+
+ {-1/32, 1/4, 0, 1/32, 5/16, 1/2},
+ {-1/32, 0, 0, 1/32, 1/16, 1/2},
+ {-1/32, -1/4, 0, 1/32, -3/16, 1/2}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:cable_barrier_terminal_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_cable_barrier_terminal_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_cable_barrier_terminal_back.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_cable_barrier_terminal_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_cable_barrier_terminal_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = 1,
+ drop = "infrastructure:cable_barrier_terminal",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2 - i/4, -1/2, 1/4, -3/8 - i/4, 1/2},
+ {-1/4, -3/8 - i/4, -1/4, 1/4, 1/2 - i/4, -1/8},
+ {-1/4, -3/8 - i/4, -1/8, -3/16, 0 - i/4, 1/8},
+ {3/16, -3/8 - i/4, -1/8, 1/4, 0 - i/4, 1/8},
+
+ {-1/16, 7/32 - i/4, -3/8, 1/16, 11/32 - i/4, 1/4},
+ {-1/16, -1/32 - i/4, -3/8, 1/16, 3/32 - i/4, 1/4},
+ {-1/16, -9/32 - i/4, -3/8, 1/16, -5/32 - i/4, 1/4},
+
+ {-1/32, 1/4 - i/4, 0, 1/32, 5/16 - i/4, 1/2},
+ {-1/32, 0 - i/4, 0, 1/32, 1/16 - i/4, 1/2},
+ {-1/32, -1/4 - i/4, 0, 1/32, -3/16 - i/4, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2 - i/4, -1/2, 1/4, -3/8 - i/4, 1/2},
+ {-1/4, -3/8 - i/4, -1/4, 1/4, 1/2 - i/4, -1/8},
+ {-1/4, -3/8 - i/4, -1/8, -3/16, 0 - i/4, 1/8},
+ {3/16, -3/8 - i/4, -1/8, 1/4, 0 - i/4, 1/8},
+
+ {-1/16, 7/32 - i/4, -3/8, 1/16, 11/32 - i/4, 1/4},
+ {-1/16, -1/32 - i/4, -3/8, 1/16, 3/32 - i/4, 1/4},
+ {-1/16, -9/32 - i/4, -3/8, 1/16, -5/32 - i/4, 1/4},
+
+ {-1/32, 1/4 - i/4, 0, 1/32, 5/16 - i/4, 1/2},
+ {-1/32, 0 - i/4, 0, 1/32, 1/16 - i/4, 1/2},
+ {-1/32, -1/4 - i/4, 0, 1/32, -3/16 - i/4, 1/2}
+ }
+ }
+ })
+ end
+
+-- Corrugated guide rail
+ minetest.register_node("infrastructure:corrugated_guide_rail", {
+ description = "Corrugated guide rail",
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_corrugated_guide_rail_side.png",
+ "infrastructure_corrugated_guide_rail_side.png",
+ "infrastructure_corrugated_guide_rail_back.png",
+ "infrastructure_corrugated_guide_rail_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ light_source = 1,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/8, 1/8, 1/2, -1/16},
+ {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+ {-1/8, -1/2, 1/16, 1/8, 1/2, 1/8},
+
+ {-1/2, 1/4, -1/4, 1/2, 3/8, -1/8},
+ {-1/2, 1/8, -3/8, 1/2, 1/4, -1/4},
+ {-1/2, 0, -1/4, 1/2, 1/8, -1/8},
+ {-1/2, -1/8, -3/8, 1/2, 0, -1/4},
+ {-1/2, -1/4, -1/4, 1/2, -1/8, -1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8},
+
+ {-1/2, 1/4, -1/4, 1/2, 3/8, -1/8},
+ {-1/2, 1/8, -3/8, 1/2, 1/4, -1/4},
+ {-1/2, 0, -1/4, 1/2, 1/8, -1/8},
+ {-1/2, -1/8, -3/8, 1/2, 0, -1/4},
+ {-1/2, -1/4, -1/4, 1/2, -1/8, -1/8}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:corrugated_guide_rail_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_corrugated_guide_rail_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_corrugated_guide_rail_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_corrugated_guide_rail_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_corrugated_guide_rail_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_corrugated_guide_rail_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_corrugated_guide_rail_back.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_corrugated_guide_rail_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_corrugated_guide_rail_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = 1,
+ drop = "infrastructure:corrugated_guide_rail",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/8, 1/8, 1/2 - i/4, -1/16},
+ {-1/16, -1/2 - i/4, -1/16, 1/16, 1/2 - i/4, 1/16},
+ {-1/8, -1/2 - i/4, 1/16, 1/8, 1/2 - i/4, 1/8},
+
+ {-1/2, 1/4 - i/4, -1/4, 1/2, 3/8 - i/4, -1/8},
+ {-1/2, 1/8 - i/4, -3/8, 1/2, 1/4 - i/4, -1/4},
+ {-1/2, 0 - i/4, -1/4, 1/2, 1/8 - i/4, -1/8},
+ {-1/2, -1/8 - i/4, -3/8, 1/2, 0 - i/4, -1/4},
+ {-1/2, -1/4 - i/4, -1/4, 1/2, -1/8 - i/4, -1/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/8, -1/2 - i/4, -1/8, 1/8, 1/2 - i/4, 1/8},
+
+ {-1/2, 1/4 - i/4, -1/4, 1/2, 3/8 - i/4, -1/8},
+ {-1/2, 1/8 - i/4, -3/8, 1/2, 1/4 - i/4, -1/4},
+ {-1/2, 0 - i/4, -1/4, 1/2, 1/8 - i/4, -1/8},
+ {-1/2, -1/8 - i/4, -3/8, 1/2, 0 - i/4, -1/4},
+ {-1/2, -1/4 - i/4, -1/4, 1/2, -1/8 - i/4, -1/8}
+ }
+ }
+ })
+ end
+
+-- Energy absorbing terminal
+ minetest.register_node("infrastructure:energy_absorbing_terminal", {
+ description = "Energy absorbing terminal",
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_energy_absorbing_terminal_back.png",
+ "infrastructure_energy_absorbing_terminal_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/4, 1/8, 0, 1/2, 1/4},
+ {-3/8, -1/4, 1/4, -1/8, 3/8, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/4, 1/8, 0, 1/2, 1/4},
+ {-3/8, -1/4, 1/4, -1/8, 3/8, 1/2}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ minetest.register_node("infrastructure:energy_absorbing_terminal_inversed", {
+ description = "Energy absorbing terminal inversed",
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_energy_absorbing_terminal_back.png",
+ "infrastructure_energy_absorbing_terminal_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {0, -1/4, 1/8, 1/2, 1/2, 1/4},
+ {1/8, -1/4, 1/4, 3/8, 3/8, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {0, -1/4, 1/8, 1/2, 1/2, 1/4},
+ {1/8, -1/4, 1/4, 3/8, 3/8, 1/2}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:energy_absorbing_terminal_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_energy_absorbing_terminal_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_energy_absorbing_terminal_back.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_energy_absorbing_terminal_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_energy_absorbing_terminal_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+ drop = "infrastructure:energy_absorbing_terminal",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/4 - i/4, 1/8, 0, 1/2 - i/4, 1/4},
+ {-3/8, -1/4 - i/4, 1/4, -1/8, 3/8 - i/4, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/4 - i/4, 1/8, 0, 1/2 - i/4, 1/4},
+ {-3/8, -1/4 - i/4, 1/4, -1/8, 3/8 - i/4, 1/2}
+ }
+ }
+ })
+
+ minetest.register_node("infrastructure:energy_absorbing_terminal_inversed_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_energy_absorbing_terminal_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_energy_absorbing_terminal_back.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_energy_absorbing_terminal_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_energy_absorbing_terminal_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+ drop = "infrastructure:energy_absorbing_terminal_inversed",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {0, -1/4 - i/4, 1/8, 1/2, 1/2 - i/4, 1/4},
+ {1/8, -1/4 - i/4, 1/4, 3/8, 3/8 - i/4, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {0, -1/4 - i/4, 1/8, 1/2, 1/2 - i/4, 1/4},
+ {1/8, -1/4 - i/4, 1/4, 3/8, 3/8 - i/4, 1/2}
+ }
+ }
+ })
+ end
+
+-- Fitch barrel
+ minetest.register_node("infrastructure:fitch_barrel", {
+ description = "Fitch barrel",
+ tiles = {
+ "infrastructure_fitch_barrel_top.png",
+ "infrastructure_fitch_barrel_bottom.png",
+ "infrastructure_fitch_barrel_side.png",
+ "infrastructure_fitch_barrel_side.png",
+ "infrastructure_fitch_barrel_side.png",
+ "infrastructure_fitch_barrel_side.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ groups = {cracky = 2},
+ light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {-3/8, -1/2, -3/8, 3/8, 1/2, 3/8}
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-3/8, -1/2, -3/8, 3/8, 1/2, 3/8}
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:fitch_barrel_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_fitch_barrel_top.png",
+ "infrastructure_fitch_barrel_bottom.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_fitch_barrel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_fitch_barrel_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_fitch_barrel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_fitch_barrel_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_fitch_barrel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_fitch_barrel_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_fitch_barrel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_fitch_barrel_side.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+ drop = "infrastructure:fitch_barrel",
+ node_box = {
+ type = "fixed",
+ fixed = {-3/8, -1/2 - i/4, -3/8, 3/8, 1/2 - i/4, 3/8}
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-3/8, -1/2 - i/4, -3/8, 3/8, 1/2 - i/4, 3/8}
+ }
+ })
+ end
+
+-- Crowd control barricade
+ minetest.register_node("infrastructure:crowd_control_barricade", {
+ description = "Crowd control barricade",
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_crowd_control_barricade_back.png",
+ "infrastructure_crowd_control_barricade_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ light_source = 1,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/4, 0, 1/2, 1/2, 0},
+
+ {-7/16, -1/2, -1/32, -3/8, 1/8, 1/32},
+ {3/8, -1/2, -1/32, 7/16, 1/8, 1/32},
+
+ {-7/16, -1/2, -1/4, -3/8, -7/16, 1/4},
+ {3/8, -1/2, -1/4, 7/16, -7/16, 1/4}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/4, 0, 1/2, 1/2, 0},
+
+ {-7/16, -1/2, -1/32, -3/8, 1/8, 1/32},
+ {3/8, -1/2, -1/32, 7/16, 1/8, 1/32},
+
+ {-7/16, -1/2, -1/4, -3/8, -7/16, 1/4},
+ {3/8, -1/2, -1/4, 7/16, -7/16, 1/4}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:crowd_control_barricade_"..tostring(i), {
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_crowd_control_barricade_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_crowd_control_barricade_back.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_crowd_control_barricade_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_crowd_control_barricade_front.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = 1,
+ drop = "infrastructure:crowd_control_barricade",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/4 - i/4, 0, 1/2, 1/2 - i/4, 0},
+
+ {-7/16, -1/2 - i/4, -1/32, -3/8, 1/8 - i/4, 1/32},
+ {3/8, -1/2 - i/4, -1/32, 7/16, 1/8 - i/4, 1/32},
+
+ {-7/16, -1/2 - i/4, -1/4, -3/8, -7/16 - i/4, 1/4},
+ {3/8, -1/2 - i/4, -1/4, 7/16, -7/16 - i/4, 1/4}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/4 - i/4, 0, 1/2, 1/2 - i/4, 0},
+
+ {-7/16, -1/2 - i/4, -1/32, -3/8, 1/8 - i/4, 1/32},
+ {3/8, -1/2 - i/4, -1/32, 7/16, 1/8 - i/4, 1/32},
+
+ {-7/16, -1/2 - i/4, -1/4, -3/8, -7/16 - i/4, 1/4},
+ {3/8, -1/2 - i/4, -1/4, 7/16, -7/16 - i/4, 1/4}
+ }
+ }
+ })
+ end
+
+-- Anti-dazzling panel
+ minetest.register_node("infrastructure:anti_dazzling_panel", {
+ description = "Anti-dazzling panel",
+ tiles = {
+ "infrastructure_anti_dazzling_panel_top_bottom.png",
+ "infrastructure_anti_dazzling_panel_top_bottom.png",
+ "infrastructure_anti_dazzling_panel_side.png",
+ "infrastructure_anti_dazzling_panel_side.png",
+ "infrastructure_anti_dazzling_panel_side.png",
+ "infrastructure_anti_dazzling_panel_side.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ light_source = 1,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2, 0, 1/4, 1/2, 0},
+ {-1/8, -1/2, -1/16, 1/8, -3/8, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2, 0, 1/4, 1/2, 0},
+ {-1/8, -1/2, -1/16, 1/8, -3/8, 1/16}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:anti_dazzling_panel_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_anti_dazzling_panel_top_bottom.png",
+ "infrastructure_anti_dazzling_panel_top_bottom.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ light_source = 1,
+ drop = "infrastructure:anti_dazzling_panel",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2 - i/4, 0, 1/4, 1/2 - i/4, 0},
+ {-1/8, -1/2 - i/4, -1/16, 1/8, -3/8 - i/4, 1/16}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2 - i/4, 0, 1/4, 1/2 - i/4, 0},
+ {-1/8, -1/2 - i/4, -1/16, 1/8, -3/8 - i/4, 1/16}
+ }
+ }
+ })
+ end
+
+-- Traffic cone
+ minetest.register_node("infrastructure:traffic_cone", {
+ description = "Traffic cone",
+ tiles = {
+ "infrastructure_traffic_cone_top.png",
+ "infrastructure_traffic_cone_bottom.png",
+ "infrastructure_traffic_cone_side.png",
+ "infrastructure_traffic_cone_side.png",
+ "infrastructure_traffic_cone_side.png",
+ "infrastructure_traffic_cone_side.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ groups = {cracky = 2},
+ walkable = false,
+ light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2, 0, 1/4, 1/4, 0},
+ {0, -1/2, -1/4, 0, 1/4, 1/4},
+
+ {-3/8, -1/2, -1/8, 3/8, -3/8, 1/8},
+ {-1/8, -1/2, -3/8, 1/8, -3/8, 3/8},
+
+ {-3/8, -1/2 + 0.001, -3/8, 3/8, -1/2 + 0.001, 3/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2, 0, 1/4, 1/4, 0},
+ {0, -1/2, -1/4, 0, 1/4, 1/4},
+
+ {-3/8, -1/2, -1/8, 3/8, -3/8, 1/8},
+ {-1/8, -1/2, -3/8, 1/8, -3/8, 3/8},
+
+ {-3/8, -1/2 + 0.001, -3/8, 3/8, -1/2 + 0.001, 3/8}
+ }
+ },
+
+ after_place_node = function(pos, placer)
+ displacement(pos, placer)
+ end
+ })
+
+ for i = 1, 3 do
+ minetest.register_node("infrastructure:traffic_cone_displacement_"..tostring(i), {
+ tiles = {
+ "infrastructure_traffic_cone_top.png",
+ "infrastructure_traffic_cone_bottom.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_traffic_cone_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_traffic_cone_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_traffic_cone_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_traffic_cone_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_traffic_cone_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_traffic_cone_side.png",
+ "[combine:32x32:0,"..tostring(i * 8).."=infrastructure_traffic_cone_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_traffic_cone_side.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ groups = {cracky = 2, not_in_creative_inventory = 1},
+ walkable = false,
+ light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+ drop = "infrastructure:traffic_cone",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2 - i/4, 0, 1/4, 1/4 - i/4, 0},
+ {0, -1/2 - i/4, -1/4, 0, 1/4 - i/4, 1/4},
+
+ {-3/8, -1/2 - i/4, -1/8, 3/8, -3/8 - i/4, 1/8},
+ {-1/8, -1/2 - i/4, -3/8, 1/8, -3/8 - i/4, 3/8},
+
+ {-3/8, -1/2 + 0.001 - i/4, -3/8, 3/8, -1/2 + 0.001 - i/4, 3/8}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/4, -1/2 - i/4, 0, 1/4, 1/4 - i/4, 0},
+ {0, -1/2 - i/4, -1/4, 0, 1/4 - i/4, 1/4},
+
+ {-3/8, -1/2 - i/4, -1/8, 3/8, -3/8 - i/4, 1/8},
+ {-1/8, -1/2 - i/4, -3/8, 1/8, -3/8 - i/4, 3/8},
+
+ {-3/8, -1/2 + 0.001 - i/4, -3/8, 3/8, -1/2 + 0.001 - i/4, 3/8}
+ }
+ }
+ })
+ end
+
+-- Noise barrier
+ minetest.register_node("infrastructure:noise_barrier", {
+ description = "Noise barrier",
+ tiles = {
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_galvanized_steel.png",
+ "infrastructure_noise_barrier.png",
+ "infrastructure_noise_barrier.png"
+ },
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ groups = {cracky = 2},
+ light_source = 1,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 5/16, 1/2, 1/2, 7/16},
+
+ {-1/2, -1/2, 1/4, 1/2, -7/16, 1/2},
+ {-1/2, 7/16, 1/4, 1/2, 1/2, 1/2},
+ {-1/2, -1/2, 1/4, -7/16, 1/2, 1/2},
+ {7/16, -1/2, 1/4, 1/2, 1/2, 1/2}
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-1/2, -1/2, 1/4, 1/2, 1/2, 1/2},
+ }
+ }
+ })
diff --git a/infrastructure/nodes_extension.lua b/infrastructure/nodes_extension.lua
new file mode 100644
index 0000000..8eebdba
--- /dev/null
+++ b/infrastructure/nodes_extension.lua
@@ -0,0 +1,162 @@
+-- **************************************************************************************************** MATERIALS
+
+-- Galvanized steel stair, slab, panel and microblock
+ register_stair_slab_panel_micro("infrastructure", "galvanized_steel", "infrastructure:galvanized_steel",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=2},
+ {"infrastructure_galvanized_steel.png"},
+ "Galvanized steel",
+ "galvanized_steel",
+ 0)
+
+-- **************************************************************************************************** CENTER LINES
+
+-- Asphalt stair, slab, panel and microblock with center solid line
+ register_stair_slab_panel_micro("infrastructure", "asphalt_center_solid_line", "infrastructure:asphalt_center_solid_line",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {
+ "streets_asphalt.png^infrastructure_single_yellow_line.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png"
+ },
+ "Asphalt with center solid line",
+ "asphalt_center_solid_line",
+ 0)
+
+-- Asphalt stair, slab, panel and microblock with center solid line on one side
+ register_stair_slab_panel_micro("infrastructure", "asphalt_center_solid_one_side", "infrastructure:asphalt_center_solid_one_side",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {
+ "streets_asphalt.png^infrastructure_solid_yellow_line_one_side.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png"
+ },
+ "Asphalt with center solid line on one side",
+ "asphalt_center_solid_one_side",
+ 0)
+
+-- Asphalt stair, slab, panel and microblock with center solid double line
+ register_stair_slab_panel_micro("infrastructure", "asphalt_center_solid_double", "infrastructure:asphalt_center_solid_double",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {
+ "streets_asphalt.png^infrastructure_double_yellow_line.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png"
+ },
+ "Asphalt with center solid double line",
+ "asphalt_center_solid_double",
+ 0)
+
+-- Asphalt block with center corner single line
+ register_stair_slab_panel_micro("infrastructure", "asphalt_center_corner_single", "infrastructure:asphalt_center_corner_single",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {
+ "streets_asphalt.png^infrastructure_single_yellow_line_corner.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png"
+ },
+ "Asphalt with center corner single line",
+ "asphalt_center_corner_single",
+ 0)
+
+-- Asphalt block with center corner double line
+ register_stair_slab_panel_micro("infrastructure", "asphalt_center_corner_double", "infrastructure:asphalt_center_corner_double",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {
+ "streets_asphalt.png^infrastructure_solid_double_yellow_line_corner.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png",
+ "streets_asphalt.png"
+ },
+ "Asphalt with center corner double line",
+ "asphalt_center_corner_double",
+ 0)
+
+-- **************************************************************************************************** TRAFFIC MARKS
+
+-- Asphalt stair, slab, panel and microblock with arrow straight
+ register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_straight", "infrastructure:asphalt_arrow_straight",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {"streets_arrow_straight.png", "infrastructure_asphalt.png"},
+ "Asphalt with arrow straight",
+ "asphalt_arrow_straight",
+ 0)
+
+-- Asphalt stair, slab, panel and microblock with arrow straight + left
+ register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_straight_left", "infrastructure:asphalt_arrow_straight_left",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {"streets_asphalt.png^streets_arrow_straight_left.png", "infrastructure_asphalt.png"},
+ "Asphalt with arrow straight + left",
+ "asphalt_arrow_straight_left",
+ 0)
+
+-- Asphalt stair, slab, panel and microblock with arrow straight + right
+ register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_straight_right", "infrastructure:asphalt_arrow_straight_right",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {"streets_asphalt.png^streets_arrow_straight_right.png", "infrastructure_asphalt.png"},
+ "Asphalt with arrow straight + right",
+ "asphalt_arrow_straight_right",
+ 0)
+
+-- Asphalt stair, slab, panel and microblock with arrow left
+ register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_left", "infrastructure:asphalt_arrow_left",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {"streets_asphalt.png^streets_arrow_left.png", "infrastructure_asphalt.png"},
+ "Asphalt with arrow left",
+ "asphalt_arrow_left",
+ 0)
+
+-- Asphalt stair, slab, panel and microblock with arrow right
+ register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_right", "infrastructure:asphalt_arrow_right",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {"streets_asphalt.png^streets_arrow_right.png", "infrastructure_asphalt.png"},
+ "Asphalt with arrow right",
+ "asphalt_arrow_right",
+ 0)
+
+-- Asphalt stair, slab, panel and microblock with "P"-sign
+ register_stair_slab_panel_micro("infrastructure", "asphalt_parking", "infrastructure:asphalt_parking",
+ {not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+ {"streets_asphalt.png^streets_parking.png", "infrastructure_asphalt.png"},
+ "Asphalt with a parking sign",
+ "asphalt_parking",
+ 0)
+
+-- Register known infrastructure nodes in circular saw if avaiable
+ if circular_saw then
+ for i,v in ipairs({
+-- Materials
+ "asphalt",
+ "concrete",
+ "galvanized_steel",
+-- Center lines
+ "asphalt_center_dashed",
+ "asphalt_center_solid",
+ "asphalt_center_solid_one_side",
+ "asphalt_center_solid_double",
+ "asphalt_center_corner_single",
+ "asphalt_center_corner_double",
+-- Traffic marks
+ "asphalt_arrow_straight",
+ "asphalt_arrow_straight_left",
+ "asphalt_arrow_straight_right",
+ "asphalt_arrow_left",
+ "asphalt_arrow_right",
+ "asphalt_parking"
+ }) do
+ table.insert(circular_saw.known_stairs, "infrastructure:"..v);
+ end
+ end
diff --git a/infrastructure/settings.lua b/infrastructure/settings.lua
new file mode 100644
index 0000000..1433e22
--- /dev/null
+++ b/infrastructure/settings.lua
@@ -0,0 +1,49 @@
+-- This file stores all settings for the "Infrastructure mod"
+
+-- Stairs, slabs, panels and microblocks
+ NOT_IN_CREATIVE_INVENTORY = 1 -- an integer 0 or 1 -> default = 1 | Do you want it to be hide in your creative inventory?
+
+-- Raised pavement marker
+ MARKER_LIGHT_RANGE = 4 -- an integer -> default = 4 | How much light do you want it to give?
+
+-- Retroreflective delineator
+ DELINEATOR_LIGHT_RANGE = 8 -- an integer -> default = 8 | How much light do you want it to give?
+
+-- Energy absorbing terminal
+ ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE = 8 -- an integer -> default = 8 | How much light do you want it to give?
+
+-- Emergency phone
+ ENABLE_EMERGENCY_PHONE = true -- true or false -> default = true | Do you want it to be enabled in your game?
+ HEALTH_TO_TRIGGER = 5 -- an integer -> default = 5 | When will the player be healed? How low must his health be?
+ HEALTH_TO_RESTORING = 10 -- an integer -> default = 10 | To what will the health be set?
+ EMERGENCY_PHONE_LIGHT_RANGE = 12 -- an integer -> default = 12 | How much light do you want it to give?
+ EMERGENCY_PHONE_VOLUME = 0.1 -- a float -> default = 0.1 | How noisy should be the dialing sound?
+
+-- Traffic lights
+ TRAFFIC_LIGHTS_LIGHT_RANGE = 12 -- an integer -> default = 12 | How much light do you want it to give?
+ TRAFFIC_LIGHTS_VOLUME = 0 -- a float -> default = 0.1 | How noisy should be the beep sound?
+
+-- Automatic warning device
+ AUTOMATIC_WARNING_DEVICE_LIGHT_RANGE = 12 -- an integer -> default = 12 | How much light do you want it to give?
+ AUTOMATIC_WARNING_DEVICE_VOLUME = 0.5 -- a float -> default = 0.5 | How noisy should be the bell sound?
+
+-- Boom barrier
+ BOOM_BARRIER_LIGHT_RANGE = 6 -- an integer -> default = 6 | How much light do you want it to give?
+ BOOM_BARRIER_VOLUME = 0.4 -- a float -> default = 0.1 | How noisy should be the mechanism sound?
+
+-- Curve chevron
+ CURVE_CHEVRON_LIGHT_RANGE = 12 -- an integer -> default = 12 | How much light do you want it to give?
+
+-- Crosswalk lighting
+ CROSSWALK_LIGHTING_LIGHT_RANGE = 15 -- an integer -> default = 15 | How much light do you want it to give?
+
+-- Crosswalk safety sign
+ CROSSWALK_SAFETY_SIGN_LIGHT_RANGE = 8 -- an integer -> default = 8 | How much light do you want it to give?
+
+-- Crosswalk safety sign
+ RETROREFLECTIVE_SURFACE_LIGHT_RANGE = 8 -- an integer -> default = 8 | How much light do you want it to give?
+
+-- Aircraft warning light
+ AIRCRAFT_WARNING_LIGHT_LIGHT_RANGE = 15 -- an integer -> default = 15 | How much light do you want it to give?
+-- Warning light
+ WARNING_LIGHT_LIGHT_RANGE = 15 -- an integer -> default = 15 | How much light do you want it to give?
diff --git a/infrastructure/sounds/infrastructure_automatic_warning_device.ogg b/infrastructure/sounds/infrastructure_automatic_warning_device.ogg
new file mode 100644
index 0000000..71d1679
--- /dev/null
+++ b/infrastructure/sounds/infrastructure_automatic_warning_device.ogg
Binary files differ
diff --git a/infrastructure/sounds/infrastructure_boom_barrier.ogg b/infrastructure/sounds/infrastructure_boom_barrier.ogg
new file mode 100644
index 0000000..4106df2
--- /dev/null
+++ b/infrastructure/sounds/infrastructure_boom_barrier.ogg
Binary files differ
diff --git a/infrastructure/sounds/infrastructure_ebell.ogg b/infrastructure/sounds/infrastructure_ebell.ogg
new file mode 100644
index 0000000..d59d1b9
--- /dev/null
+++ b/infrastructure/sounds/infrastructure_ebell.ogg
Binary files differ
diff --git a/infrastructure/sounds/infrastructure_emergency_phone.ogg b/infrastructure/sounds/infrastructure_emergency_phone.ogg
new file mode 100644
index 0000000..7e84eb2
--- /dev/null
+++ b/infrastructure/sounds/infrastructure_emergency_phone.ogg
Binary files differ
diff --git a/infrastructure/sounds/infrastructure_traffic_lights_1.ogg b/infrastructure/sounds/infrastructure_traffic_lights_1.ogg
new file mode 100644
index 0000000..d790e9a
--- /dev/null
+++ b/infrastructure/sounds/infrastructure_traffic_lights_1.ogg
Binary files differ
diff --git a/infrastructure/sounds/infrastructure_traffic_lights_2.ogg b/infrastructure/sounds/infrastructure_traffic_lights_2.ogg
new file mode 100644
index 0000000..8fa7753
--- /dev/null
+++ b/infrastructure/sounds/infrastructure_traffic_lights_2.ogg
Binary files differ
diff --git a/infrastructure/textures/infrastructure_aircraft_warning_light_side_anim.png b/infrastructure/textures/infrastructure_aircraft_warning_light_side_anim.png
new file mode 100644
index 0000000..40c1558
--- /dev/null
+++ b/infrastructure/textures/infrastructure_aircraft_warning_light_side_anim.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_aircraft_warning_light_top_anim.png b/infrastructure/textures/infrastructure_aircraft_warning_light_top_anim.png
new file mode 100644
index 0000000..8f223dc
--- /dev/null
+++ b/infrastructure/textures/infrastructure_aircraft_warning_light_top_anim.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_anti_dazzling_panel_side.png b/infrastructure/textures/infrastructure_anti_dazzling_panel_side.png
new file mode 100644
index 0000000..5965006
--- /dev/null
+++ b/infrastructure/textures/infrastructure_anti_dazzling_panel_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_anti_dazzling_panel_top_bottom.png b/infrastructure/textures/infrastructure_anti_dazzling_panel_top_bottom.png
new file mode 100644
index 0000000..0f257bd
--- /dev/null
+++ b/infrastructure/textures/infrastructure_anti_dazzling_panel_top_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_asphalt.png b/infrastructure/textures/infrastructure_asphalt.png
new file mode 100644
index 0000000..2906a0d
--- /dev/null
+++ b/infrastructure/textures/infrastructure_asphalt.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device.png b/infrastructure/textures/infrastructure_automatic_warning_device.png
new file mode 100644
index 0000000..d5f6c62
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_bottom.png b/infrastructure/textures/infrastructure_automatic_warning_device_bottom.png
new file mode 100644
index 0000000..87ddf0c
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle.png
new file mode 100644
index 0000000..5185a29
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_anim.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_anim.png
new file mode 100644
index 0000000..575ebca
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_anim.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_off.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_off.png
new file mode 100644
index 0000000..ac85b26
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_off.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_side.png
new file mode 100644
index 0000000..7c50472
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_anim.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_anim.png
new file mode 100644
index 0000000..6d6851b
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_anim.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_off.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_off.png
new file mode 100644
index 0000000..3acc761
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_off.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_side.png
new file mode 100644
index 0000000..8d73676
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_anim.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_anim.png
new file mode 100644
index 0000000..5517f0d
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_anim.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_off.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_off.png
new file mode 100644
index 0000000..d3e378a
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_off.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_side.png
new file mode 100644
index 0000000..cb6a9bc
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_side.png
new file mode 100644
index 0000000..469addf
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_middle_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_top.png b/infrastructure/textures/infrastructure_automatic_warning_device_top.png
new file mode 100644
index 0000000..a9fb96f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_top_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_top_side.png
new file mode 100644
index 0000000..49412ec
--- /dev/null
+++ b/infrastructure/textures/infrastructure_automatic_warning_device_top_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_anim_darkfirst.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_anim_darkfirst.png
new file mode 100644
index 0000000..70b1cd3
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_arm_h_anim_darkfirst.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_anim_lightfirst.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_anim_lightfirst.png
new file mode 100644
index 0000000..ea7368e
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_arm_h_anim_lightfirst.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_bottom_front_back.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_bottom_front_back.png
new file mode 100644
index 0000000..e283612
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_arm_h_bottom_front_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_bright.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_bright.png
new file mode 100644
index 0000000..0e6e50c
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_bright.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_top.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_top.png
new file mode 100644
index 0000000..5f997a4
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_arm_h_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_v_left.png b/infrastructure/textures/infrastructure_boom_barrier_arm_v_left.png
new file mode 100644
index 0000000..87b3bbb
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_arm_v_left.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_v_right.png b/infrastructure/textures/infrastructure_boom_barrier_arm_v_right.png
new file mode 100644
index 0000000..c777597
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_arm_v_right.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_bottom.png b/infrastructure/textures/infrastructure_boom_barrier_h_bottom.png
new file mode 100644
index 0000000..c7fbfea
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_h_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_front_back.png b/infrastructure/textures/infrastructure_boom_barrier_h_front_back.png
new file mode 100644
index 0000000..5d019fc
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_h_front_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_left.png b/infrastructure/textures/infrastructure_boom_barrier_h_left.png
new file mode 100644
index 0000000..08348fb
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_h_left.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_right.png b/infrastructure/textures/infrastructure_boom_barrier_h_right.png
new file mode 100644
index 0000000..5399be8
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_h_right.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_top.png b/infrastructure/textures/infrastructure_boom_barrier_h_top.png
new file mode 100644
index 0000000..7796232
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_h_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_v_bottom.png b/infrastructure/textures/infrastructure_boom_barrier_v_bottom.png
new file mode 100644
index 0000000..9ae9ed3
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_v_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_v_front_back.png b/infrastructure/textures/infrastructure_boom_barrier_v_front_back.png
new file mode 100644
index 0000000..d7b7a3b
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_v_front_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_v_left.png b/infrastructure/textures/infrastructure_boom_barrier_v_left.png
new file mode 100644
index 0000000..4ddd606
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_v_left.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_v_right.png b/infrastructure/textures/infrastructure_boom_barrier_v_right.png
new file mode 100644
index 0000000..91c5600
--- /dev/null
+++ b/infrastructure/textures/infrastructure_boom_barrier_v_right.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_cable_barrier_terminal_back.png b/infrastructure/textures/infrastructure_cable_barrier_terminal_back.png
new file mode 100644
index 0000000..5f90cf2
--- /dev/null
+++ b/infrastructure/textures/infrastructure_cable_barrier_terminal_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_cable_barrier_terminal_front.png b/infrastructure/textures/infrastructure_cable_barrier_terminal_front.png
new file mode 100644
index 0000000..607f6d9
--- /dev/null
+++ b/infrastructure/textures/infrastructure_cable_barrier_terminal_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_concrete.png b/infrastructure/textures/infrastructure_concrete.png
new file mode 100644
index 0000000..3be0c52
--- /dev/null
+++ b/infrastructure/textures/infrastructure_concrete.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_corrugated_guide_rail_back.png b/infrastructure/textures/infrastructure_corrugated_guide_rail_back.png
new file mode 100644
index 0000000..d7aaf99
--- /dev/null
+++ b/infrastructure/textures/infrastructure_corrugated_guide_rail_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_corrugated_guide_rail_front.png b/infrastructure/textures/infrastructure_corrugated_guide_rail_front.png
new file mode 100644
index 0000000..c3a7b37
--- /dev/null
+++ b/infrastructure/textures/infrastructure_corrugated_guide_rail_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_corrugated_guide_rail_side.png b/infrastructure/textures/infrastructure_corrugated_guide_rail_side.png
new file mode 100644
index 0000000..739e6de
--- /dev/null
+++ b/infrastructure/textures/infrastructure_corrugated_guide_rail_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_corrugated_sheet.png b/infrastructure/textures/infrastructure_corrugated_sheet.png
new file mode 100644
index 0000000..9b6bef4
--- /dev/null
+++ b/infrastructure/textures/infrastructure_corrugated_sheet.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_lighting_back.png b/infrastructure/textures/infrastructure_crosswalk_lighting_back.png
new file mode 100644
index 0000000..fd73443
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_lighting_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_lighting_bottom.png b/infrastructure/textures/infrastructure_crosswalk_lighting_bottom.png
new file mode 100644
index 0000000..f6f5db9
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_lighting_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_lighting_front.png b/infrastructure/textures/infrastructure_crosswalk_lighting_front.png
new file mode 100644
index 0000000..bf6bf01
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_lighting_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign.png
new file mode 100644
index 0000000..b20ca91
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_safety_sign.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_front_back.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_front_back.png
new file mode 100644
index 0000000..2ff6832
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_front_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_side.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_side.png
new file mode 100644
index 0000000..9e7c58c
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_top.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top.png
new file mode 100644
index 0000000..6ba1c7b
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_front_back.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_front_back.png
new file mode 100644
index 0000000..f115876
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_front_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_side.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_side.png
new file mode 100644
index 0000000..9db3518
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_warning_light_back.png b/infrastructure/textures/infrastructure_crosswalk_warning_light_back.png
new file mode 100644
index 0000000..51d024b
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_warning_light_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_warning_light_front_anim.png b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_anim.png
new file mode 100644
index 0000000..a21529f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_anim.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_warning_light_front_bright.png b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_bright.png
new file mode 100644
index 0000000..3525a3c
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_bright.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_warning_light_front_dark.png b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_dark.png
new file mode 100644
index 0000000..357bda3
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_dark.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crowd_control_barricade_back.png b/infrastructure/textures/infrastructure_crowd_control_barricade_back.png
new file mode 100644
index 0000000..0f5c6ea
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crowd_control_barricade_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_crowd_control_barricade_front.png b/infrastructure/textures/infrastructure_crowd_control_barricade_front.png
new file mode 100644
index 0000000..a16c363
--- /dev/null
+++ b/infrastructure/textures/infrastructure_crowd_control_barricade_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_curve_chevron_left_bright.png b/infrastructure/textures/infrastructure_curve_chevron_left_bright.png
new file mode 100644
index 0000000..199751f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_curve_chevron_left_bright.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_curve_chevron_left_dark.png b/infrastructure/textures/infrastructure_curve_chevron_left_dark.png
new file mode 100644
index 0000000..f7d68f5
--- /dev/null
+++ b/infrastructure/textures/infrastructure_curve_chevron_left_dark.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_curve_chevron_right_bright.png b/infrastructure/textures/infrastructure_curve_chevron_right_bright.png
new file mode 100644
index 0000000..d1bae78
--- /dev/null
+++ b/infrastructure/textures/infrastructure_curve_chevron_right_bright.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_curve_chevron_right_dark.png b/infrastructure/textures/infrastructure_curve_chevron_right_dark.png
new file mode 100644
index 0000000..b8f442f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_curve_chevron_right_dark.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_delineator_retroreflector_red.png b/infrastructure/textures/infrastructure_delineator_retroreflector_red.png
new file mode 100644
index 0000000..b2d4336
--- /dev/null
+++ b/infrastructure/textures/infrastructure_delineator_retroreflector_red.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_delineator_retroreflector_yellow.png b/infrastructure/textures/infrastructure_delineator_retroreflector_yellow.png
new file mode 100644
index 0000000..b6fe651
--- /dev/null
+++ b/infrastructure/textures/infrastructure_delineator_retroreflector_yellow.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_delineator_wrapper_left.png b/infrastructure/textures/infrastructure_delineator_wrapper_left.png
new file mode 100644
index 0000000..a4d0edd
--- /dev/null
+++ b/infrastructure/textures/infrastructure_delineator_wrapper_left.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_delineator_wrapper_right.png b/infrastructure/textures/infrastructure_delineator_wrapper_right.png
new file mode 100644
index 0000000..2743183
--- /dev/null
+++ b/infrastructure/textures/infrastructure_delineator_wrapper_right.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_drainage_channel_grating.png b/infrastructure/textures/infrastructure_drainage_channel_grating.png
new file mode 100644
index 0000000..dc720cd
--- /dev/null
+++ b/infrastructure/textures/infrastructure_drainage_channel_grating.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_emergency_phone_bottom.png b/infrastructure/textures/infrastructure_emergency_phone_bottom.png
new file mode 100644
index 0000000..8106816
--- /dev/null
+++ b/infrastructure/textures/infrastructure_emergency_phone_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_emergency_phone_front.png b/infrastructure/textures/infrastructure_emergency_phone_front.png
new file mode 100644
index 0000000..1153717
--- /dev/null
+++ b/infrastructure/textures/infrastructure_emergency_phone_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_emergency_phone_side.png b/infrastructure/textures/infrastructure_emergency_phone_side.png
new file mode 100644
index 0000000..930437c
--- /dev/null
+++ b/infrastructure/textures/infrastructure_emergency_phone_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_emergency_phone_top.png b/infrastructure/textures/infrastructure_emergency_phone_top.png
new file mode 100644
index 0000000..2ff4038
--- /dev/null
+++ b/infrastructure/textures/infrastructure_emergency_phone_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_energy_absorbing_terminal_back.png b/infrastructure/textures/infrastructure_energy_absorbing_terminal_back.png
new file mode 100644
index 0000000..6264bd5
--- /dev/null
+++ b/infrastructure/textures/infrastructure_energy_absorbing_terminal_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_energy_absorbing_terminal_front.png b/infrastructure/textures/infrastructure_energy_absorbing_terminal_front.png
new file mode 100644
index 0000000..cd20a40
--- /dev/null
+++ b/infrastructure/textures/infrastructure_energy_absorbing_terminal_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_fitch_barrel_bottom.png b/infrastructure/textures/infrastructure_fitch_barrel_bottom.png
new file mode 100644
index 0000000..7664b97
--- /dev/null
+++ b/infrastructure/textures/infrastructure_fitch_barrel_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_fitch_barrel_side.png b/infrastructure/textures/infrastructure_fitch_barrel_side.png
new file mode 100644
index 0000000..7471830
--- /dev/null
+++ b/infrastructure/textures/infrastructure_fitch_barrel_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_fitch_barrel_top.png b/infrastructure/textures/infrastructure_fitch_barrel_top.png
new file mode 100644
index 0000000..223e119
--- /dev/null
+++ b/infrastructure/textures/infrastructure_fitch_barrel_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_galvanized_steel.png b/infrastructure/textures/infrastructure_galvanized_steel.png
new file mode 100644
index 0000000..841e68b
--- /dev/null
+++ b/infrastructure/textures/infrastructure_galvanized_steel.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_grid_paver_bottom.png b/infrastructure/textures/infrastructure_grid_paver_bottom.png
new file mode 100644
index 0000000..de051cf
--- /dev/null
+++ b/infrastructure/textures/infrastructure_grid_paver_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_grid_paver_grass.png b/infrastructure/textures/infrastructure_grid_paver_grass.png
new file mode 100644
index 0000000..87bae79
--- /dev/null
+++ b/infrastructure/textures/infrastructure_grid_paver_grass.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_grid_paver_top.png b/infrastructure/textures/infrastructure_grid_paver_top.png
new file mode 100644
index 0000000..ea079c3
--- /dev/null
+++ b/infrastructure/textures/infrastructure_grid_paver_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_1.png b/infrastructure/textures/infrastructure_lane_control_lights_1.png
new file mode 100644
index 0000000..e2c5d16
--- /dev/null
+++ b/infrastructure/textures/infrastructure_lane_control_lights_1.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_2.png b/infrastructure/textures/infrastructure_lane_control_lights_2.png
new file mode 100644
index 0000000..913572a
--- /dev/null
+++ b/infrastructure/textures/infrastructure_lane_control_lights_2.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_3.png b/infrastructure/textures/infrastructure_lane_control_lights_3.png
new file mode 100644
index 0000000..ffe4e01
--- /dev/null
+++ b/infrastructure/textures/infrastructure_lane_control_lights_3.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_4.png b/infrastructure/textures/infrastructure_lane_control_lights_4.png
new file mode 100644
index 0000000..6b24780
--- /dev/null
+++ b/infrastructure/textures/infrastructure_lane_control_lights_4.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_5.png b/infrastructure/textures/infrastructure_lane_control_lights_5.png
new file mode 100644
index 0000000..1a8afcb
--- /dev/null
+++ b/infrastructure/textures/infrastructure_lane_control_lights_5.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_6.png b/infrastructure/textures/infrastructure_lane_control_lights_6.png
new file mode 100644
index 0000000..6e149d7
--- /dev/null
+++ b/infrastructure/textures/infrastructure_lane_control_lights_6.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_manhole_cover_side.png b/infrastructure/textures/infrastructure_manhole_cover_side.png
new file mode 100644
index 0000000..11bf08e
--- /dev/null
+++ b/infrastructure/textures/infrastructure_manhole_cover_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_manhole_cover_top_bottom.png b/infrastructure/textures/infrastructure_manhole_cover_top_bottom.png
new file mode 100644
index 0000000..4338a82
--- /dev/null
+++ b/infrastructure/textures/infrastructure_manhole_cover_top_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_marker_bottom_side.png b/infrastructure/textures/infrastructure_marker_bottom_side.png
new file mode 100644
index 0000000..6cf3e60
--- /dev/null
+++ b/infrastructure/textures/infrastructure_marker_bottom_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_marker_side_red.png b/infrastructure/textures/infrastructure_marker_side_red.png
new file mode 100644
index 0000000..5a5ae22
--- /dev/null
+++ b/infrastructure/textures/infrastructure_marker_side_red.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_marker_side_yellow.png b/infrastructure/textures/infrastructure_marker_side_yellow.png
new file mode 100644
index 0000000..a3a439d
--- /dev/null
+++ b/infrastructure/textures/infrastructure_marker_side_yellow.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_marker_top_red_yellow.png b/infrastructure/textures/infrastructure_marker_top_red_yellow.png
new file mode 100644
index 0000000..afebd88
--- /dev/null
+++ b/infrastructure/textures/infrastructure_marker_top_red_yellow.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_marker_top_yellow_yellow.png b/infrastructure/textures/infrastructure_marker_top_yellow_yellow.png
new file mode 100644
index 0000000..de9d4d6
--- /dev/null
+++ b/infrastructure/textures/infrastructure_marker_top_yellow_yellow.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_noise_barrier.png b/infrastructure/textures/infrastructure_noise_barrier.png
new file mode 100644
index 0000000..a52a243
--- /dev/null
+++ b/infrastructure/textures/infrastructure_noise_barrier.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_razor_wire.png b/infrastructure/textures/infrastructure_razor_wire.png
new file mode 100644
index 0000000..150a98f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_razor_wire.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_riffled_sheet.png b/infrastructure/textures/infrastructure_riffled_sheet.png
new file mode 100644
index 0000000..0f83bce
--- /dev/null
+++ b/infrastructure/textures/infrastructure_riffled_sheet.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_crosswalk_back.png b/infrastructure/textures/infrastructure_road_sign_crosswalk_back.png
new file mode 100644
index 0000000..590e65d
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_crosswalk_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_crosswalk_front.png b/infrastructure/textures/infrastructure_road_sign_crosswalk_front.png
new file mode 100644
index 0000000..78b5dce
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_crosswalk_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_retroreflective_surface.png b/infrastructure/textures/infrastructure_road_sign_retroreflective_surface.png
new file mode 100644
index 0000000..f9c95c1
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_retroreflective_surface.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_right_of_way_back.png b/infrastructure/textures/infrastructure_road_sign_right_of_way_back.png
new file mode 100644
index 0000000..a98467f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_right_of_way_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_right_of_way_front.png b/infrastructure/textures/infrastructure_road_sign_right_of_way_front.png
new file mode 100644
index 0000000..0f52f69
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_right_of_way_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_stop_back.png b/infrastructure/textures/infrastructure_road_sign_stop_back.png
new file mode 100644
index 0000000..d87b178
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_stop_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_stop_front.png b/infrastructure/textures/infrastructure_road_sign_stop_front.png
new file mode 100644
index 0000000..42a099f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_stop_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_yield_back.png b/infrastructure/textures/infrastructure_road_sign_yield_back.png
new file mode 100644
index 0000000..d934905
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_yield_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_road_sign_yield_front.png b/infrastructure/textures/infrastructure_road_sign_yield_front.png
new file mode 100644
index 0000000..caad0cc
--- /dev/null
+++ b/infrastructure/textures/infrastructure_road_sign_yield_front.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_cone_bottom.png b/infrastructure/textures/infrastructure_traffic_cone_bottom.png
new file mode 100644
index 0000000..c9a5137
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_cone_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_cone_side.png b/infrastructure/textures/infrastructure_traffic_cone_side.png
new file mode 100644
index 0000000..134837f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_cone_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_cone_top.png b/infrastructure/textures/infrastructure_traffic_cone_top.png
new file mode 100644
index 0000000..2dca4ae
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_cone_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians.png
new file mode 100644
index 0000000..9cd1470
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_back.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_back.png
new file mode 100644
index 0000000..357011d
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_1.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_1.png
new file mode 100644
index 0000000..a689dc4
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_1.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_2.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_2.png
new file mode 100644
index 0000000..a689dc4
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_2.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_3.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_3.png
new file mode 100644
index 0000000..7729d96
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_3.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_4.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_4.png
new file mode 100644
index 0000000..7729d96
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_4.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_back.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_back.png
new file mode 100644
index 0000000..708d59b
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_1.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_1.png
new file mode 100644
index 0000000..737c426
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_1.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_2.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_2.png
new file mode 100644
index 0000000..737c426
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_2.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_3.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_3.png
new file mode 100644
index 0000000..8d22856
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_3.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_4.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_4.png
new file mode 100644
index 0000000..8d22856
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_4.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_side.png b/infrastructure/textures/infrastructure_traffic_lights_side.png
new file mode 100644
index 0000000..01076e3
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_side.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles.png
new file mode 100644
index 0000000..393422a
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_1.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_1.png
new file mode 100644
index 0000000..4cbb75b
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_1.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_2.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_2.png
new file mode 100644
index 0000000..c81f500
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_2.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_3.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_3.png
new file mode 100644
index 0000000..f55108c
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_3.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_4.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_4.png
new file mode 100644
index 0000000..c81f500
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_4.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_1.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_1.png
new file mode 100644
index 0000000..116ae46
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_1.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_2.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_2.png
new file mode 100644
index 0000000..4a57e89
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_2.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_3.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_3.png
new file mode 100644
index 0000000..9dab2ea
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_3.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_4.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_4.png
new file mode 100644
index 0000000..ddc2364
--- /dev/null
+++ b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_4.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_truss.png b/infrastructure/textures/infrastructure_truss.png
new file mode 100644
index 0000000..ba628f1
--- /dev/null
+++ b/infrastructure/textures/infrastructure_truss.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_warning_light_back.png b/infrastructure/textures/infrastructure_warning_light_back.png
new file mode 100644
index 0000000..0301aee
--- /dev/null
+++ b/infrastructure/textures/infrastructure_warning_light_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_warning_light_bottom.png b/infrastructure/textures/infrastructure_warning_light_bottom.png
new file mode 100644
index 0000000..e7090a0
--- /dev/null
+++ b/infrastructure/textures/infrastructure_warning_light_bottom.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_warning_light_front_anim.png b/infrastructure/textures/infrastructure_warning_light_front_anim.png
new file mode 100644
index 0000000..601725b
--- /dev/null
+++ b/infrastructure/textures/infrastructure_warning_light_front_anim.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_warning_light_left.png b/infrastructure/textures/infrastructure_warning_light_left.png
new file mode 100644
index 0000000..e519af4
--- /dev/null
+++ b/infrastructure/textures/infrastructure_warning_light_left.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_warning_light_right.png b/infrastructure/textures/infrastructure_warning_light_right.png
new file mode 100644
index 0000000..4bd42dc
--- /dev/null
+++ b/infrastructure/textures/infrastructure_warning_light_right.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_warning_light_top.png b/infrastructure/textures/infrastructure_warning_light_top.png
new file mode 100644
index 0000000..898ed0f
--- /dev/null
+++ b/infrastructure/textures/infrastructure_warning_light_top.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_wire_netting.png b/infrastructure/textures/infrastructure_wire_netting.png
new file mode 100644
index 0000000..a685e97
--- /dev/null
+++ b/infrastructure/textures/infrastructure_wire_netting.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_wire_rope_safety_barrier_back.png b/infrastructure/textures/infrastructure_wire_rope_safety_barrier_back.png
new file mode 100644
index 0000000..31418f3
--- /dev/null
+++ b/infrastructure/textures/infrastructure_wire_rope_safety_barrier_back.png
Binary files differ
diff --git a/infrastructure/textures/infrastructure_wire_rope_safety_barrier_front.png b/infrastructure/textures/infrastructure_wire_rope_safety_barrier_front.png
new file mode 100644
index 0000000..3e46bd1
--- /dev/null
+++ b/infrastructure/textures/infrastructure_wire_rope_safety_barrier_front.png
Binary files differ