RealBadAngel
2012-12-13 b8d77627a4d28c624e63423eef317dd09c68e533
update the mod
76 files added
269 files renamed
1 files copied
3 files deleted
3770 ■■■■ changed files
coal_furnace.lua 171 ●●●●● patch | view | raw | blame | history
config.lua 3 ●●●●● patch | view | raw | blame | history
ores.lua 201 ●●●●● patch | view | raw | blame | history
technic/modpack.txt 1 ●●●● patch | view | raw | blame | history
technic/pipeworks/.gitignore 1 ●●●● patch | view | raw | blame | history
technic/pipeworks/README 34 ●●●●● patch | view | raw | blame | history
technic/pipeworks/autoplace.lua 176 ●●●●● patch | view | raw | blame | history
technic/pipeworks/changelog.txt 46 ●●●●● patch | view | raw | blame | history
technic/pipeworks/crafts.lua 94 ●●●●● patch | view | raw | blame | history
technic/pipeworks/depends.txt 2 ●●●●● patch | view | raw | blame | history
technic/pipeworks/devices.lua 471 ●●●●● patch | view | raw | blame | history
technic/pipeworks/init.lua 322 ●●●●● patch | view | raw | blame | history
technic/pipeworks/oldpipes.lua 360 ●●●●● patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_intake_sides.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_intake_top.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_outlet_sides.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_outlet_top.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pipe_end.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pipe_end_empty.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pipe_end_loaded.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_plain.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_plastic_sheeting.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pump_ends.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pump_off.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pump_on.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pump_sides.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pump_top_x.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_pump_top_z.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_back.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_fittings.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_0.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_1.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_10.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_2.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_3.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_4.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_5.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_6.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_7.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_8.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_storage_tank_front_9.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_testobject.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_tube_end.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_tube_inv.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_tube_noctr.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_tube_plain.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_tube_short.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_tube_transparent.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_bottom.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_ends.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_sides.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_top_off.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_top_off_x.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_top_off_z.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_top_on.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_top_on_x.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_valvebody_top_on_z.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_windowed_empty.png patch | view | raw | blame | history
technic/pipeworks/textures/pipeworks_windowed_loaded.png patch | view | raw | blame | history
technic/pipeworks/tubes.lua 217 ●●●●● patch | view | raw | blame | history
technic/technic/alloy_furnace.lua 14 ●●●● patch | view | raw | blame | history
technic/technic/battery_box.lua patch | view | raw | blame | history
technic/technic/battery_box_mv.lua 4 ●●●● patch | view | raw | blame | history
technic/technic/cans.lua 67 ●●●● patch | view | raw | blame | history
technic/technic/chainsaw.lua 2 ●●● patch | view | raw | blame | history
technic/technic/concrete.lua 11 ●●●●● patch | view | raw | blame | history
technic/technic/config.lua 10 ●●●●● patch | view | raw | blame | history
technic/technic/constructor.lua patch | view | raw | blame | history
technic/technic/copper_chest.lua patch | view | raw | blame | history
technic/technic/creative.lua 21 ●●●●● patch | view | raw | blame | history
technic/technic/depends.txt 2 ●●● patch | view | raw | blame | history
technic/technic/deployer.lua patch | view | raw | blame | history
technic/technic/electric.lua patch | view | raw | blame | history
technic/technic/electric_furnace.lua 3 ●●●● patch | view | raw | blame | history
technic/technic/flashlight.lua 2 ●●● patch | view | raw | blame | history
technic/technic/flashlight_old.lua 176 ●●●●● patch | view | raw | blame | history
technic/technic/generator.lua patch | view | raw | blame | history
technic/technic/geothermal.lua patch | view | raw | blame | history
technic/technic/gold_chest.lua patch | view | raw | blame | history
technic/technic/grinder.lua 10 ●●●● patch | view | raw | blame | history
technic/technic/grinder_gloopores.lua 55 ●●●●● patch | view | raw | blame | history
technic/technic/init.lua 69 ●●●●● patch | view | raw | blame | history
technic/technic/injector.lua patch | view | raw | blame | history
technic/technic/injector1.lua 248 ●●●●● patch | view | raw | blame | history
technic/technic/iron_chest.lua 13 ●●●●● patch | view | raw | blame | history
technic/technic/item_drop.lua patch | view | raw | blame | history
technic/technic/item_pickup.lua patch | view | raw | blame | history
technic/technic/items.lua 12 ●●●● patch | view | raw | blame | history
technic/technic/mining_drill.lua 4 ●●●● patch | view | raw | blame | history
technic/technic/mining_laser_mk1.lua patch | view | raw | blame | history
technic/technic/mithril_chest.lua patch | view | raw | blame | history
technic/technic/mithril_subspace_chest.lua patch | view | raw | blame | history
technic/technic/music_player.lua patch | view | raw | blame | history
technic/technic/node_breaker.lua patch | view | raw | blame | history
technic/technic/ores.lua 339 ●●●●● patch | view | raw | blame | history
technic/technic/project_table.lua patch | view | raw | blame | history
technic/technic/rubber.lua patch | view | raw | blame | history
technic/technic/screwdriver.lua patch | view | raw | blame | history
technic/technic/silver_chest.lua patch | view | raw | blame | history
technic/technic/solar_panel.lua 2 ●●● patch | view | raw | blame | history
technic/technic/solar_panel_mv.lua patch | view | raw | blame | history
technic/technic/sonic_screwdriver.lua patch | view | raw | blame | history
technic/technic/sounds/chainsaw.ogg patch | view | raw | blame | history
technic/technic/sounds/item_drop_pickup.1.ogg patch | view | raw | blame | history
technic/technic/sounds/item_drop_pickup.2.ogg patch | view | raw | blame | history
technic/technic/sounds/item_drop_pickup.3.ogg patch | view | raw | blame | history
technic/technic/sounds/item_drop_pickup.4.ogg patch | view | raw | blame | history
technic/technic/sounds/mining_drill.ogg patch | view | raw | blame | history
technic/technic/sounds/technic_laser.ogg patch | view | raw | blame | history
technic/technic/sounds/technic_sonic_screwdriver.ogg patch | view | raw | blame | history
technic/technic/tetris.lua 17 ●●●●● patch | view | raw | blame | history
technic/technic/textures/technic_alloy_furnace_front.png patch | view | raw | blame | history
technic/technic/textures/technic_alloy_furnace_front_active.png patch | view | raw | blame | history
technic/technic/textures/technic_alloy_furnace_side.png patch | view | raw | blame | history
technic/technic/textures/technic_alloy_furnace_top.png patch | view | raw | blame | history
technic/technic/textures/technic_battery.png patch | view | raw | blame | history
technic/technic/textures/technic_battery_box_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_battery_box_side0.png patch | view | raw | blame | history
technic/technic/textures/technic_battery_box_top.png patch | view | raw | blame | history
technic/technic/textures/technic_battery_reload.png patch | view | raw | blame | history
technic/technic/textures/technic_brass_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_brass_ingot.png patch | view | raw | blame | history
technic/technic/textures/technic_bronze_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_chainsaw.png patch | view | raw | blame | history
technic/technic/textures/technic_chromium_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_chromium_ingot.png patch | view | raw | blame | history
technic/technic/textures/technic_chromium_lump.png patch | view | raw | blame | history
technic/technic/textures/technic_coal_alloy_furnace_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_coal_alloy_furnace_front.png patch | view | raw | blame | history
technic/technic/textures/technic_coal_alloy_furnace_front_active.png patch | view | raw | blame | history
technic/technic/textures/technic_coal_alloy_furnace_side.png patch | view | raw | blame | history
technic/technic/textures/technic_coal_alloy_furnace_top.png patch | view | raw | blame | history
technic/technic/textures/technic_coal_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_concrete_block.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_back.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_front_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_front_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk1_bottom_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk1_bottom_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk1_side1_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk1_side1_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk1_side2_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk1_side2_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk1_top_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk1_top_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk2_bottom_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk2_bottom_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk2_side1_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk2_side1_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk2_side2_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk2_side2_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk2_top_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk2_top_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk3_bottom_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk3_bottom_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk3_side1_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk3_side1_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk3_side2_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk3_side2_on.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk3_top_off.png patch | view | raw | blame | history
technic/technic/textures/technic_constructor_mk3_top_on.png patch | view | raw | blame | history
technic/technic/textures/technic_copper_chest_front.png patch | view | raw | blame | history
technic/technic/textures/technic_copper_chest_locked.png patch | view | raw | blame | history
technic/technic/textures/technic_copper_chest_side.png patch | view | raw | blame | history
technic/technic/textures/technic_copper_chest_top.png patch | view | raw | blame | history
technic/technic/textures/technic_copper_coil.png patch | view | raw | blame | history
technic/technic/textures/technic_copper_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_deployer_back.png patch | view | raw | blame | history
technic/technic/textures/technic_deployer_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_deployer_front_off.png patch | view | raw | blame | history
technic/technic/textures/technic_deployer_front_on.png patch | view | raw | blame | history
technic/technic/textures/technic_deployer_side.png patch | view | raw | blame | history
technic/technic/textures/technic_deployer_side1.png patch | view | raw | blame | history
technic/technic/textures/technic_deployer_side2.png patch | view | raw | blame | history
technic/technic/textures/technic_deployer_top.png patch | view | raw | blame | history
technic/technic/textures/technic_diamond.png patch | view | raw | blame | history
technic/technic/textures/technic_diamond_block.png patch | view | raw | blame | history
technic/technic/textures/technic_diamond_block_blue.png patch | view | raw | blame | history
technic/technic/textures/technic_diamond_block_green.png patch | view | raw | blame | history
technic/technic/textures/technic_diamond_block_red.png patch | view | raw | blame | history
technic/technic/textures/technic_diamond_drill_head.png patch | view | raw | blame | history
technic/technic/textures/technic_doped_silicon_wafer.png patch | view | raw | blame | history
technic/technic/textures/technic_electric_furnace_GUI.png patch | view | raw | blame | history
technic/technic/textures/technic_electric_furnace_GUI.xcf patch | view | raw | blame | history
technic/technic/textures/technic_electric_furnace_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_electric_furnace_front.png patch | view | raw | blame | history
technic/technic/textures/technic_electric_furnace_front_active.png patch | view | raw | blame | history
technic/technic/textures/technic_electric_furnace_side.png patch | view | raw | blame | history
technic/technic/textures/technic_electric_furnace_top.png patch | view | raw | blame | history
technic/technic/textures/technic_fine_copper_wire.png patch | view | raw | blame | history
technic/technic/textures/technic_flashlight.png patch | view | raw | blame | history
technic/technic/textures/technic_generator_front.png patch | view | raw | blame | history
technic/technic/textures/technic_generator_front_active.png patch | view | raw | blame | history
technic/technic/textures/technic_generator_side.png patch | view | raw | blame | history
technic/technic/textures/technic_generator_top.png patch | view | raw | blame | history
technic/technic/textures/technic_geothermal_side.png patch | view | raw | blame | history
technic/technic/textures/technic_geothermal_top.png patch | view | raw | blame | history
technic/technic/textures/technic_geothermal_top_active.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_black.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_blue.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_brown.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_cyan.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_dark_green.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_dark_grey.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_green.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_grey.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_magenta.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_orange.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_pink.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_red.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_violet.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_white.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_front_yellow.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_black.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_blue.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_brown.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_cyan.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_dark_green.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_dark_grey.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_green.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_grey.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_magenta.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_orange.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_pink.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_red.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_violet.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_white.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_locked_yellow.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_side.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_chest_top.png patch | view | raw | blame | history
technic/technic/textures/technic_gold_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_granite.png patch | view | raw | blame | history
technic/technic/textures/technic_grinder_front.png patch | view | raw | blame | history
technic/technic/textures/technic_grinder_side.png patch | view | raw | blame | history
technic/technic/textures/technic_grinder_top.png patch | view | raw | blame | history
technic/technic/textures/technic_iron_chest_front.png patch | view | raw | blame | history
technic/technic/textures/technic_iron_chest_locked.png patch | view | raw | blame | history
technic/technic/textures/technic_iron_chest_side.png patch | view | raw | blame | history
technic/technic/textures/technic_iron_chest_top.png patch | view | raw | blame | history
technic/technic/textures/technic_iron_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_laser_beam.png patch | view | raw | blame | history
technic/technic/textures/technic_lava_can.png patch | view | raw | blame | history
technic/technic/textures/technic_light.png patch | view | raw | blame | history
technic/technic/textures/technic_lv_cable.png patch | view | raw | blame | history
technic/technic/textures/technic_lv_cable_wield.png patch | view | raw | blame | history
technic/technic/textures/technic_machine_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_marble.png patch | view | raw | blame | history
technic/technic/textures/technic_marble_bricks.png patch | view | raw | blame | history
technic/technic/textures/technic_menu_bg.png patch | view | raw | blame | history
technic/technic/textures/technic_mineral_chromium.png patch | view | raw | blame | history
technic/technic/textures/technic_mineral_diamond.png patch | view | raw | blame | history
technic/technic/textures/technic_mineral_uranium.png patch | view | raw | blame | history
technic/technic/textures/technic_mineral_zinc.png patch | view | raw | blame | history
technic/technic/textures/technic_mining_drill.png patch | view | raw | blame | history
technic/technic/textures/technic_mining_laser_mk1.png patch | view | raw | blame | history
technic/technic/textures/technic_mithril_chest_front.png patch | view | raw | blame | history
technic/technic/textures/technic_mithril_chest_locked.png patch | view | raw | blame | history
technic/technic/textures/technic_mithril_chest_side.png patch | view | raw | blame | history
technic/technic/textures/technic_mithril_chest_top.png patch | view | raw | blame | history
technic/technic/textures/technic_mithril_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_motor.png patch | view | raw | blame | history
technic/technic/textures/technic_music_player_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_music_player_side.png patch | view | raw | blame | history
technic/technic/textures/technic_music_player_top.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_battery_box_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_battery_box_side0.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_battery_box_top.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_cable.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_cable_wield.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_solar_panel_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_solar_panel_side.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_solar_panel_top.png patch | view | raw | blame | history
technic/technic/textures/technic_mv_transformer.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_back.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_bottom_off.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_bottom_on.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_front_off.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_front_on.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_side.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_side1.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_side1_off.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_side1_on.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_side2.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_side2_off.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_side2_on.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_top.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_top_off.png patch | view | raw | blame | history
technic/technic/textures/technic_nodebreaker_top_on.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter1.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter2.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter3.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter4.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter5.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter6.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter7.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter8.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter_bg.png patch | view | raw | blame | history
technic/technic/textures/technic_power_meter_fg.png patch | view | raw | blame | history
technic/technic/textures/technic_raw_latex.png patch | view | raw | blame | history
technic/technic/textures/technic_rebar.png patch | view | raw | blame | history
technic/technic/textures/technic_rubber.png patch | view | raw | blame | history
technic/technic/textures/technic_rubber_sapling.png patch | view | raw | blame | history
technic/technic/textures/technic_rubber_tree_empty.png patch | view | raw | blame | history
technic/technic/textures/technic_rubber_tree_full.png patch | view | raw | blame | history
technic/technic/textures/technic_screwdriver.png patch | view | raw | blame | history
technic/technic/textures/technic_silicon_wafer.png patch | view | raw | blame | history
technic/technic/textures/technic_silver_chest_front.png patch | view | raw | blame | history
technic/technic/textures/technic_silver_chest_locked.png patch | view | raw | blame | history
technic/technic/textures/technic_silver_chest_side.png patch | view | raw | blame | history
technic/technic/textures/technic_silver_chest_top.png patch | view | raw | blame | history
technic/technic/textures/technic_silver_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_solar_panel_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_solar_panel_side.png patch | view | raw | blame | history
technic/technic/textures/technic_solar_panel_top.png patch | view | raw | blame | history
technic/technic/textures/technic_sonic_screwdriver.png patch | view | raw | blame | history
technic/technic/textures/technic_stainless_steel_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_stainless_steel_ingot.png patch | view | raw | blame | history
technic/technic/textures/technic_tin_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_tree_tap.png patch | view | raw | blame | history
technic/technic/textures/technic_uranium.png patch | view | raw | blame | history
technic/technic/textures/technic_water_can.png patch | view | raw | blame | history
technic/technic/textures/technic_water_mill_side.png patch | view | raw | blame | history
technic/technic/textures/technic_water_mill_top.png patch | view | raw | blame | history
technic/technic/textures/technic_water_mill_top_active.png patch | view | raw | blame | history
technic/technic/textures/technic_workshop_bottom.png patch | view | raw | blame | history
technic/technic/textures/technic_workshop_side.png patch | view | raw | blame | history
technic/technic/textures/technic_workshop_top.png patch | view | raw | blame | history
technic/technic/textures/technic_zinc_dust.png patch | view | raw | blame | history
technic/technic/textures/technic_zinc_ingot.png patch | view | raw | blame | history
technic/technic/textures/technic_zinc_lump.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_front1.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_front2.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_side1B.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_side1L.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_side1P.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_side2B.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_side2L.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_side2P.png patch | view | raw | blame | history
technic/technic/textures/tetris_machine_top.png patch | view | raw | blame | history
technic/technic/tool_workshop.lua patch | view | raw | blame | history
technic/technic/tree_tap.lua 2 ●●● patch | view | raw | blame | history
technic/technic/water.lua 588 ●●●●● patch | view | raw | blame | history
technic/technic/water_mill.lua patch | view | raw | blame | history
technic/technic/wires.lua patch | view | raw | blame | history
technic/technic/wires_mv.lua patch | view | raw | blame | history
coal_furnace.lua
File was deleted
config.lua
File was deleted
ores.lua
File was deleted
technic/modpack.txt
New file
@@ -0,0 +1 @@
technic/pipeworks/.gitignore
New file
@@ -0,0 +1 @@
*~
technic/pipeworks/README
New file
@@ -0,0 +1,34 @@
This simple mod uses nodeboxes to supply a complete set of 3D flanged pipes,
along with "valve" and "pump" devices.
Unlike the previous version of this mod, these pipes are rounded, and when
placed, they'll automatically join together as needed.  Pipes can go vertically
or horizontally, and there are enough nodes defined to allow for all possible
connections.  Valves and pumps can only be placed horizontally, and will
automatically rotate and join with neighboring pipes as objects are added, as
well as joining with each other under certain circumstances.
Pipes come in two variants: one type bears one or more dark windows on each
pipe, suggesting they're empty, while the other type bears green-tinted
windows, as if full (the two colors should also be easy to select if you want
to change them in a paint program).  These windows only appear on straight
lengths and on certain junctions.
There are no crafting recipes, yet, but you can use /giveme as usual, namely
"/giveme pipeworks:pipe 999" or so, and then place them as needed.  See
init.lua for more details.
This mod is intended to be used as a basis or at least as sort of a model for
something else to build on (perhaps a nicer-looking oil mod?), and does not
provide any of the code necessary to cause anything to flow through them.  Like
the pipes, the valve and pump don't do anything useful yet, but you can punch
them to turn them "on" and "off".  Note that the valve and pump textures and
shapes are not yet complete (hence their boxy appearance).
This mod is a work in progress.
Please note that owing to the nature of this mod, I have opted to use 64px
textures.  Anything less just looks terrible.
If you don't need the old node names from the previous version of this mod,
edit init.lua and comment-out the 'dofile' line at the top.
technic/pipeworks/autoplace.lua
New file
@@ -0,0 +1,176 @@
-- autorouting for pipes
function pipe_scanforobjects(pos)
    pipe_autoroute({ x=pos.x-1, y=pos.y  , z=pos.z   }, "_loaded")
    pipe_autoroute({ x=pos.x+1, y=pos.y  , z=pos.z   }, "_loaded")
    pipe_autoroute({ x=pos.x  , y=pos.y-1, z=pos.z   }, "_loaded")
    pipe_autoroute({ x=pos.x  , y=pos.y+1, z=pos.z   }, "_loaded")
    pipe_autoroute({ x=pos.x  , y=pos.y  , z=pos.z-1 }, "_loaded")
    pipe_autoroute({ x=pos.x  , y=pos.y  , z=pos.z+1 }, "_loaded")
    pipe_autoroute(pos, "_loaded")
    pipe_autoroute({ x=pos.x-1, y=pos.y  , z=pos.z   }, "_empty")
    pipe_autoroute({ x=pos.x+1, y=pos.y  , z=pos.z   }, "_empty")
    pipe_autoroute({ x=pos.x  , y=pos.y-1, z=pos.z   }, "_empty")
    pipe_autoroute({ x=pos.x  , y=pos.y+1, z=pos.z   }, "_empty")
    pipe_autoroute({ x=pos.x  , y=pos.y  , z=pos.z-1 }, "_empty")
    pipe_autoroute({ x=pos.x  , y=pos.y  , z=pos.z+1 }, "_empty")
    pipe_autoroute(pos, "_empty")
end
function pipe_autoroute(pos, state)
    nctr = minetest.env:get_node(pos)
    if (string.find(nctr.name, "pipeworks:pipe_") == nil) then return end
    pipes_scansurroundings(pos)
    nsurround = pxm..pxp..pym..pyp..pzm..pzp
    if nsurround == "000000" then nsurround = "110000" end
    minetest.env:add_node(pos, { name = "pipeworks:pipe_"..nsurround..state })
end
-- autorouting for pneumatic tubes
function tube_scanforobjects(pos)
    tube_autoroute({ x=pos.x-1, y=pos.y  , z=pos.z   })
    tube_autoroute({ x=pos.x+1, y=pos.y  , z=pos.z   })
    tube_autoroute({ x=pos.x  , y=pos.y-1, z=pos.z   })
    tube_autoroute({ x=pos.x  , y=pos.y+1, z=pos.z   })
    tube_autoroute({ x=pos.x  , y=pos.y  , z=pos.z-1 })
    tube_autoroute({ x=pos.x  , y=pos.y  , z=pos.z+1 })
    tube_autoroute(pos)
end
function tube_autoroute(pos)
    nctr = minetest.env:get_node(pos)
    print ("minetest.get_item_group("..nctr.name..',"tubedevice") == '..minetest.get_item_group(nctr.name, "tubedevice"))
    if (string.find(nctr.name, "pipeworks:tube_") == nil)
        and minetest.get_item_group(nctr.name, "tubedevice") ~= 1 then return end
    pxm=0
    pxp=0
    pym=0
    pyp=0
    pzm=0
    pzp=0
    nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y  , z=pos.z   })
    nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y  , z=pos.z   })
    nym = minetest.env:get_node({ x=pos.x  , y=pos.y-1, z=pos.z   })
    nyp = minetest.env:get_node({ x=pos.x  , y=pos.y+1, z=pos.z   })
    nzm = minetest.env:get_node({ x=pos.x  , y=pos.y  , z=pos.z-1 })
    nzp = minetest.env:get_node({ x=pos.x  , y=pos.y  , z=pos.z+1 })
    if (string.find(nxm.name, "pipeworks:tube_") ~= nil)
        or minetest.get_item_group(nxm.name, "tubedevice") == 1 then pxm=1 end
    if (string.find(nxp.name, "pipeworks:tube_") ~= nil)
        or minetest.get_item_group(nxp.name, "tubedevice") == 1 then pxp=1 end
    if (string.find(nym.name, "pipeworks:tube_") ~= nil)
        or minetest.get_item_group(nym.name, "tubedevice") == 1 then pym=1 end
    if (string.find(nyp.name, "pipeworks:tube_") ~= nil)
        or minetest.get_item_group(nyp.name, "tubedevice") == 1 then pyp=1 end
    if (string.find(nzm.name, "pipeworks:tube_") ~= nil)
        or minetest.get_item_group(nzm.name, "tubedevice") == 1 then pzm=1 end
    if (string.find(nzp.name, "pipeworks:tube_") ~= nil)
        or minetest.get_item_group(nzp.name, "tubedevice") == 1 then pzp=1 end
    nsurround = pxm..pxp..pym..pyp..pzm..pzp
    if minetest.get_item_group(nctr.name, "tubedevice") ~= 1 then
        minetest.env:add_node(pos, { name = "pipeworks:tube_"..nsurround })
    end
end
-- auto-rotation code for various devices the tubes attach to
function pipe_device_autorotate(pos, state, bname)
    if state == nil then
        nname = bname
    else
        nname = bname.."_"..state
    end
    local nctr = minetest.env:get_node(pos)
    pipes_scansurroundings(pos)
    if (pxm+pxp) ~= 0 then
        minetest.env:add_node(pos, { name = nname.."_x" })
        return
    end
    if (pzm+pzp) ~= 0 then
        minetest.env:add_node(pos, { name = nname.."_z" })
    end
end
function pipes_scansurroundings(pos)
    pxm=0
    pxp=0
    pym=0
    pyp=0
    pzm=0
    pzp=0
    nxm = minetest.env:get_node({ x=pos.x-1, y=pos.y  , z=pos.z   })
    nxp = minetest.env:get_node({ x=pos.x+1, y=pos.y  , z=pos.z   })
    nym = minetest.env:get_node({ x=pos.x  , y=pos.y-1, z=pos.z   })
    nyp = minetest.env:get_node({ x=pos.x  , y=pos.y+1, z=pos.z   })
    nzm = minetest.env:get_node({ x=pos.x  , y=pos.y  , z=pos.z-1 })
    nzp = minetest.env:get_node({ x=pos.x  , y=pos.y  , z=pos.z+1 })
    if (string.find(nxm.name, "pipeworks:pipe_") ~= nil) then pxm=1 end
    if (string.find(nxp.name, "pipeworks:pipe_") ~= nil) then pxp=1 end
    if (string.find(nym.name, "pipeworks:pipe_") ~= nil) then pym=1 end
    if (string.find(nyp.name, "pipeworks:pipe_") ~= nil) then pyp=1 end
    if (string.find(nzm.name, "pipeworks:pipe_") ~= nil) then pzm=1 end
    if (string.find(nzp.name, "pipeworks:pipe_") ~= nil) then pzp=1 end
    for p in ipairs(pipes_devicelist) do
        pdev = pipes_devicelist[p]
        if (string.find(nxm.name, "pipeworks:"..pdev.."_off_x") ~= nil) or
           (string.find(nxm.name, "pipeworks:"..pdev.."_on_x") ~= nil) or
           (string.find(nxm.name, "pipeworks:"..pdev.."_x") ~= nil) then
            pxm=1
        end
        if (string.find(nxp.name, "pipeworks:"..pdev.."_off_x") ~= nil) or
           (string.find(nxp.name, "pipeworks:"..pdev.."_on_x") ~= nil) or
           (string.find(nxp.name, "pipeworks:"..pdev.."_x") ~= nil)  then
            pxp=1
        end
        if (string.find(nzm.name, "pipeworks:"..pdev.."_off_z") ~= nil) or
           (string.find(nzm.name, "pipeworks:"..pdev.."_on_z") ~= nil) or
           (string.find(nzm.name, "pipeworks:"..pdev.."_z") ~= nil)  then
            pzm=1
        end
        if (string.find(nzp.name, "pipeworks:"..pdev.."_off_z") ~= nil) or
           (string.find(nzp.name, "pipeworks:"..pdev.."_on_z") ~= nil) or
           (string.find(nzp.name, "pipeworks:"..pdev.."_z") ~= nil)  then
            pzp=1
        end
    end
    -- storage tanks and intake grates have vertical connections
    -- also, so they require a special case
    if (string.find(nym.name, "pipeworks:storage_tank_") ~= nil) or
       (string.find(nym.name, "pipeworks:intake") ~= nil) or
       (string.find(nym.name, "pipeworks:outlet") ~= nil) then
        pym=1
    end
end
function pipe_look_for_stackable_tanks(pos)
    tym = minetest.env:get_node({ x=pos.x  , y=pos.y-1, z=pos.z   })
    if string.find(tym.name, "pipeworks:storage_tank_") ~= nil or
        string.find(tym.name, "pipeworks:expansion_tank_") ~= nil then
        minetest.env:add_node(pos, { name =  "pipeworks:expansion_tank_0"})
    end
end
technic/pipeworks/changelog.txt
New file
@@ -0,0 +1,46 @@
Changelog
---------
2012-08-24: Added square-ish pneumatic tubes, with their own autoplace code
(they do not connect to the steel pipes or their related devices).
2012-08-22: Added outlet grate, made it participate in autoplace algorithm.
Extended storage tank to show fill level in 10% steps (0% to 100%).  Added
"expansion tank" that appears if the user stacks tanks upwards.  (Downwards is
not checked).
2012-08-21: Made storage tank participate in autoplace algorithm.  Tuned API a
little to allow for more flexible placement.  Re-organized code a bit to allow
for some upcoming rules changes.  Made storage tanks' upper/lower fittins and
intake grate participate in autoplace algorithm.
2012-08-20: Added temporary nodes for storage tank and intake grating, but
without autoplace.
2012-08-19: Pumps and valves now fully participate in the
auto-rotate/auto-place algorithm.
2012-08-18: Total rewrite again.  All pipes are now nice and round-looking, and
they auto-connect!  Also added temporary nodes for pump and valve (each with an
on/off setting - punch to change).  No crafting recipes yet and the pipes still
don't do anything useful yet.  Soon.
2012-08-06:  Moved this changelog off the forum post and into a separate file.
2012-08-05 (multiple updates): Rewrote pipeworks to use loops and tables to
create the nodes. Requires far less code now. Added -X, +X, -Y, +Y, -Z, +Z
capped stubs and a short centered horizontal segment. Changed node definitions
so that the aforementioned "short centered" segment is given on dig/drop.
Renamed it to just "pipeworks:pipe" (and pipe_loaded). Added empty/loaded
indicator images to the capped ends, removed some redundant comments. Made the
empty/loaded indication at the capped end more prominent.
2012-07-21: Added screenshot showing pipes as they look now that nodebox
texture rotation is fixed.
2012-07-18: Changed the mod name and all internals to 'pipeworks' instead of
'pipes'... after a couple of mistakes :-)
2012-07-12: moved project to github.
2012-06-23: Initial release, followed by reworking the textures a bit.
technic/pipeworks/crafts.lua
New file
@@ -0,0 +1,94 @@
-- Crafting recipes for pipeworks
-- If the technic mod is present, then don't bother registering these recipes
-- as that mod supplies its own.
if io.open(minetest.get_modpath("pipeworks").."/../technic/init.lua", "r") == nil then
    -- If homedecor is not installed, we need to register a few of its crafts
    -- manually so we can use them.
    if minetest.get_modpath("homedecor") == nil then
        minetest.register_craftitem(":homedecor:plastic_sheeting", {
            description = "Plastic sheet",
            inventory_image = "pipeworks_plastic_sheeting.png",
        })
        minetest.register_craft({
                type = "cooking",
                output = "homedecor:plastic_sheeting",
                recipe = "default:junglegrass",
        })
        minetest.register_craft({
                type = 'fuel',
                recipe = 'homedecor:plastic_sheeting',
                burntime = 30,
        })
    end
    minetest.register_craft( {
            output = "pipeworks:pipe_110000_empty 12",
            recipe = {
                    { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
                    { "", "", "" },
                    { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
            },
    })
    minetest.register_craft( {
            output = "pipeworks:pump 2",
            recipe = {
                    { "default:stone", "default:stone", "default:stone" },
                    { "default:steel_ingot", "default:stick", "default:steel_ingot" },
                    { "default:stone", "default:stone", "default:stone" }
            },
    })
    minetest.register_craft( {
            output = "pipeworks:valve 2",
            recipe = {
                    { "", "default:stick", "" },
                    { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
                    { "", "default:steel_ingot", "" }
            },
    })
    minetest.register_craft( {
            output = "pipeworks:storage_tank 2",
            recipe = {
                    { "", "default:steel_ingot", "default:steel_ingot" },
                    { "default:steel_ingot", "default:glass", "default:steel_ingot" },
                    { "default:steel_ingot", "default:steel_ingot", "" }
            },
    })
    minetest.register_craft( {
            output = "pipeworks:intake 2",
            recipe = {
                    { "", "default:steel_ingot", "" },
                    { "default:steel_ingot", "", "default:steel_ingot" },
                    { "", "default:steel_ingot", "" }
            },
    })
    minetest.register_craft( {
            output = "pipeworks:outlet 2",
            recipe = {
                    { "default:steel_ingot", "", "default:steel_ingot" },
                    { "", "default:steel_ingot", "" },
                    { "default:steel_ingot", "", "default:steel_ingot" }
            },
    })
    minetest.register_craft( {
        output = "pipeworks:tube 12",
        recipe = {
                { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
                { "", "", "" },
                { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
        },
    })
end
technic/pipeworks/depends.txt
New file
@@ -0,0 +1,2 @@
default
technic/pipeworks/devices.lua
New file
@@ -0,0 +1,471 @@
-- List of devices that should participate in the autoplace algorithm
pipes_devicelist = {
    "pump",
    "valve",
    "storage_tank_0",
    "storage_tank_1",
    "storage_tank_2",
    "storage_tank_3",
    "storage_tank_4",
    "storage_tank_5",
    "storage_tank_6",
    "storage_tank_7",
    "storage_tank_8",
    "storage_tank_9",
    "storage_tank_10"
}
-- tables
minetest.register_alias("pipeworks:pump", "pipeworks:pump_off_x")
minetest.register_alias("pipeworks:valve", "pipeworks:valve_off_x")
minetest.register_alias("pipeworks:storage_tank", "pipeworks:storage_tank_0_x")
pipe_pumpbody_x = {
    { -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 }
}
pipe_pumpbody_z = {
    { -6/16, -8/16, -6/16, 6/16, 8/16, 6/16 }
}
pipe_valvebody_x = {
    { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 }
}
pipe_valvebody_z = {
    { -4/16, -4/16, -4/16, 4/16, 4/16, 4/16 }
}
pipe_valvehandle_on_x = {
    { -5/16, 4/16, -1/16, 0, 5/16, 1/16 }
}
pipe_valvehandle_on_z = {
    { -1/16, 4/16, -5/16, 1/16, 5/16, 0 }
}
pipe_valvehandle_off_x = {
    { -1/16, 4/16, -5/16, 1/16, 5/16, 0 }
}
pipe_valvehandle_off_z = {
    { -5/16, 4/16, -1/16, 0, 5/16, 1/16 }
}
-- Now define the nodes.
local states = { "on", "off" }
local dgroups = ""
for s in ipairs(states) do
    if states[s] == "off" then
        dgroups = {snappy=3, pipe=1}
    else
        dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1}
    end
    local pumpboxes = {}
    pipe_addbox(pumpboxes, pipe_leftstub)
    pipe_addbox(pumpboxes, pipe_pumpbody_x)
    pipe_addbox(pumpboxes, pipe_rightstub)
    local tilex = "pipeworks_pump_ends.png"
    local tilez = "pipeworks_pump_"..states[s]..".png"
    minetest.register_node("pipeworks:pump_"..states[s].."_x", {
        description = "Pump Module ("..states[s]..")",
        drawtype = "nodebox",
        tiles = {
            "pipeworks_pump_top_x.png",
            "pipeworks_pump_sides.png",
            tilex,
            tilex,
            "pipeworks_pump_sides.png",
            tilez
        },
        paramtype = "light",
        selection_box = {
                     type = "fixed",
            fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
        },
        node_box = {
            type = "fixed",
            fixed = pumpboxes
        },
        groups = dgroups,
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        after_place_node = function(pos)
            pipe_device_autorotate(pos, states[s], "pipeworks:pump")
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        drop = "pipeworks:pump_off_x"
    })
    local pumpboxes = {}
    pipe_addbox(pumpboxes, pipe_frontstub)
    pipe_addbox(pumpboxes, pipe_pumpbody_z)
    pipe_addbox(pumpboxes, pipe_backstub)
    minetest.register_node("pipeworks:pump_"..states[s].."_z", {
        description = "Pump Module ("..states[s]..", Z-axis)",
        drawtype = "nodebox",
        tiles = {
            "pipeworks_pump_top_z.png",
            "pipeworks_pump_sides.png",
            tilez,
            tilez,
            "pipeworks_pump_sides.png",
            tilex
        },
        paramtype = "light",
        selection_box = {
                     type = "fixed",
            fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
        },
        node_box = {
            type = "fixed",
            fixed = pumpboxes
        },
        groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        after_place_node = function(pos)
            pipe_device_autorotate(pos, states[s], "pipeworks:pump")
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        drop = "pipeworks:pump_off_x"
    })
    local valveboxes = {}
    pipe_addbox(valveboxes, pipe_leftstub)
    pipe_addbox(valveboxes, pipe_valvebody_x)
    if states[s] == "off" then
        pipe_addbox(valveboxes, pipe_valvehandle_off_x)
    else
        pipe_addbox(valveboxes, pipe_valvehandle_on_x)
    end
    pipe_addbox(valveboxes, pipe_rightstub)
    local tilex = "pipeworks_valvebody_ends.png"
    local tilez = "pipeworks_valvebody_sides.png"
    minetest.register_node("pipeworks:valve_"..states[s].."_x", {
        description = "Valve ("..states[s]..")",
        drawtype = "nodebox",
        tiles = {
            "pipeworks_valvebody_top_"..states[s].."_x.png",
            "pipeworks_valvebody_bottom.png",
            tilex,
            tilex,
            tilez,
            tilez,
        },
        paramtype = "light",
        selection_box = {
                     type = "fixed",
            fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 }
        },
        node_box = {
            type = "fixed",
            fixed = valveboxes
        },
        groups = dgroups,
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        after_place_node = function(pos)
            pipe_device_autorotate(pos, states[s], "pipeworks:valve")
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        drop = "pipeworks:valve_off_x",
        pipelike=1,
        on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_int("pipelike",1)
        end,
    })
    local valveboxes = {}
    pipe_addbox(valveboxes, pipe_frontstub)
    pipe_addbox(valveboxes, pipe_valvebody_z)
    if states[s] == "off" then
        pipe_addbox(valveboxes, pipe_valvehandle_off_z)
    else
        pipe_addbox(valveboxes, pipe_valvehandle_on_z)
    end
    pipe_addbox(valveboxes, pipe_backstub)
    minetest.register_node("pipeworks:valve_"..states[s].."_z", {
        description = "Valve ("..states[s]..", Z-axis)",
        drawtype = "nodebox",
        tiles = {
            "pipeworks_valvebody_top_"..states[s].."_z.png",
            "pipeworks_valvebody_bottom.png",
            tilez,
            tilez,
            tilex,
            tilex,
        },
        paramtype = "light",
        selection_box = {
                     type = "fixed",
            fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
        },
        node_box = {
            type = "fixed",
            fixed = valveboxes
        },
        groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        after_place_node = function(pos)
            pipe_device_autorotate(pos, states[s], "pipeworks:valve")
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        drop = "pipeworks:valve_off_x",
        pipelike=1,
        on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_int("pipelike",1)
        end,
    })
end
-- intake grate
minetest.register_node("pipeworks:intake", {
    description = "Intake grate",
    drawtype = "nodebox",
    tiles = {
        "pipeworks_intake_top.png",
        "pipeworks_intake_sides.png",
        "pipeworks_intake_sides.png",
        "pipeworks_intake_sides.png",
        "pipeworks_intake_sides.png",
        "pipeworks_intake_sides.png"
    },
    selection_box = {
                 type = "fixed",
        fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
    },
    node_box = {
        type = "fixed",
        fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
    },
    paramtype = "light",
    groups = {snappy=3, pipe=1},
    sounds = default.node_sound_wood_defaults(),
    walkable = true,
    stack_max = 99,
    after_place_node = function(pos)
        pipe_scanforobjects(pos)
    end,
    after_dig_node = function(pos)
        pipe_scanforobjects(pos)
    end,
    pipelike=1,
    on_construct = function(pos)
    local meta = minetest.env:get_meta(pos)
    meta:set_int("pipelike",1)
    end,
})
-- outlet grate
minetest.register_node("pipeworks:outlet", {
    description = "Outlet grate",
    drawtype = "nodebox",
    tiles = {
        "pipeworks_outlet_top.png",
        "pipeworks_outlet_sides.png",
        "pipeworks_outlet_sides.png",
        "pipeworks_outlet_sides.png",
        "pipeworks_outlet_sides.png",
        "pipeworks_outlet_sides.png"
    },
    selection_box = {
                 type = "fixed",
        fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
    },
    node_box = {
        type = "fixed",
        fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
    },
    paramtype = "light",
    groups = {snappy=3, pipe=1},
    sounds = default.node_sound_wood_defaults(),
    walkable = true,
    stack_max = 99,
    after_place_node = function(pos)
        pipe_scanforobjects(pos)
    end,
    after_dig_node = function(pos)
        pipe_scanforobjects(pos)
    end,
    pipelike=1,
    on_construct = function(pos)
    local meta = minetest.env:get_meta(pos)
    meta:set_int("pipelike",1)
    end,
})
-- tanks
for fill = 0, 10 do
    if fill == 0 then
        filldesc="empty"
        sgroups = {snappy=3, pipe=1, tankfill=fill+1}
    else
        filldesc=fill.."0% full"
        sgroups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1}
    end
    minetest.register_node("pipeworks:expansion_tank_"..fill, {
        description = "Expansion Tank ("..filldesc..")... You hacker, you.",
        tiles = {
            "pipeworks_storage_tank_fittings.png",
            "pipeworks_storage_tank_fittings.png",
            "pipeworks_storage_tank_back.png",
            "pipeworks_storage_tank_back.png",
            "pipeworks_storage_tank_back.png",
            "pipeworks_storage_tank_front_"..fill..".png"
        },
        paramtype = "light",
        paramtype2 = "facedir",
        groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1},
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        drop = "pipeworks:storage_tank_"..fill.."_x",
        after_place_node = function(pos)
            pipe_look_for_stackable_tanks(pos)
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        pipelike=0,
        on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_int("pipelike",0)
        end,
    })
    minetest.register_node("pipeworks:storage_tank_"..fill.."_x", {
        description = "Fluid Storage Tank ("..filldesc..")",
        tiles = {
            "pipeworks_storage_tank_fittings.png",
            "pipeworks_storage_tank_back.png",
            "pipeworks_storage_tank_fittings.png",
            "pipeworks_storage_tank_fittings.png",
            "pipeworks_storage_tank_back.png",
            "pipeworks_storage_tank_front_"..fill..".png"
        },
        paramtype = "light",
        groups = sgroups,
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        after_place_node = function(pos)
            pipe_look_for_stackable_tanks(pos)
            if string.find(minetest.env:get_node(pos).name, "pipeworks:storage_tank_") ~= nil then
                pipe_device_autorotate(pos, nil, "pipeworks:storage_tank_"..fill)
            end
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        pipelike=1,
        on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_int("pipelike",1)
        end,
    })
    minetest.register_node("pipeworks:storage_tank_"..fill.."_z", {
        description = "Fluid Storage Tank (Z axis, "..filldesc..")... You hacker, you.",
        tiles = {
            "pipeworks_storage_tank_fittings.png",
            "pipeworks_storage_tank_back.png",
            "pipeworks_storage_tank_front_"..fill..".png",
            "pipeworks_storage_tank_back.png",
            "pipeworks_storage_tank_fittings.png",
            "pipeworks_storage_tank_fittings.png"
        },
        paramtype = "light",
        groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1},
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        drop = "pipeworks:storage_tank_"..fill.."_x",
        after_place_node = function(pos)
            pipe_look_for_stackable_tanks(pos)
            if string.find(minetest.env:get_node(pos).name, "pipeworks:storage_tank_") ~= nil then
                pipe_device_autorotate(pos, nil, "pipeworks:storage_tank_"..fill)
            end
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        pipelike=1,
        on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_int("pipelike",1)
        end,
    })
end
-- various actions
local axes = { "x", "z" }
for a in ipairs(axes) do
    minetest.register_on_punchnode(function (pos, node)
        if node.name=="pipeworks:valve_on_"..axes[a] then
            minetest.env:add_node(pos, { name = "pipeworks:valve_off_"..axes[a] })
            local meta = minetest.env:get_meta(pos)
            meta:set_int("pipelike",0)
        end
    end)
    minetest.register_on_punchnode(function (pos, node)
        if node.name=="pipeworks:valve_off_"..axes[a] then
            minetest.env:add_node(pos, { name = "pipeworks:valve_on_"..axes[a] })
            local meta = minetest.env:get_meta(pos)
            meta:set_int("pipelike",1)
        end
    end)
    minetest.register_on_punchnode(function (pos, node)
        if node.name=="pipeworks:pump_on_"..axes[a] then
            minetest.env:add_node(pos, { name = "pipeworks:pump_off_"..axes[a] })
        end
    end)
    minetest.register_on_punchnode(function (pos, node)
        if node.name=="pipeworks:pump_off_"..axes[a] then
            minetest.env:add_node(pos, { name = "pipeworks:pump_on_"..axes[a] })
        end
    end)
end
technic/pipeworks/init.lua
New file
@@ -0,0 +1,322 @@
-- Pipeworks mod by Vanessa Ezekowitz - 2012-08-05
--
-- Entirely my own code.  This mod supplies various shapes of pipes
-- and devices that they can connect to such as pumps, valves, etc.
-- All pipes autoconnect as you lay them out, and devices will auto-
-- connect to them.
--
-- License: WTFPL
--
-- Un-comment the following dofile line to re-enable the old pipe nodes.
-- dofile(minetest.get_modpath("pipeworks").."/oldpipes.lua")
minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty")
pipe_leftstub = {
    { -32/64, -2/64, -6/64,   1/64, 2/64, 6/64 },    -- pipe segment against -X face
    { -32/64, -4/64, -5/64,   1/64, 4/64, 5/64 },
    { -32/64, -5/64, -4/64,   1/64, 5/64, 4/64 },
    { -32/64, -6/64, -2/64,   1/64, 6/64, 2/64 },
    { -32/64, -3/64, -8/64, -30/64, 3/64, 8/64 },    -- (the flange for it)
    { -32/64, -5/64, -7/64, -30/64, 5/64, 7/64 },
    { -32/64, -6/64, -6/64, -30/64, 6/64, 6/64 },
    { -32/64, -7/64, -5/64, -30/64, 7/64, 5/64 },
    { -32/64, -8/64, -3/64, -30/64, 8/64, 3/64 }
}
pipe_rightstub = {
    { -1/64, -2/64, -6/64,  32/64, 2/64, 6/64 },    -- pipe segment against +X face
    { -1/64, -4/64, -5/64,  32/64, 4/64, 5/64 },
    { -1/64, -5/64, -4/64,  32/64, 5/64, 4/64 },
    { -1/64, -6/64, -2/64,  32/64, 6/64, 2/64 },
    { 30/64, -3/64, -8/64, 32/64, 3/64, 8/64 },    -- (the flange for it)
    { 30/64, -5/64, -7/64, 32/64, 5/64, 7/64 },
    { 30/64, -6/64, -6/64, 32/64, 6/64, 6/64 },
    { 30/64, -7/64, -5/64, 32/64, 7/64, 5/64 },
    { 30/64, -8/64, -3/64, 32/64, 8/64, 3/64 }
}
pipe_bottomstub = {
    { -2/64, -32/64, -6/64,   2/64, 1/64, 6/64 },    -- pipe segment against -Y face
    { -4/64, -32/64, -5/64,   4/64, 1/64, 5/64 },
    { -5/64, -32/64, -4/64,   5/64, 1/64, 4/64 },
    { -6/64, -32/64, -2/64,   6/64, 1/64, 2/64 },
    { -3/64, -32/64, -8/64, 3/64, -30/64, 8/64 },    -- (the flange for it)
    { -5/64, -32/64, -7/64, 5/64, -30/64, 7/64 },
    { -6/64, -32/64, -6/64, 6/64, -30/64, 6/64 },
    { -7/64, -32/64, -5/64, 7/64, -30/64, 5/64 },
    { -8/64, -32/64, -3/64, 8/64, -30/64, 3/64 }
}
pipe_topstub = {
    { -2/64, -1/64, -6/64,   2/64, 32/64, 6/64 },    -- pipe segment against +Y face
    { -4/64, -1/64, -5/64,   4/64, 32/64, 5/64 },
    { -5/64, -1/64, -4/64,   5/64, 32/64, 4/64 },
    { -6/64, -1/64, -2/64,   6/64, 32/64, 2/64 },
    { -3/64, 30/64, -8/64, 3/64, 32/64, 8/64 },    -- (the flange for it)
    { -5/64, 30/64, -7/64, 5/64, 32/64, 7/64 },
    { -6/64, 30/64, -6/64, 6/64, 32/64, 6/64 },
    { -7/64, 30/64, -5/64, 7/64, 32/64, 5/64 },
    { -8/64, 30/64, -3/64, 8/64, 32/64, 3/64 }
}
pipe_frontstub = {
    { -6/64, -2/64, -32/64,   6/64, 2/64, 1/64 },    -- pipe segment against -Z face
    { -5/64, -4/64, -32/64,   5/64, 4/64, 1/64 },
    { -4/64, -5/64, -32/64,   4/64, 5/64, 1/64 },
    { -2/64, -6/64, -32/64,   2/64, 6/64, 1/64 },
    { -8/64, -3/64, -32/64, 8/64, 3/64, -30/64 },    -- (the flange for it)
    { -7/64, -5/64, -32/64, 7/64, 5/64, -30/64 },
    { -6/64, -6/64, -32/64, 6/64, 6/64, -30/64 },
    { -5/64, -7/64, -32/64, 5/64, 7/64, -30/64 },
    { -3/64, -8/64, -32/64, 3/64, 8/64, -30/64 }
}
pipe_backstub = {
    { -6/64, -2/64, -1/64,   6/64, 2/64, 32/64 },    -- pipe segment against -Z face
    { -5/64, -4/64, -1/64,   5/64, 4/64, 32/64 },
    { -4/64, -5/64, -1/64,   4/64, 5/64, 32/64 },
    { -2/64, -6/64, -1/64,   2/64, 6/64, 32/64 },
    { -8/64, -3/64, 30/64, 8/64, 3/64, 32/64 },    -- (the flange for it)
    { -7/64, -5/64, 30/64, 7/64, 5/64, 32/64 },
    { -6/64, -6/64, 30/64, 6/64, 6/64, 32/64 },
    { -5/64, -7/64, 30/64, 5/64, 7/64, 32/64 },
    { -3/64, -8/64, 30/64, 3/64, 8/64, 32/64 }
}
pipe_selectboxes = {
    { -32/64,  -8/64,  -8/64,  8/64,  8/64,  8/64 },
    { -8/64 ,  -8/64,  -8/64, 32/64,  8/64,  8/64 },
    { -8/64 , -32/64,  -8/64,  8/64,  8/64,  8/64 },
    { -8/64 ,  -8/64,  -8/64,  8/64, 32/64,  8/64 },
    { -8/64 ,  -8/64, -32/64,  8/64,  8/64,  8/64 },
    { -8/64 ,  -8/64,  -8/64,  8/64,  8/64, 32/64 }
}
pipe_bendsphere = {
    { -4/64, -4/64, -4/64, 4/64, 4/64, 4/64 },
    { -5/64, -3/64, -3/64, 5/64, 3/64, 3/64 },
    { -3/64, -5/64, -3/64, 3/64, 5/64, 3/64 },
    { -3/64, -3/64, -5/64, 3/64, 3/64, 5/64 }
}
--  Functions
dbg = function(s)
    if DEBUG == 1 then
        print('[PIPEWORKS] ' .. s)
    end
end
function pipes_fix_image_names(table, replacement)
    outtable={}
    for i in ipairs(table) do
        outtable[i]=string.gsub(table[i], "_XXXXX", replacement)
    end
    return outtable
end
function pipe_addbox(t, b)
    for i in ipairs(b)
        do table.insert(t, b[i])
    end
end
-- now define the nodes!
for xm = 0, 1 do
for xp = 0, 1 do
for ym = 0, 1 do
for yp = 0, 1 do
for zm = 0, 1 do
for zp = 0, 1 do
    local outboxes = {}
    local outsel = {}
    local outimgs = {}
    if yp==1 then
        pipe_addbox(outboxes, pipe_topstub)
        table.insert(outsel, pipe_selectboxes[4])
        table.insert(outimgs, "pipeworks_pipe_end.png")
    else
        table.insert(outimgs, "pipeworks_plain.png")
    end
    if ym==1 then
        pipe_addbox(outboxes, pipe_bottomstub)
        table.insert(outsel, pipe_selectboxes[3])
        table.insert(outimgs, "pipeworks_pipe_end.png")
    else
        table.insert(outimgs, "pipeworks_plain.png")
    end
    if xp==1 then
        pipe_addbox(outboxes, pipe_rightstub)
        table.insert(outsel, pipe_selectboxes[2])
        table.insert(outimgs, "pipeworks_pipe_end.png")
    else
        table.insert(outimgs, "pipeworks_plain.png")
    end
    if xm==1 then
        pipe_addbox(outboxes, pipe_leftstub)
        table.insert(outsel, pipe_selectboxes[1])
        table.insert(outimgs, "pipeworks_pipe_end.png")
    else
        table.insert(outimgs, "pipeworks_plain.png")
    end
    if zp==1 then
        pipe_addbox(outboxes, pipe_backstub)
        table.insert(outsel, pipe_selectboxes[6])
        table.insert(outimgs, "pipeworks_pipe_end.png")
    else
        table.insert(outimgs, "pipeworks_plain.png")
    end
    if zm==1 then
        pipe_addbox(outboxes, pipe_frontstub)
        table.insert(outsel, pipe_selectboxes[5])
        table.insert(outimgs, "pipeworks_pipe_end.png")
    else
        table.insert(outimgs, "pipeworks_plain.png")
    end
    local jx = xp+xm
    local jy = yp+ym
    local jz = zp+zm
    if (jx+jy+jz) == 1 then
        if xm == 1 then
            table.remove(outimgs, 3)
            table.insert(outimgs, 3, "pipeworks_pipe_end_XXXXX.png")
        end
        if xp == 1 then
            table.remove(outimgs, 4)
            table.insert(outimgs, 4, "pipeworks_pipe_end_XXXXX.png")
        end
        if ym == 1 then
            table.remove(outimgs, 1)
            table.insert(outimgs, 1, "pipeworks_pipe_end_XXXXX.png")
        end
        if xp == 1 then
            table.remove(outimgs, 2)
            table.insert(outimgs, 2, "pipeworks_pipe_end_XXXXX.png")
        end
        if zm == 1 then
            table.remove(outimgs, 5)
            table.insert(outimgs, 5, "pipeworks_pipe_end_XXXXX.png")
        end
        if zp == 1 then
            table.remove(outimgs, 6)
            table.insert(outimgs, 6, "pipeworks_pipe_end_XXXXX.png")
        end
    end
    if (jx==1 and jy==1 and jz~=1) or (jx==1 and jy~=1 and jz==1) or (jx~= 1 and jy==1 and jz==1) then
        pipe_addbox(outboxes, pipe_bendsphere)
    end
    if (jx==2 and jy~=2 and jz~=2) then
        table.remove(outimgs, 5)
        table.remove(outimgs, 5)
        table.insert(outimgs, 5, "pipeworks_windowed_XXXXX.png")
        table.insert(outimgs, 5, "pipeworks_windowed_XXXXX.png")
    end
    if (jx~=2 and jy~=2 and jz==2) or (jx~=2 and jy==2 and jz~=2) then
        table.remove(outimgs, 3)
        table.remove(outimgs, 3)
        table.insert(outimgs, 3, "pipeworks_windowed_XXXXX.png")
        table.insert(outimgs, 3, "pipeworks_windowed_XXXXX.png")
    end
    local pname = xm..xp..ym..yp..zm..zp
    local pgroups = ""
    if pname ~= "110000" then
        pgroups = {snappy=3, pipe=1, not_in_creative_inventory=1}
        pipedesc = "Pipe segment (empty, "..pname..")... You hacker, you."
    else
        pgroups = {snappy=3, pipe=1}
        pipedesc = "Pipe segment"
    end
    minetest.register_node("pipeworks:pipe_"..pname.."_empty", {
        description = pipedesc,
        drawtype = "nodebox",
        tiles = pipes_fix_image_names(outimgs, "_empty"),
        paramtype = "light",
        selection_box = {
                     type = "fixed",
            fixed = outsel
        },
        node_box = {
            type = "fixed",
            fixed = outboxes
        },
        groups = pgroups,
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        drop = "pipeworks:pipe_110000_empty",
        pipelike=1,
        on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_int("pipelike",1)
        end,
        after_place_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end,
    })
    minetest.register_node("pipeworks:pipe_"..pname.."_loaded", {
        description = "Pipe segment (loaded, "..pname..")... You hacker, you.",
        drawtype = "nodebox",
        tiles = pipes_fix_image_names(outimgs, "_loaded"),
        paramtype = "light",
        selection_box = {
                     type = "fixed",
            fixed = outsel
        },
        node_box = {
            type = "fixed",
            fixed = outboxes
        },
        groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        drop = "pipeworks:pipe_110000_loaded",
        pipelike=1,
        on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_int("pipelike",1)
        end,
        after_place_node = function(pos)
            pipe_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            pipe_scanforobjects(pos)
        end
    })
end
end
end
end
end
end
dofile(minetest.get_modpath("pipeworks").."/tubes.lua")
dofile(minetest.get_modpath("pipeworks").."/devices.lua")
dofile(minetest.get_modpath("pipeworks").."/autoplace.lua")
dofile(minetest.get_modpath("pipeworks").."/crafts.lua")
print("Pipeworks loaded!")
technic/pipeworks/oldpipes.lua
New file
@@ -0,0 +1,360 @@
-- This file is basically most of the old init.lua and only supplies the
-- old nodes created by the previous verison of Pipeworks.
--
-- License: WTFPL
--
local nodenames = {
    "vertical",
    "horizontal",
    "junction_xy",
    "junction_xz",
    "bend_xy_down",
    "bend_xy_up",
    "bend_xz",
    "crossing_xz",
    "crossing_xy",
    "crossing_xyz",
    "pipe_segment",
    "cap_neg_x",
    "cap_pos_x",
    "cap_neg_y",
    "cap_pos_y",
    "cap_neg_z",
    "cap_pos_z"
}
local descriptions = {
    "vertical",
    "horizontal",
    "junction between X and Y axes",
    "junction between X and Z axes",
    "downward bend between X and Y axes",
    "upward bend between X and Y axes",
    "bend between X/Z axes",
    "4-way crossing between X and Z axes",
    "4-way crossing between X/Z and Y axes",
    "6-way crossing",
    "basic segment",
    "capped, negative X half only",
    "capped, positive X half only",
    "capped, negative Y half only",
    "capped, positive Y half only",
    "capped, negative Z half only",
    "capped, positive Z half only"
}
local nodeimages = {
    {"pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png",
     "pipeworks_plain.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png",
     "pipeworks_plain.png"},
    {"pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png"},
    {"pipeworks_plain.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_pipe_end.png",
     "pipeworks_plain.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png"},
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png"},
    {"pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png"},
-- horizontal short segment
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_pipe_end.png",
     "pipeworks_plain.png",
     "pipeworks_plain.png"},
-- capped
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_pipe_end.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png"},
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png"},
    {"pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_windowed_XXXXX.png",
     "pipeworks_pipe_end.png",
     "pipeworks_windowed_XXXXX.png"},
}
local selectionboxes = {
    { -0.15, -0.5, -0.15, 0.15,  0.5, 0.15 },
    { -0.5, -0.15, -0.15, 0.5, 0.15, 0.15 },
    { -0.15, -0.5, -0.15, 0.5, 0.5, 0.15 },
    { -0.5, -0.15, -0.15, 0.5, 0.15, 0.5 },
    { -0.15, -0.5, -0.15, 0.5, 0.15, 0.15 },
    { -0.15, -0.15, -0.15, 0.5, 0.5, 0.15 },
    { -0.15, -0.15, -0.15, 0.5, 0.15, 0.5 },
    { -0.5, -0.15, -0.5, 0.5, 0.15, 0.5 },
    { -0.5, -0.5, -0.15, 0.5, 0.5, 0.15 },
    { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
    { -0.3, -0.15, -0.15, 0.3, 0.15, 0.15 },
    { -0.5, -0.15, -0.15, 0, 0.15, 0.15 },
    { 0, -0.15, -0.15, 0.5, 0.15, 0.15 },
    { -0.15, -0.5, -0.15, 0.15, 0, 0.15 },
    { -0.15, 0, -0.15, 0.15, 0.5, 0.15 },
    { -0.15, -0.15, -0.5, 0.15, 0.15, 0 },
    { -0.15, -0.15, 0, 0.15, 0.15, 0.5 },
}
local nodeboxes = {
    {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 },    -- vertical
     { -0.1 , -0.45, -0.1 , 0.1 ,  0.45, 0.1  },
     { -0.15,  0.45, -0.15, 0.15,  0.5 , 0.15 }},
    {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 },    -- horizontal
     { -0.45, -0.1 , -0.1 ,  0.45, 0.1 , 0.1  },
     {  0.45, -0.15, -0.15,  0.5 , 0.15, 0.15 }},
    {{ -0.15, -0.5 , -0.15,  0.15, -0.45, 0.15 },    -- vertical with X/Z junction
     { -0.1 , -0.45, -0.1 ,  0.1 ,  0.45, 0.1  },
     { -0.15,  0.45, -0.15,  0.15,  0.5 , 0.15 },
     {  0.1 , -0.1 , -0.1 ,  0.45,  0.1 , 0.1  },
     {  0.45, -0.15, -0.15,  0.5 ,  0.15, 0.15 }},
    {{ -0.15, -0.15,  0.45,  0.15, 0.15, 0.5  },    -- horizontal with X/Z junction
     { -0.1 , -0.1 ,  0.1 ,  0.1 , 0.1 , 0.45 },
     { -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 },
     { -0.45, -0.1 , -0.1 ,  0.45, 0.1 , 0.1  },
     {  0.45, -0.15, -0.15,  0.5 , 0.15, 0.15 }},
    {{ -0.15, -0.5 , -0.15,  0.15, -0.45, 0.15 },    -- bend down from X/Z to Y axis
     { -0.1 , -0.45, -0.1 ,  0.1 ,  0.1 , 0.1  },
     { -0.1 , -0.1 , -0.1 ,  0.45,  0.1 , 0.1  },
     {  0.45, -0.15, -0.15,  0.5 ,  0.15, 0.15 }},
    {{ -0.15, 0.45 , -0.15, 0.15,  0.5, 0.15 },    -- bend up from X/Z to Y axis
     { -0.1 , -0.1 , -0.1 , 0.1 , 0.45, 0.1  },
     { -0.1 , -0.1 , -0.1 , 0.45, 0.1 , 0.1  },
     {  0.45, -0.15, -0.15, 0.5 , 0.15, 0.15 }},
    {{ -0.15, -0.15,  0.45,  0.15, 0.15, 0.5  },    -- bend between X and Z axes
     { -0.1 , -0.1 ,  0.1 ,  0.1 , 0.1 , 0.45 },
     { -0.1 , -0.1 , -0.1 ,  0.45, 0.1 , 0.1  },
     {  0.45, -0.15, -0.15,  0.5 , 0.15, 0.15 }},
    {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 },    -- 4-way crossing between X and Z axes
     { -0.45, -0.1 , -0.1 ,  0.45, 0.1 , 0.1  },
     {  0.45, -0.15, -0.15,  0.5 , 0.15, 0.15 },
     { -0.15, -0.15, -0.5 ,  0.15, 0.15, -0.45 },
     { -0.1 , -0.1 , -0.45,  0.1 , 0.1 ,  0.45 },
     { -0.15, -0.15,  0.45,  0.15, 0.15,  0.5  }},
    {{ -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 },    -- 4-way crossing between X/Z and Y axes
     { -0.1 , -0.45, -0.1 , 0.1 ,  0.45, 0.1  },
     { -0.15,  0.45, -0.15, 0.15,  0.5 , 0.15 },
     { -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 },
     { -0.45, -0.1 , -0.1 ,  0.45, 0.1 , 0.1  },
     {  0.45, -0.15, -0.15,  0.5 , 0.15, 0.15 }},
    {{ -0.5 , -0.15, -0.15, -0.45, 0.15, 0.15 },    -- 6-way crossing (all 3 axes)
     { -0.45, -0.1 , -0.1 ,  0.45, 0.1 , 0.1  },
     {  0.45, -0.15, -0.15,  0.5 , 0.15, 0.15 },
     { -0.15, -0.15, -0.5 ,  0.15, 0.15, -0.45 },
     { -0.1 , -0.1 , -0.45,  0.1 , 0.1 ,  0.45 },
     { -0.15, -0.15,  0.45,  0.15, 0.15,  0.5  },
     { -0.15, -0.5 , -0.15, 0.15, -0.45, 0.15 },
     { -0.1 , -0.45, -0.1 , 0.1 ,  0.45, 0.1  },
     { -0.15,  0.45, -0.15, 0.15,  0.5 , 0.15 }},
    {{ -0.3 , -0.15, -0.15, -0.25, 0.15, 0.15 },    -- main center segment
     { -0.25, -0.1 , -0.1 ,  0.25, 0.1 , 0.1  },
     {  0.25, -0.15, -0.15,  0.3 , 0.15, 0.15 }},
    {{ -0.5,  -0.15, -0.15, -0.45, 0.15, 0.15 },    -- anchored at -X
     { -0.45, -0.1,  -0.1,  -0.2,  0.1,  0.1  },
     { -0.2,  -0.15, -0.15, -0.15, 0.15, 0.15 },
     { -0.15, -0.12, -0.12, -0.1,  0.12, 0.12 },
     { -0.1,  -0.08, -0.08, -0.05, 0.08, 0.08 },
     { -0.05, -0.04, -0.04,  0,    0.04, 0.04 }},
    {{  0.45, -0.15, -0.15, 0.5,  0.15, 0.15 },    -- anchored at +X
     {  0.2,  -0.1,  -0.1,  0.45, 0.1,  0.1  },
     {  0.15, -0.15, -0.15, 0.2,  0.15, 0.15 },
     {  0.1,  -0.12, -0.12, 0.15, 0.12, 0.12 },
     {  0.05, -0.08, -0.08, 0.1,  0.08, 0.08 },
     {  0,    -0.04, -0.04, 0.05, 0.04, 0.04 }},
    {{ -0.15,  -0.5, -0.15,  0.15, -0.45, 0.15 },    -- anchored at -Y
     { -0.1,  -0.45, -0.1,   0.1,  -0.2,  0.1  },
     { -0.15,  -0.2, -0.15,  0.15, -0.15, 0.15 },
     { -0.12, -0.15, -0.12,  0.12, -0.1,  0.12 },
     { -0.08, -0.1,  -0.08,  0.08, -0.05, 0.08 },
     { -0.04, -0.05, -0.04,  0.04,  0,    0.04 }},
    {{ -0.15,  0.45, -0.15, 0.15, 0.5,  0.15 },    -- anchored at +Y
     { -0.1,   0.2,  -0.1,  0.1,  0.45, 0.1  },
     { -0.15,  0.15, -0.15, 0.15, 0.2,  0.15 },
     { -0.12,  0.1,  -0.12, 0.12, 0.15, 0.12 },
     { -0.08,  0.05, -0.08, 0.08, 0.1,  0.08 } ,
     { -0.04,  0,    -0.04, 0.04, 0.05, 0.04 }},
    {{ -0.15, -0.15, -0.5,  0.15, 0.15, -0.45 },    -- anchored at -Z
     { -0.1,  -0.1,  -0.45, 0.1,  0.1,  -0.2  },
     { -0.15, -0.15, -0.2,  0.15, 0.15, -0.15 },
     { -0.12, -0.12, -0.15, 0.12, 0.12, -0.1  },
     { -0.08, -0.08, -0.1,  0.08, 0.08, -0.05 },
     { -0.04, -0.04, -0.05, 0.04, 0.04,  0    }},
    {{ -0.15, -0.15,  0.45, 0.15, 0.15, 0.5  },    -- anchored at +Z
     { -0.1,  -0.1,   0.2,  0.1,  0.1,  0.45 },
     { -0.15, -0.15,  0.15, 0.15, 0.15, 0.2  },
     { -0.12, -0.12,  0.1,  0.12, 0.12, 0.15 },
     { -0.08, -0.08,  0.05, 0.08, 0.08, 0.1  },
     { -0.04, -0.04,  0,    0.04, 0.04, 0.05 }},
}
function fix_image_names(node, replacement)
    outtable={}
    for i in ipairs(nodeimages[node]) do
        outtable[i]=string.gsub(nodeimages[node][i], "_XXXXX", replacement)
    end
    return outtable
end
-- Now define the actual nodes
for node in ipairs(nodenames) do
    if node ~= 2 then
        pgroups = {snappy=3, pipe=1, not_in_creative_inventory=1}
    else
        pgroups = {snappy=3, pipe=1}
    end
    minetest.register_node("pipeworks:"..nodenames[node], {
        description = "Empty Pipe ("..descriptions[node]..")",
        drawtype = "nodebox",
        tiles = fix_image_names(node, "_empty"),
        paramtype = "light",
        paramtype2 = "facedir",
        selection_box = {
                      type = "fixed",
            fixed = selectionboxes[node],
        },
        node_box = {
            type = "fixed",
            fixed = nodeboxes[node]
        },
        groups = pgroups,
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        drop = "pipeworks:pipe"
    })
    minetest.register_node("pipeworks:"..nodenames[node].."_loaded", {
        description = "Loaded Pipe ("..descriptions[node]..")",
        drawtype = "nodebox",
        tiles = fix_image_names(node, "_loaded"),
        paramtype = "light",
        paramtype2 = "facedir",
        selection_box = {
                      type = "fixed",
            fixed = selectionboxes[node],
        },
        node_box = {
            type = "fixed",
            fixed = nodeboxes[node]
        },
        groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        drop = "pipeworks:pipe"
    })
end
technic/pipeworks/textures/pipeworks_intake_sides.png
technic/pipeworks/textures/pipeworks_intake_top.png
technic/pipeworks/textures/pipeworks_outlet_sides.png
technic/pipeworks/textures/pipeworks_outlet_top.png
technic/pipeworks/textures/pipeworks_pipe_end.png
technic/pipeworks/textures/pipeworks_pipe_end_empty.png
technic/pipeworks/textures/pipeworks_pipe_end_loaded.png
technic/pipeworks/textures/pipeworks_plain.png
technic/pipeworks/textures/pipeworks_plastic_sheeting.png
technic/pipeworks/textures/pipeworks_pump_ends.png
technic/pipeworks/textures/pipeworks_pump_off.png
technic/pipeworks/textures/pipeworks_pump_on.png
technic/pipeworks/textures/pipeworks_pump_sides.png
technic/pipeworks/textures/pipeworks_pump_top_x.png
technic/pipeworks/textures/pipeworks_pump_top_z.png
technic/pipeworks/textures/pipeworks_storage_tank_back.png
technic/pipeworks/textures/pipeworks_storage_tank_fittings.png
technic/pipeworks/textures/pipeworks_storage_tank_front_0.png
technic/pipeworks/textures/pipeworks_storage_tank_front_1.png
technic/pipeworks/textures/pipeworks_storage_tank_front_10.png
technic/pipeworks/textures/pipeworks_storage_tank_front_2.png
technic/pipeworks/textures/pipeworks_storage_tank_front_3.png
technic/pipeworks/textures/pipeworks_storage_tank_front_4.png
technic/pipeworks/textures/pipeworks_storage_tank_front_5.png
technic/pipeworks/textures/pipeworks_storage_tank_front_6.png
technic/pipeworks/textures/pipeworks_storage_tank_front_7.png
technic/pipeworks/textures/pipeworks_storage_tank_front_8.png
technic/pipeworks/textures/pipeworks_storage_tank_front_9.png
technic/pipeworks/textures/pipeworks_testobject.png
technic/pipeworks/textures/pipeworks_tube_end.png
technic/pipeworks/textures/pipeworks_tube_inv.png
technic/pipeworks/textures/pipeworks_tube_noctr.png
technic/pipeworks/textures/pipeworks_tube_plain.png
technic/pipeworks/textures/pipeworks_tube_short.png
technic/pipeworks/textures/pipeworks_tube_transparent.png
technic/pipeworks/textures/pipeworks_valvebody_bottom.png
technic/pipeworks/textures/pipeworks_valvebody_ends.png
technic/pipeworks/textures/pipeworks_valvebody_sides.png
technic/pipeworks/textures/pipeworks_valvebody_top_off.png
technic/pipeworks/textures/pipeworks_valvebody_top_off_x.png
technic/pipeworks/textures/pipeworks_valvebody_top_off_z.png
technic/pipeworks/textures/pipeworks_valvebody_top_on.png
technic/pipeworks/textures/pipeworks_valvebody_top_on_x.png
technic/pipeworks/textures/pipeworks_valvebody_top_on_z.png
technic/pipeworks/textures/pipeworks_windowed_empty.png
technic/pipeworks/textures/pipeworks_windowed_loaded.png
technic/pipeworks/tubes.lua
New file
@@ -0,0 +1,217 @@
-- This file supplies pneumatic tubes and a 'test' device
minetest.register_node("pipeworks:testobject", {
    description = "Pneumatic tube test ojbect",
    tiles = {
        "pipeworks_testobject.png",
    },
    paramtype = "light",
    groups = {snappy=3, tubedevice=1},
    sounds = default.node_sound_wood_defaults(),
    walkable = true,
    after_place_node = function(pos)
            tube_scanforobjects(pos)
    end,
    after_dig_node = function(pos)
            tube_scanforobjects(pos)
    end,
})
-- tables
minetest.register_alias("pipeworks:tube", "pipeworks:tube_000000")
tube_leftstub = {
    { -32/64, -9/64, -9/64, 9/64, 9/64, 9/64 },    -- tube segment against -X face
}
tube_rightstub = {
    { -9/64, -9/64, -9/64,  32/64, 9/64, 9/64 },    -- tube segment against +X face
}
tube_bottomstub = {
    { -9/64, -32/64, -9/64,   9/64, 9/64, 9/64 },    -- tube segment against -Y face
}
tube_topstub = {
    { -9/64, -9/64, -9/64,   9/64, 32/64, 9/64 },    -- tube segment against +Y face
}
tube_frontstub = {
    { -9/64, -9/64, -32/64,   9/64, 9/64, 9/64 },    -- tube segment against -Z face
}
tube_backstub = {
    { -9/64, -9/64, -9/64,   9/64, 9/64, 32/64 },    -- tube segment against -Z face
}
tube_selectboxes = {
    { -32/64,  -10/64,  -10/64,  10/64,  10/64,  10/64 },
    { -10/64 ,  -10/64,  -10/64, 32/64,  10/64,  10/64 },
    { -10/64 , -32/64,  -10/64,  10/64,  10/64,  10/64 },
    { -10/64 ,  -10/64,  -10/64,  10/64, 32/64,  10/64 },
    { -10/64 ,  -10/64, -32/64,  10/64,  10/64,  10/64 },
    { -10/64 ,  -10/64,  -10/64,  10/64,  10/64, 32/64 }
}
--  Functions
function tube_addbox(t, b)
    for i in ipairs(b)
        do table.insert(t, b[i])
    end
end
-- now define the nodes!
for xm = 0, 1 do
for xp = 0, 1 do
for ym = 0, 1 do
for yp = 0, 1 do
for zm = 0, 1 do
for zp = 0, 1 do
    local outboxes = {}
    local outsel = {}
    local outimgs = {}
    if yp==1 then
        tube_addbox(outboxes, tube_topstub)
        table.insert(outsel, tube_selectboxes[4])
        table.insert(outimgs, "pipeworks_tube_noctr.png")
    else
        table.insert(outimgs, "pipeworks_tube_plain.png")
    end
    if ym==1 then
        tube_addbox(outboxes, tube_bottomstub)
        table.insert(outsel, tube_selectboxes[3])
        table.insert(outimgs, "pipeworks_tube_noctr.png")
    else
        table.insert(outimgs, "pipeworks_tube_plain.png")
    end
    if xp==1 then
        tube_addbox(outboxes, tube_rightstub)
        table.insert(outsel, tube_selectboxes[2])
        table.insert(outimgs, "pipeworks_tube_noctr.png")
    else
        table.insert(outimgs, "pipeworks_tube_plain.png")
    end
    if xm==1 then
        tube_addbox(outboxes, tube_leftstub)
        table.insert(outsel, tube_selectboxes[1])
        table.insert(outimgs, "pipeworks_tube_noctr.png")
    else
        table.insert(outimgs, "pipeworks_tube_plain.png")
    end
    if zp==1 then
        tube_addbox(outboxes, tube_backstub)
        table.insert(outsel, tube_selectboxes[6])
        table.insert(outimgs, "pipeworks_tube_noctr.png")
    else
        table.insert(outimgs, "pipeworks_tube_plain.png")
    end
    if zm==1 then
        tube_addbox(outboxes, tube_frontstub)
        table.insert(outsel, tube_selectboxes[5])
        table.insert(outimgs, "pipeworks_tube_noctr.png")
    else
        table.insert(outimgs, "pipeworks_tube_plain.png")
    end
    local jx = xp+xm
    local jy = yp+ym
    local jz = zp+zm
    if (jx+jy+jz) == 1 then
        if xm == 1 then
            table.remove(outimgs, 3)
            table.insert(outimgs, 3, "pipeworks_tube_end.png")
        end
        if xp == 1 then
            table.remove(outimgs, 4)
            table.insert(outimgs, 4, "pipeworks_tube_end.png")
        end
        if ym == 1 then
            table.remove(outimgs, 1)
            table.insert(outimgs, 1, "pipeworks_tube_end.png")
        end
        if xp == 1 then
            table.remove(outimgs, 2)
            table.insert(outimgs, 2, "pipeworks_tube_end.png")
        end
        if zm == 1 then
            table.remove(outimgs, 5)
            table.insert(outimgs, 5, "pipeworks_tube_end.png")
        end
        if zp == 1 then
            table.remove(outimgs, 6)
            table.insert(outimgs, 6, "pipeworks_tube_end.png")
        end
    end
    local tname = xm..xp..ym..yp..zm..zp
    local tgroups = ""
    if tname ~= "000000" then
        tgroups = {snappy=3, tube=1, not_in_creative_inventory=1}
        tubedesc = "Pneumatic tube segment ("..tname..")... You hacker, you."
        iimg=nil
        wscale = {x=1,y=1,z=1}
    else
        tgroups = {snappy=3, tube=1}
        tubedesc = "Pneumatic tube segment"
        iimg="pipeworks_tube_inv.png"
        outimgs = {
            "pipeworks_tube_short.png",
            "pipeworks_tube_short.png",
            "pipeworks_tube_end.png",
            "pipeworks_tube_end.png",
            "pipeworks_tube_short.png",
            "pipeworks_tube_short.png"
        }
        outboxes = { -24/64, -9/64, -9/64, 24/64, 9/64, 9/64 }
        outsel = { -24/64, -10/64, -10/64, 24/64, 10/64, 10/64 }
        wscale = {x=1,y=1,z=0.01}
    end
    minetest.register_node("pipeworks:tube_"..tname, {
        description = tubedesc,
        drawtype = "nodebox",
        tiles = outimgs,
        inventory_image=iimg,
        wield_image=iimg,
        wield_scale=wscale,
        paramtype = "light",
        selection_box = {
                     type = "fixed",
            fixed = outsel
        },
        node_box = {
            type = "fixed",
            fixed = outboxes
        },
        groups = tgroups,
        sounds = default.node_sound_wood_defaults(),
        walkable = true,
        stack_max = 99,
        drop = "pipeworks:tube_000000",
        tubelike=1,
        on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_int("tubelike",1)
        end,
        after_place_node = function(pos)
            tube_scanforobjects(pos)
        end,
        after_dig_node = function(pos)
            tube_scanforobjects(pos)
        end
    })
end
end
end
end
end
end
technic/technic/alloy_furnace.lua
File was renamed from alloy_furnace.lua
@@ -19,6 +19,16 @@
alloy_recipes[registered_recipes_count].dst_name=string3
alloy_recipes[registered_recipes_count].dst_count=count3
registered_recipes_count=registered_recipes_count+1
if UI_recipes_hook then
    minetest.register_craft({
    type = "alloy",
    output = string3.." "..count3,
    recipe = {
        {string1.." "..count1},
        {string2.." "..count2},
            }
    })
    end
end
register_alloy_recipe ("technic:copper_dust",3, "technic:tin_dust",1, "technic:bronze_dust",4)
@@ -26,7 +36,7 @@
register_alloy_recipe ("technic:iron_dust",3, "technic:chromium_dust",1, "technic:stainless_steel_dust",4)
register_alloy_recipe ("default:steel_ingot",3, "technic:chromium_ingot",1, "technic:stainless_steel_ingot",4)
register_alloy_recipe ("technic:copper_dust",2, "technic:zinc_dust",1, "technic:brass_dust",3)
register_alloy_recipe ("technic:copper_ingot",2, "technic:zinc_ingot",1, "technic:brass_ingot",3)
register_alloy_recipe ("moreores:copper_ingot",2, "technic:zinc_ingot",1, "technic:brass_ingot",3)
register_alloy_recipe ("default:sand",2, "technic:coal_dust",2, "technic:silicon_wafer",1)
register_alloy_recipe ("technic:silicon_wafer",1, "technic:mithril_dust",1, "technic:doped_silicon_wafer",1)
@@ -421,4 +431,4 @@
        inv:set_stack("fuel", 1, stack)
    
end,        
})
})
technic/technic/battery_box.lua
technic/technic/battery_box_mv.lua
File was renamed from battery_box_mv.lua
@@ -206,7 +206,7 @@
        MV_nodes[1].y=pos1.y
        MV_nodes[1].z=pos1.z
        MV_nodes[1].visited=false
table_index=1
    repeat
    check_MV_node (PR_nodes,RE_nodes,MV_nodes,table_index)
@@ -318,4 +318,4 @@
if meta:get_float("mv_cablelike")==1 then new_node_added=add_new_MVcable_node(MV_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:solar_panel_mv" then     new_node_added=add_new_MVcable_node(PR_nodes,pos1) end        
end
technic/technic/cans.lua
File was renamed from cans.lua
@@ -29,33 +29,32 @@
        
        if pointed_thing.type ~= "node" then
                    return end
        n = minetest.env:get_node(pointed_thing.under)
        item=itemstack:to_table()
        local load=nil
        if item["metadata"]=="" then load=0
        else load=tonumber(item["metadata"])
        end
        if n.name == "default:water_source" then
            item=itemstack:to_table()
            local load=tonumber((item["wear"]))
            if  load==0 then load =65535 end
            load=get_RE_item_load(load,water_can_max_load)
            if load+1<17 then
            minetest.env:add_node(pointed_thing.under, {name="air"})
             load=load+1;    
            load=set_RE_item_load(load,water_can_max_load)
            item["wear"]=tostring(load)
            item["metadata"]=tostring(load)
            set_RE_wear(item,load,water_can_max_load)
            itemstack:replace(item)
            end
            return itemstack
        end
        item=itemstack:to_table()
            load=tonumber((item["wear"]))
            if  load==0 then load =65535 end
            load=get_RE_item_load(load,water_can_max_load)
            if load==0 then return end
        if load==0 then return end
            
        if n.name == "default:water_flowing" then
            minetest.env:add_node(pointed_thing.under, {name="default:water_source"})
            load=load-1;    
            load=set_RE_item_load(load,water_can_max_load)
            item["wear"]=tostring(load)
            item["metadata"]=tostring(load)
            set_RE_wear(item,load,water_can_max_load)
            itemstack:replace(item)
            return itemstack
            end
@@ -64,8 +63,8 @@
        if n.name == "air" then
            minetest.env:add_node(pointed_thing.above, {name="default:water_source"})
            load=load-1;    
            load=set_RE_item_load(load,water_can_max_load)
            item["wear"]=tostring(load)
            item["metadata"]=tostring(load)
            set_RE_wear(item,load,water_can_max_load)
            itemstack:replace(item)
            return itemstack
            end        
@@ -78,7 +77,45 @@
    stack_max = 1,
    liquids_pointable = true,
    on_use = function(itemstack, user, pointed_thing)
        item=itemstack:to_table()
        local load=nil
        if item["metadata"]=="" then load=0
        else load=tonumber(item["metadata"])
        end
        
        if n.name == "default:water_source" then
            if load+1<17 then
            minetest.env:add_node(pointed_thing.under, {name="air"})
             load=load+1;
            item["metadata"]=tostring(load)
            set_RE_wear(item,load,water_can_max_load)
            itemstack:replace(item)
            end
            return itemstack
        end
        item=itemstack:to_table()
        if load==0 then return end
        if n.name == "default:lava_flowing" then
            minetest.env:add_node(pointed_thing.under, {name="default:lava_source"})
            load=load-1;
            item["metadata"]=tostring(load)
            set_RE_wear(item,load,water_can_max_load)
            itemstack:replace(item)
            return itemstack
            end
        n = minetest.env:get_node(pointed_thing.above)
        if n.name == "air" then
            minetest.env:add_node(pointed_thing.above, {name="default:lava_source"})
            load=load-1;
            item["metadata"]=tostring(load)
            set_RE_wear(item,load,water_can_max_load)
            itemstack:replace(item)
            return itemstack
            end
        if pointed_thing.type ~= "node" then
                    return end
        
technic/technic/chainsaw.lua
File was renamed from chainsaw.lua
@@ -26,7 +26,7 @@
    output = 'technic:chainsaw',
    recipe = {
        {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'},
        {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'},
        {'technic:stainless_steel_ingot', 'technic:motor', 'technic:battery'},
        {'','','moreores:copper_ingot'},
    }
})
technic/technic/concrete.lua
File was renamed from concrete.lua
@@ -71,4 +71,13 @@
    groups = {cracky=1},
    sounds = default.node_sound_stone_defaults(),
})
})
stairsplus.register_stair_and_slab_and_panel_and_micro("concrete", "technic:concrete",
        {cracky=3},
        {"technic_concrete_block.png"},
        "Concrete Stairs",
        "Concrete Slab",
        "Concrete Panel",
        "Concrete Microblock",
        "concrete")
technic/technic/config.lua
New file
@@ -0,0 +1,10 @@
enable_item_drop=false
enable_item_pickup=true
enable_technic_inventory=true
enable_mining_drill=true
enable_mining_laser=true
enable_flashlight=true
enable_rubber_tree_generation=true
enable_marble_generation=true
enable_granite_generation=true
enable_obsidian_generation=true
technic/technic/constructor.lua
technic/technic/copper_chest.lua
technic/technic/creative.lua
New file
@@ -0,0 +1,21 @@
technic.creative_inventory_size = 0
technic.creative_list = {}
-- Create detached creative inventory after loading all mods
minetest.after(0, function()
    local inv = minetest.create_detached_inventory("technic_creative", {})
    technic.creative_list = {}
    for name,def in pairs(minetest.registered_items) do
        if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0)
                and def.description and def.description ~= "" then
            table.insert(technic.creative_list, name)
        end
    end
    table.sort(technic.creative_list)
    --inv:set_size("main", #technic.creative_list)
    --for _,itemstring in ipairs(technic.creative_list) do
    --    local stack = ItemStack(itemstring)
    --    inv:add_item("main", stack)
    --end
    --technic.creative_inventory_size = #technic.creative_list
end)
technic/technic/depends.txt
File was renamed from depends.txt
@@ -2,4 +2,4 @@
flowers
pipeworks
mesecons
farming
stairsplus
technic/technic/deployer.lua
technic/technic/electric.lua
technic/technic/electric_furnace.lua
File was renamed from electric_furnace.lua
@@ -107,8 +107,9 @@
        local load = math.floor(internal_EU_buffer/2000 * 100)
        meta:set_string("formspec",
                "invsize[8,9;]"..
                "background[-1,-1;10,11;technic_electric_furnace_GUI.png]"..
                "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
                        (load)..":technic_power_meter_fg.png]"..
                    (load)..":technic_power_meter_fg.png]"..
                "list[current_name;src;3,1;1,1;]"..
                "list[current_name;dst;5,1;2,2;]"..
                "list[current_player;main;0,5;8,4;]"..
technic/technic/flashlight.lua
File was renamed from flashlight.lua
@@ -13,7 +13,7 @@
    minetest.register_craft({
            output = "technic:flashlight",
            recipe = {
            {"glass","glass","glass"},
            {"technic:rubber","glass","technic:rubber"},
                    {"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
                    {"","technic:battery",""}
            }
technic/technic/flashlight_old.lua
New file
@@ -0,0 +1,176 @@
-- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621
flashlight_max_charge=30000
       minetest.register_tool("technic:flashlight", {
            description = "Flashlight",
            inventory_image = "technic_flashlight.png",
    stack_max = 1,
            on_use = function(itemstack, user, pointed_thing)
    end,
    })
    minetest.register_craft({
            output = "technic:flashlight",
            recipe = {
            {"glass","glass","glass"},
                    {"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"},
                    {"","technic:battery",""}
            }
    })
local players = {}
local player_positions = {}
local last_wielded = {}
function round(num)
    return math.floor(num + 0.5)
end
minetest.register_on_joinplayer(function(player)
    local player_name = player:get_player_name()
    table.insert(players, player_name)
    last_wielded[player_name] = flashlight_weared(player)
    local pos = player:getpos()
    local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
    local wielded_item = player:get_wielded_item():get_name()
    if flashlight_weared(player)==true then
        -- Neuberechnung des Lichts erzwingen
        minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
        minetest.env:add_node(rounded_pos,{type="node",name="air"})
    end
    player_positions[player_name] = {}
    player_positions[player_name]["x"] = rounded_pos.x;
    player_positions[player_name]["y"] = rounded_pos.y;
    player_positions[player_name]["z"] = rounded_pos.z;
end)
minetest.register_on_leaveplayer(function(player)
    local player_name = player:get_player_name()
    for i,v in ipairs(players) do
        if v == player_name then
            table.remove(players, i)
            last_wielded[player_name] = nil
            -- Neuberechnung des Lichts erzwingen
            local pos = player:getpos()
            local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
            minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
            minetest.env:add_node(rounded_pos,{type="node",name="air"})
            player_positions[player_name]["x"] = nil
            player_positions[player_name]["y"] = nil
            player_positions[player_name]["z"] = nil
            player_positions[player_name]["m"] = nil
            player_positions[player_name] = nil
        end
    end
end)
minetest.register_globalstep(function(dtime)
    for i,player_name in ipairs(players) do
        local player = minetest.env:get_player_by_name(player_name)
        if flashlight_weared(player)==true then
            -- Fackel ist in der Hand
            local pos = player:getpos()
            local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
            if (last_wielded[player_name] ~= true) or (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
                -- Fackel gerade in die Hand genommen oder zu neuem Node bewegt
                local is_air  = minetest.env:get_node_or_nil(rounded_pos)
                if is_air == nil or (is_air ~= nil and (is_air.name == "air" or is_air.name == "technic:light")) then
                    -- wenn an aktueller Position "air" ist, Fackellicht setzen
                    minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
                end
                if (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
                    -- wenn Position geänder, dann altes Licht löschen
                    local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
                    -- Neuberechnung des Lichts erzwingen
                    local is_light = minetest.env:get_node_or_nil(old_pos)
                    if is_light ~= nil and is_light.name == "technic:light" then
                        minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
                        minetest.env:add_node(old_pos,{type="node",name="air"})
                    end
                end
                -- gemerkte Position ist nun die gerundete neue Position
                player_positions[player_name]["x"] = rounded_pos.x
                player_positions[player_name]["y"] = rounded_pos.y
                player_positions[player_name]["z"] = rounded_pos.z
            end
            last_wielded[player_name] = true;
        elseif last_wielded[player_name] == true  then
            -- Fackel nicht in der Hand, aber beim letzten Durchgang war die Fackel noch in der Hand
            local pos = player:getpos()
            local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
            repeat
                local is_light  = minetest.env:get_node_or_nil(rounded_pos)
                if is_light ~= nil and is_light.name == "technic:light" then
                    -- minetest.env:remove_node(rounded_pos)
                    -- Erzwinge Neuberechnung des Lichts
                    minetest.env:add_node(rounded_pos,{type="node",name="technic:light_off"})
                    minetest.env:add_node(rounded_pos,{type="node",name="air"})
                end
            until minetest.env:get_node_or_nil(rounded_pos) ~= "technic:light"
            local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
            repeat
                is_light  = minetest.env:get_node_or_nil(old_pos)
                if is_light ~= nil and is_light.name == "technic:light" then
                    -- minetest.env:remove_node(old_pos)
                    -- Erzwinge Neuberechnung des Lichts
                    minetest.env:add_node(old_pos,{type="node",name="technic:light_off"})
                    minetest.env:add_node(old_pos,{type="node",name="air"})
                end
            until minetest.env:get_node_or_nil(old_pos) ~= "technic:light"
            last_wielded[player_name] = true
        end
    end
end)
minetest.register_node("technic:light", {
    drawtype = "glasslike",
    tile_images = {"technic_light.png"},
    paramtype = "light",
    walkable = false,
    is_ground_content = true,
    light_propagates = true,
    sunlight_propagates = true,
    light_source = 15,
    selection_box = {
        type = "fixed",
        fixed = {0, 0, 0, 0, 0, 0},
    },
})
minetest.register_node("technic:light_off", {
    drawtype = "glasslike",
    tile_images = {"technic_light.png"},
    paramtype = "light",
    walkable = false,
    is_ground_content = true,
    light_propagates = true,
    sunlight_propagates = true,
    selection_box = {
        type = "fixed",
        fixed = {0, 0, 0, 0, 0, 0},
    },
})
function flashlight_weared (player)
flashlight_on=false
local inv = player:get_inventory()
local hotbar=inv:get_list("main")
        for i=1,8,1 do
            if hotbar[i]:get_name() == "technic:flashlight" then
            item=hotbar[i]:to_table()
            if item["metadata"]=="" or item["metadata"]=="0" then return flashlight_on end --flashlight not charghed
            charge=tonumber(item["metadata"])
            if charge-2>0 then
             flashlight_on=true
             charge =charge-2;
            set_RE_wear(item,charge,flashlight_max_charge)
            item["metadata"]=tostring(charge)
            hotbar[i]:replace(item)
            inv:set_stack("main",i,hotbar[i])
            return true
            end
            end
        end
return flashlight_on
end
technic/technic/generator.lua
technic/technic/geothermal.lua
technic/technic/gold_chest.lua
technic/technic/grinder.lua
File was renamed from grinder.lua
@@ -7,6 +7,13 @@
grinder_recipes[registered_grinder_recipes_count].src_name=string1
grinder_recipes[registered_grinder_recipes_count].dst_name=string2
registered_grinder_recipes_count=registered_grinder_recipes_count+1
if UI_recipes_hook then
    minetest.register_craft({
    type = "grinding",
    output = string2,
    recipe = string1,
    })
    end
end
register_grinder_recipe("default:stone","default:sand")
@@ -31,7 +38,6 @@
register_grinder_recipe("flowers:flower_tulip","dye:orange 2") 
register_grinder_recipe("flowers:flower_rose","dye:red 2") 
register_grinder_recipe("flowers:flower_viola","dye:violet 2") 
minetest.register_craftitem( "technic:coal_dust", {
    description = "Coal Dust",
@@ -317,4 +323,4 @@
end
return nil
        
end
end
technic/technic/grinder_gloopores.lua
New file
@@ -0,0 +1,55 @@
register_grinder_recipe("gloopores:alatro_lump","technic:alatro_dust 2")
register_grinder_recipe("gloopores:kalite_lump","technic:kalite_dust 2")
register_grinder_recipe("gloopores:arol_lump","technic:arol_dust 2")
register_grinder_recipe("gloopores:talinite_lump","technic:talinite_dust 2")
register_grinder_recipe("gloopores:akalin_lump","technic:akalin_dust 2")
 
minetest.register_craftitem("technic:alatro_dust", {
  Â  Â  Â  description = "Alatro Dust",
  Â  Â  Â  inventory_image = "technic_alatro_dust.png",
})
 
minetest.register_craft({
  Â  type = "cooking",
  Â  output = "gloopores:alatro_ingot",
  Â  recipe = "technic:alatro_dust",
})
 
minetest.register_craftitem("technicplus:arol_dust", {
  Â  Â  Â  description = "Arol Dust",
  Â  Â  Â  inventory_image = "technic_arol_dust.png",
})
 
minetest.register_craft({
  Â  type = "cooking",
  Â  output = "gloopores:arol_ingot",
  Â  recipe = "technic:arol_dust",
})
 
minetest.register_craftitem("technic:talinite_dust", {
  Â  Â  Â  description = "Talinite Dust",
  Â  Â  Â  inventory_image = "technic_talinite_dust.png",
})
 
minetest.register_craft({
  Â  type = "cooking",
  Â  output = "gloopores:talinite_ingot",
  Â  recipe = "technic:talinite_dust",
})
 
minetest.register_craftitem("technic:akalin_dust", {
  Â  Â  Â  description = "Akalin Dust",
  Â  Â  Â  inventory_image = "technic_akalin_dust.png",
})
 
minetest.register_craft({
  Â  type = "cooking",
  Â  output = "gloopores:akalin_ingot",
  Â  recipe = "technic:akalin_dust",
})
 
minetest.register_craftitem("technic:kalite_dust", {
  Â  Â  Â  description = "Kalite Dust",
  Â  Â  Â  inventory_image = "technic_kalite_dust.png",
  Â  Â  Â  on_use = minetest.item_eat(2)
})
technic/technic/init.lua
File was renamed from init.lua
@@ -1,4 +1,4 @@
-- Minetest 0.4.3 : technic
-- Minetest 0.4.4 : technic
minetest.register_alias("rebar", "technic:rebar")
minetest.register_alias("concrete", "technic:concrete")
@@ -20,46 +20,57 @@
--Read technic config file
dofile(modpath.."/config.lua")
dofile(modpath.."/concrete.lua")
-- world gen
dofile(modpath.."/ores.lua")
if enable_rubber_tree_generation==true then dofile(modpath.."/rubber.lua") end
-- chests
dofile(modpath.."/iron_chest.lua")
dofile(modpath.."/copper_chest.lua")
dofile(modpath.."/silver_chest.lua")
dofile(modpath.."/gold_chest.lua")
dofile(modpath.."/mithril_chest.lua")
dofile(modpath.."/electric_furnace.lua")
dofile(modpath.."/battery_box.lua")
dofile(modpath.."/wires.lua")
dofile(modpath.."/wires_mv.lua")
dofile(modpath.."/ores.lua")
dofile(modpath.."/tool_workshop.lua")
dofile(modpath.."/music_player.lua")
dofile(modpath.."/grinder.lua")
dofile(modpath.."/mining_laser_mk1.lua")
dofile(modpath.."/injector.lua")
dofile(modpath.."/generator.lua")
--items
dofile(modpath.."/concrete.lua")
dofile(modpath.."/items.lua")
--LV machines
dofile(modpath.."/alloy_furnace.lua")
dofile(modpath.."/solar_panel.lua")
dofile(modpath.."/geothermal.lua")
dofile(modpath.."/water_mill.lua")
dofile(modpath.."/alloy_furnace.lua")
dofile(modpath.."/items.lua")
dofile(modpath.."/mining_drill.lua")
dofile(modpath.."/screwdriver.lua")
dofile(modpath.."/sonic_screwdriver.lua")
dofile(modpath.."/node_breaker.lua")
dofile(modpath.."/deployer.lua")
dofile(modpath.."/constructor.lua")
dofile(modpath.."/tree_tap.lua")
dofile(modpath.."/flashlight.lua")
dofile(modpath.."/cans.lua")
dofile(modpath.."/chainsaw.lua")
if enable_item_drop    then dofile(modpath.."/item_drop.lua") end
if enable_item_pickup   then dofile(modpath.."/item_pickup.lua") end
dofile(modpath.."/electric_furnace.lua")
dofile(modpath.."/battery_box.lua")
dofile(modpath.."/wires.lua")
dofile(modpath.."/tool_workshop.lua")
dofile(modpath.."/music_player.lua")
dofile(modpath.."/generator.lua")
dofile(modpath.."/grinder.lua")
--MV machines
dofile(modpath.."/wires_mv.lua")
dofile(modpath.."/solar_panel_mv.lua")
dofile(modpath.."/battery_box_mv.lua")
--Tools
if enable_mining_dril==true then dofile(modpath.."/mining_drill.lua") end
if enable_mining_laser==true then dofile(modpath.."/mining_laser_mk1.lua") end
if enable_flashlight==true then dofile(modpath.."/flashlight.lua") end
dofile(modpath.."/cans.lua")
dofile(modpath.."/chainsaw.lua")
dofile(modpath.."/tree_tap.lua")
dofile(modpath.."/screwdriver.lua")
dofile(modpath.."/sonic_screwdriver.lua")
-- mesecons and tubes related
dofile(modpath.."/injector.lua")
dofile(modpath.."/node_breaker.lua")
dofile(modpath.."/deployer.lua")
dofile(modpath.."/constructor.lua")
if enable_item_drop    then dofile(modpath.."/item_drop.lua") end
if enable_item_pickup   then dofile(modpath.."/item_pickup.lua") end
function has_locked_chest_privilege(meta, player)
    if player:get_player_name() ~= meta:get_string("owner") then
@@ -82,4 +93,4 @@
    meta = minetest.env:get_meta(pos)
    meta:from_table(meta0)
    return 1
end
end
technic/technic/injector.lua
technic/technic/injector1.lua
New file
@@ -0,0 +1,248 @@
minetest.register_craftitem("technic:injector", {
    description = "Injector",
    stack_max = 99,
})
minetest.register_node("technic:injector", {
    description = "Injector",
    tiles = {"technic_iron_chest_top.png", "technic_iron_chest_top.png", "technic_iron_chest_side.png",
        "technic_iron_chest_side.png", "technic_iron_chest_side.png", "technic_iron_chest_front.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",
                "invsize[9,9;]"..
                "list[current_name;main;0,2;8,2;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Injector")
        local inv = meta:get_inventory()
        inv:set_size("main", 8*4)
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        return inv:is_empty("main")
    end,
    on_punch = function (pos, node, puncher)
    local meta = minetest.env:get_meta(pos);
    local inv = meta:get_inventory()
    for _,stack in ipairs(inv:get_list("main")) do
        if stack:get_name() ~="" then
            inv:remove_item("main",stack)
            item1=tube_item({x=pos.x+.5,y=pos.y,z=pos.z},stack)
            return
            end
    end
end,
})
function tube_item(pos, item)
    -- Take item in any format
    local stack = ItemStack(item)
    local obj = minetest.env:add_entity(pos, "technic:tubed_item")
    obj:get_luaentity():set_item(stack:to_string())
    obj:get_luaentity().start_pos = {x=pos.x,y=pos.y,z=pos.z}
    obj:setacceleration({x=0, y=0, z=0})
    pos.x=pos.x+1
    local meta = minetest.env:get_meta(pos)
    if meta:get_int("tubelike")==1 then obj:setvelocity({x=1, y=0, z=0}) return obj end
    pos.x=pos.x-2
    meta = minetest.env:get_meta(pos)
    if meta:get_int("tubelike")==1 then obj:setvelocity({x=-1, y=0, z=0}) return obj end
    pos.x=pos.x+1
    pos.z=pos.z+1
    meta = minetest.env:get_meta(pos)
    if meta:get_int("tubelike")==1 then obj:setvelocity({x=0, y=0, z=1}) return obj end
    pos.z=pos.z-2
    meta = minetest.env:get_meta(pos)
    if meta:get_int("tubelike")==1 then obj:setvelocity({x=0, y=0, z=-1}) return obj end
    pos.z=pos.z+1
    pos.y=pos.y+1
    meta = minetest.env:get_meta(pos)
    if meta:get_int("tubelike")==1 then obj:setvelocity({x=0, y=1, z=0}) return obj end
    pos.y=pos.y-2
    meta = minetest.env:get_meta(pos)
    if meta:get_int("tubelike")==1 then obj:setvelocity({x=0, y=-2, z=0}) return obj end
    pos.y=pos.y+1
    return obj
end
minetest.register_entity("technic:tubed_item", {
    initial_properties = {
        hp_max = 1,
        physical = false,
        collisionbox = {0,0,0,0,0,0},
        visual = "sprite",
        visual_size = {x=0.5, y=0.5},
        textures = {""},
        spritediv = {x=1, y=1},
        initial_sprite_basepos = {x=0, y=0},
        is_visible = false,
        start_pos={}
    },
    itemstring = '',
    physical_state = false,
    set_item = function(self, itemstring)
        self.itemstring = itemstring
        local stack = ItemStack(itemstring)
        local itemtable = stack:to_table()
        local itemname = nil
        if itemtable then
            itemname = stack:to_table().name
        end
        local item_texture = nil
        local item_type = ""
        if minetest.registered_items[itemname] then
            item_texture = minetest.registered_items[itemname].inventory_image
            item_type = minetest.registered_items[itemname].type
        end
        prop = {
            is_visible = true,
            visual = "sprite",
            textures = {"unknown_item.png"}
        }
        if item_texture and item_texture ~= "" then
            prop.visual = "sprite"
            prop.textures = {item_texture}
            prop.visual_size = {x=0.3, y=0.3}
        else
            prop.visual = "wielditem"
            prop.textures = {itemname}
            prop.visual_size = {x=0.15, y=0.15}
        end
        self.object:set_properties(prop)
    end,
    get_staticdata = function(self)
            return    minetest.serialize({
                itemstring=self.itemstring,
                velocity=self.object:getvelocity(),
                start_pos=self.start_pos
                })
    end,
    on_activate = function(self, staticdata)
        if  staticdata=="" or staticdata==nil then return end
        local item = minetest.deserialize(staticdata)
        local stack = ItemStack(item.itemstring)
        local itemtable = stack:to_table()
        local itemname = nil
        if itemtable then
            itemname = stack:to_table().name
        end
        if itemname then
        self.start_pos=item.start_pos
        self.object:setvelocity(item.velocity)
        self.object:setacceleration({x=0, y=0, z=0})
        self.object:setpos(item.start_pos)
        end
        self:set_item(item.itemstring)
    end,
    on_step = function(self, dtime)
    if self.start_pos then
    local pos = self.object:getpos()
    local node = minetest.env:get_node(pos)
    local meta = minetest.env:get_meta(pos)
    tubelike=meta:get_int("tubelike")
    local velocity=self.object:getvelocity()
    if not velocity then return end
    if math.abs(velocity.x)==1 then
        local next_node=math.abs(pos.x-self.start_pos.x)
        if next_node >= 1 then
            self.start_pos.x=self.start_pos.x+velocity.x
            if check_pos_vector (self.start_pos, velocity)==0 then
            check_next_step (self.start_pos, velocity)
            self.object:setpos(self.start_pos)
            self.object:setvelocity(velocity)
            return
            end
            end
        end
    if math.abs(velocity.y)==1 then
        local next_node=math.abs(pos.y-self.start_pos.y)
        if next_node >= 1 then
            self.start_pos.y=self.start_pos.y+velocity.y
            if check_pos_vector (self.start_pos, velocity)==0 then
            check_next_step (self.start_pos, velocity)
            self.object:setpos(self.start_pos)
            self.object:setvelocity(velocity)
            return
            end
            end
        end
    if math.abs(velocity.z)==1 then
        local next_node=math.abs(pos.z-self.start_pos.z)
        if next_node >= 1 then
            self.start_pos.z=self.start_pos.z+velocity.z
            if check_pos_vector (self.start_pos, velocity)==0 then
            check_next_step (self.start_pos, velocity)
            self.object:setpos(self.start_pos)
            self.object:setvelocity(velocity)
            return
            end
            end
        end
    end
end
})
function check_next_step (pos,velocity)
local meta
local tubelike
if velocity.x==0 then
meta = minetest.env:get_meta({x=pos.x-1,y=pos.y,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=-1 velocity.y=0 velocity.z=0 return end
meta = minetest.env:get_meta({x=pos.x+1,y=pos.y,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=1 velocity.y=0 velocity.z=0 return end
end
if velocity.z==0 then
meta = minetest.env:get_meta({x=pos.x,y=pos.y,z=pos.z+1})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=0 velocity.z=1 return end
meta = minetest.env:get_meta({x=pos.x,y=pos.y,z=pos.z-1})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=0 velocity.z=-1 return end
end
if velocity.y==0 then
meta = minetest.env:get_meta({x=pos.x,y=pos.y+1,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=1 velocity.z=0 return end
meta = minetest.env:get_meta({x=pos.x,y=pos.y-1,z=pos.z})
tubelike=meta:get_int("tubelike")
if tubelike==1 then velocity.x=0 velocity.y=-1 velocity.z=0 return end
end
--velocity.x=0
--velocity.y=0
--velocity.z=0
end
function check_pos_vector (pos,velocity)
added={}
added.x=pos.x+velocity.x
added.y=pos.y+velocity.y
added.z=pos.z+velocity.z
local meta=minetest.env:get_meta(added)
--print(dump(added).." : "..tubelike)
if meta:get_int("tubelike")==1 then return 1 end
return 0
end
technic/technic/iron_chest.lua
File was renamed from iron_chest.lua
@@ -54,15 +54,6 @@
        local inv = meta:get_inventory()
        inv:set_size("main", 9*4)
    end,
    after_place_node = function(pos, placer)
        ntop1 = minetest.env:get_node({x=pos.x, y=pos.y, z=pos.z})
        ntop = minetest.env:get_node({x=pos.x, y=pos.y+1, z=pos.z})
                if ntop.name ~= "air" then
                        minetest.node_dig(pos, ntop1, placer)
        end
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
@@ -170,7 +161,3 @@
                " takes stuff from locked chest at "..minetest.pos_to_string(pos))
    end,
})
function add_item (player)
player:get_inventory():add_item("main", "blabla 1")
end
technic/technic/item_drop.lua
technic/technic/item_pickup.lua
technic/technic/items.lua
File was renamed from items.lua
@@ -55,27 +55,27 @@
minetest.register_craft({
    output = 'technic:green_energy_crystal',
    recipe = {
        {'moreores:gold_ingot', 'technic:battery', 'group:dye,basecolor_green'},
        {'moreores:gold_ingot', 'technic:battery', 'dye:green'},
        {'technic:battery', 'technic:red_energy_crystal', 'technic:battery'},
        {'group:dye,basecolor_green', 'technic:battery', 'moreores:gold_ingot'},
        {'dye:green', 'technic:battery', 'moreores:gold_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:blue_energy_crystal',
    recipe = {
        {'moreores:gold_ingot', 'technic:battery', 'group:dye,basecolor_blue'},
        {'moreores:gold_ingot', 'technic:battery', 'dye:blue'},
        {'technic:battery', 'technic:green_energy_crystal', 'technic:battery'},
        {'group:dye,basecolor_green', 'technic:battery', 'moreores:gold_ingot'},
        {'dye:blue', 'technic:battery', 'moreores:gold_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:red_energy_crystal',
    recipe = {
        {'moreores:gold_ingot', 'technic:battery', 'group:dye,basecolor_red'},
        {'moreores:gold_ingot', 'technic:battery', 'dye:red'},
        {'technic:battery', 'technic:diamond_block', 'technic:battery'},
        {'group:dye,basecolor_red', 'technic:battery', 'moreores:gold_ingot'},
        {'dye:red', 'technic:battery', 'moreores:gold_ingot'},
    }
})
technic/technic/mining_drill.lua
File was renamed from mining_drill.lua
@@ -25,8 +25,8 @@
    output = 'technic:mining_drill',
    recipe = {
        {'technic:stainless_steel_ingot', 'technic:diamond_drill_head', 'technic:stainless_steel_ingot'},
        {'technic:stainless_steel_ingot', 'technic:red_energy_crystal', 'technic:stainless_steel_ingot'},
        {'', 'moreores:copper_ingot', ''},
        {'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'},
        {'', 'technic:red_energy_crystal', 'moreores:copper_ingot'},
    }
})
technic/technic/mining_laser_mk1.lua
technic/technic/mithril_chest.lua
technic/technic/mithril_subspace_chest.lua
copy from mithril_chest.lua copy to technic/technic/mithril_subspace_chest.lua
technic/technic/music_player.lua
technic/technic/node_breaker.lua
technic/technic/ores.lua
New file
@@ -0,0 +1,339 @@
minetest.register_node( "technic:marble", {
    description = "Marble",
    tiles = { "technic_marble.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
})
minetest.register_node( "technic:marble_bricks", {
    description = "Marble Bricks",
    tiles = { "technic_marble_bricks.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
})
minetest.register_craft({
    output = 'technic:marble_bricks 4',
    recipe = {
        {'technic:marble','technic:marble'},
        {'technic:marble','technic:marble'}
    }
})
minetest.register_node( "technic:granite", {
    description = "Granite",
    tiles = { "technic_granite.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
})
minetest.register_node( "technic:obsidian", {
    description = "Obsidian",
    tiles = { "technic_obsidian.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
})
stairsplus.register_stair_and_slab_and_panel_and_micro("marble", "technic:marble",
        {cracky=3},
        {"technic_marble.png"},
        "Marble Stairs",
        "Marble Slab",
        "Marble Panel",
        "Marble Microblock",
        "marble")
stairsplus.register_stair_and_slab_and_panel_and_micro("marble_bricks", "technic:marble_bricks",
        {cracky=3},
        {"technic_marble_bricks.png"},
        "Marble Bricks Stairs",
        "Marble Bricks Slab",
        "Marble Bricks Panel",
        "Marble Bricks Microblock",
        "marble_bricks")
stairsplus.register_stair_and_slab_and_panel_and_micro("granite", "technic:granite",
        {cracky=3},
        {"technic_granite.png"},
        "Granite Stairs",
        "Granite Slab",
        "Granite Panel",
        "Granite Microblock",
        "granite")
stairsplus.register_stair_and_slab_and_panel_and_micro("obsidian", "technic:obsidian",
        {cracky=3},
        {"technic_obsidian.png"},
        "Obsidian Stairs",
        "Obsidian Slab",
        "Obsidian Panel",
        "Obsidian Microblock",
        "obsidian")
minetest.register_node( "technic:mineral_diamond", {
    description = "Diamond Ore",
    tiles = { "default_stone.png^technic_mineral_diamond.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
    drop = 'craft "technic:diamond" 1',
})
minetest.register_craftitem( "technic:diamond", {
    description = "Diamond",
    inventory_image = "technic_diamond.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_node( "technic:mineral_uranium", {
    description = "Uranium Ore",
    tiles = { "default_stone.png^technic_mineral_uranium.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
    drop = 'craft "technic:uranium" 1',
})
minetest.register_craftitem( "technic:uranium", {
    description = "Uranium",
    inventory_image = "technic_uranium.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_node( "technic:mineral_chromium", {
    description = "Chromium Ore",
    tiles = { "default_stone.png^technic_mineral_chromium.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
    drop = 'craft "technic:chromium_lump" 1',
})
minetest.register_craftitem( "technic:chromium_lump", {
    description = "Chromium Lump",
    inventory_image = "technic_chromium_lump.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craftitem( "technic:chromium_ingot", {
    description = "Chromium Ingot",
    inventory_image = "technic_chromium_ingot.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
                type = 'cooking',
                output = "technic:chromium_ingot",
                recipe = "technic:chromium_lump"
            })
minetest.register_node( "technic:mineral_zinc", {
    description = "Zinc Ore",
    tile_images = { "default_stone.png^technic_mineral_zinc.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
    drop = 'craft "technic:zinc_lump" 1',
})
minetest.register_craftitem( "technic:zinc_lump", {
    description = "Zinc Lump",
    inventory_image = "technic_zinc_lump.png",
})
minetest.register_craftitem( "technic:zinc_ingot", {
    description = "Zinc Ingot",
    inventory_image = "technic_zinc_ingot.png",
})
minetest.register_craftitem( "technic:stainless_steel_ingot", {
    description = "Stainless Steel Ingot",
    inventory_image = "technic_stainless_steel_ingot.png",
})
minetest.register_craftitem( "technic:brass_ingot", {
    description = "Brass Ingot",
    inventory_image = "technic_brass_ingot.png",
})
minetest.register_craft({
                type = 'cooking',
                output = "technic:zinc_ingot",
                recipe = "technic:zinc_lump"
            })
local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, ore_per_chunk, height_min, height_max)
    if maxp.y < height_min or minp.y > height_max then
        return
    end
    local y_min = math.max(minp.y, height_min)
    local y_max = math.min(maxp.y, height_max)
    local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1)
    local pr = PseudoRandom(seed)
    local num_chunks = math.floor(chunks_per_volume * volume)
    local chunk_size = 3
    if ore_per_chunk <= 4 then
        chunk_size = 2
    end
    local inverse_chance = math.floor(chunk_size*chunk_size*chunk_size / ore_per_chunk)
    --print("generate_ore num_chunks: "..dump(num_chunks))
    for i=1,num_chunks do
    if (y_max-chunk_size+1 <= y_min) then return end
        local y0 = pr:next(y_min, y_max-chunk_size+1)
        if y0 >= height_min and y0 <= height_max then
            local x0 = pr:next(minp.x, maxp.x-chunk_size+1)
            local z0 = pr:next(minp.z, maxp.z-chunk_size+1)
            local p0 = {x=x0, y=y0, z=z0}
            for x1=0,chunk_size-1 do
            for y1=0,chunk_size-1 do
            for z1=0,chunk_size-1 do
                if pr:next(1,inverse_chance) == 1 then
                    local x2 = x0+x1
                    local y2 = y0+y1
                    local z2 = z0+z1
                    local p2 = {x=x2, y=y2, z=z2}
                    if minetest.env:get_node(p2).name == wherein then
                        minetest.env:set_node(p2, {name=name})
                    end
                end
            end
            end
            end
        end
    end
    --print("generate_ore done")
end
minetest.register_on_generated(function(minp, maxp, seed)
generate_ore("technic:mineral_diamond", "default:stone", minp, maxp, seed+21,   1/11/11/11,    4, -31000,  -450)
generate_ore("technic:mineral_uranium", "default:stone", minp, maxp, seed+22,   1/10/10/10,    3, -300,  -80)
generate_ore("technic:mineral_chromium", "default:stone", minp, maxp, seed+23,   1/10/10/10,    2, -31000,  -100)
generate_ore("technic:mineral_zinc", "default:stone", minp, maxp, seed+24,   1/9/9/9,    4, -31000,  2)
generate_ore("technic:marble", "default:stone", minp, maxp, seed+25,    1/128, 20, -100, -32)
generate_ore("technic:granite", "default:stone", minp, maxp, seed+25,    1/128, 15, -190, -90)
generate_stratus("technic:obsidian",
                {"default:stone"},
                {"default:lava_source"},{"default:air"},
                  minp, maxp, seed+4, 10, 25, 7, -450, -31000, -450)
end)
function generate_stratus(name, wherein, ceilin, ceil, minp, maxp, seed, stratus_chance, radius, radius_y, deep, height_min, height_max)
  if maxp.y < height_min or minp.y > height_max then
    return
  end
  -- it will be only generate a stratus for every 100 m of area
  local stratus_per_volume=1
  local area=45
  local y_min = math.max(minp.y, height_min)
  local y_max = math.min(maxp.y, height_max)
  local volume = ((maxp.x-minp.x+1)/area)*((y_max-y_min+1)/area)*((maxp.z-minp.z+1)/area)
  local pr = PseudoRandom(seed)
  local blocks = math.floor(stratus_per_volume*volume)
  print(" <<"..dump(name)..">>");
  if blocks == 0 then
    blocks = 1
  end
  print(" blocks: "..dump(blocks).." in vol: "..dump(volume).." ("..dump(maxp.x-minp.x+1)..","..dump(y_max-y_min+1)..","..dump(maxp.z-minp.z+1)..")")
  for i=1,blocks do
    local x = pr:next(1,stratus_chance)
    if x == 1 then
      -- TODO deep
      local y0=y_max-radius_y+1
      if y0 < y_min then
        y0=y_min
      else
        y0=pr:next(y_min, y0)
      end
      local x0 = maxp.x-radius+1
      if x0 < minp.x then
        x0 = minp.x
      else
        x0 = pr:next(minp.x, x0)
      end
      local z0 = maxp.z-radius+1
      if z0 < minp.z then
        x0 = minp.z
      else
        z0 = pr:next(minp.z, z0)
      end
      local p0 = {x=x0, y=y0, z=z0}
      local n = minetest.env:get_node(p0).name
      local i = 0
      --print(" upper node "..n)
      x = 0
      for k, v in ipairs(ceilin) do
        if n == v then
          x = 1
          break
        end
      end
      if x == 1 then
        -- search for the node to replace
        --print(" Searching nodes to replace from "..dump(y0-1).." to "..dump(y_min))
        for y1=y0-1,y_min,-1 do
          p0.y=y1
          n = minetest.env:get_node(p0).name
          x = 0
          for k, v in ipairs(wherein) do
            if n == v then
              x = 1
              break
            end
          end
          if x == 1 then
            y0=y1-deep
            if y0 < y_min then
              y0 = y_min
            end
            break
          end
        end
        local rx=pr:next(radius/2,radius)+1
        local rz=pr:next(radius/2,radius)+1
        local ry=pr:next(radius_y/2,radius_y)+1
        --print(" area of generation ("..dump(rx)..","..dump(rz)..","..dump(ry)..")")
        for x1=0,rx do
          rz = rz + 3 - pr:next(1,6)
          if rz < 1 then
            rz = 1
          end
          for z1=pr:next(1,3),rz do
            local ry0=ry+ pr:next(1,3)
            for y1=pr:next(1,3),ry0 do
              local x2 = x0+x1
              local y2 = y0+y1
              local z2 = z0+z1
              local p2 = {x=x2, y=y2, z=z2}
              n = minetest.env:get_node(p2).name
              x = 0
              for k, v in ipairs(wherein) do
                if n == v then
                  x = 1
                  break
                end
              end
              if x == 1 then
                if ceil == nil then
                  minetest.env:set_node(p2, {name=name})
                  i = i +1
                else
                  local p3 = {p2.x,p2.y+1,p2}
                  if minetest.env:get_node(p3).name == ceil then
                     minetest.env:set_node(p2, {name=name})
                     i = i +1
                  end
                end
              end
            end
          end
        end
        print(" generated "..dump(i).." blocks in ("..dump(x0)..","..dump(y0)..","..dump(z0)..")")
      end
    end
  end
  --print("generate_ore done")
end
technic/technic/project_table.lua
technic/technic/rubber.lua
technic/technic/screwdriver.lua
technic/technic/silver_chest.lua
technic/technic/solar_panel.lua
File was renamed from solar_panel.lua
@@ -54,7 +54,7 @@
        local light = minetest.env:get_node_light(pos1, nil)
        local meta = minetest.env:get_meta(pos)
        if light == nil then light = 0 end
        if light >= 14 then
        if light >= 12 then
            meta:set_string("infotext", "Solar Panel is active ")
            meta:set_float("active",1)
            local internal_EU_buffer=meta:get_float("internal_EU_buffer")
technic/technic/solar_panel_mv.lua
technic/technic/sonic_screwdriver.lua
technic/technic/sounds/chainsaw.ogg
Binary files differ
technic/technic/sounds/item_drop_pickup.1.ogg
Binary files differ
technic/technic/sounds/item_drop_pickup.2.ogg
Binary files differ
technic/technic/sounds/item_drop_pickup.3.ogg
Binary files differ
technic/technic/sounds/item_drop_pickup.4.ogg
Binary files differ
technic/technic/sounds/mining_drill.ogg
Binary files differ
technic/technic/sounds/technic_laser.ogg
Binary files differ
technic/technic/sounds/technic_sonic_screwdriver.ogg
Binary files differ
technic/technic/tetris.lua
New file
@@ -0,0 +1,17 @@
minetest.register_node("technic:tetris_machine_node1", {
    tiles = {"tetris_machine_top.png", "technic_mv_battery_box_bottom.png", "tetris_machine_front1.png",
        "tetris_machine_side1B.png", "tetris_machine_side1P.png", "tetris_machine_side1L.png"},
    tile_images = {"technic_tetris_machine.png",},
    is_ground_content = true,
    groups = {cracky=1},
    sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("technic:tetris_machine_node2", {
    tiles = {"tetris_machine_top.png", "technic_mv_battery_box_bottom.png", "tetris_machine_front2.png",
        "tetris_machine_side2B.png", "tetris_machine_side2P.png", "tetris_machine_side2L.png"},
    tile_images = {"technic_tetris_machine.png",},
    is_ground_content = true,
    groups = {cracky=1},
    sounds = default.node_sound_stone_defaults(),
})
technic/technic/textures/technic_alloy_furnace_front.png

technic/technic/textures/technic_alloy_furnace_front_active.png

technic/technic/textures/technic_alloy_furnace_side.png

technic/technic/textures/technic_alloy_furnace_top.png

technic/technic/textures/technic_battery.png

technic/technic/textures/technic_battery_box_bottom.png

technic/technic/textures/technic_battery_box_side0.png

technic/technic/textures/technic_battery_box_top.png

technic/technic/textures/technic_battery_reload.png

technic/technic/textures/technic_brass_dust.png

technic/technic/textures/technic_brass_ingot.png

technic/technic/textures/technic_bronze_dust.png

technic/technic/textures/technic_chainsaw.png

technic/technic/textures/technic_chromium_dust.png

technic/technic/textures/technic_chromium_ingot.png

technic/technic/textures/technic_chromium_lump.png

technic/technic/textures/technic_coal_alloy_furnace_bottom.png

technic/technic/textures/technic_coal_alloy_furnace_front.png

technic/technic/textures/technic_coal_alloy_furnace_front_active.png

technic/technic/textures/technic_coal_alloy_furnace_side.png

technic/technic/textures/technic_coal_alloy_furnace_top.png

technic/technic/textures/technic_coal_dust.png

technic/technic/textures/technic_concrete_block.png

technic/technic/textures/technic_constructor_back.png

technic/technic/textures/technic_constructor_front_off.png

technic/technic/textures/technic_constructor_front_on.png

technic/technic/textures/technic_constructor_mk1_bottom_off.png

technic/technic/textures/technic_constructor_mk1_bottom_on.png

technic/technic/textures/technic_constructor_mk1_side1_off.png

technic/technic/textures/technic_constructor_mk1_side1_on.png

technic/technic/textures/technic_constructor_mk1_side2_off.png

technic/technic/textures/technic_constructor_mk1_side2_on.png

technic/technic/textures/technic_constructor_mk1_top_off.png

technic/technic/textures/technic_constructor_mk1_top_on.png

technic/technic/textures/technic_constructor_mk2_bottom_off.png

technic/technic/textures/technic_constructor_mk2_bottom_on.png

technic/technic/textures/technic_constructor_mk2_side1_off.png

technic/technic/textures/technic_constructor_mk2_side1_on.png

technic/technic/textures/technic_constructor_mk2_side2_off.png

technic/technic/textures/technic_constructor_mk2_side2_on.png

technic/technic/textures/technic_constructor_mk2_top_off.png

technic/technic/textures/technic_constructor_mk2_top_on.png

technic/technic/textures/technic_constructor_mk3_bottom_off.png

technic/technic/textures/technic_constructor_mk3_bottom_on.png

technic/technic/textures/technic_constructor_mk3_side1_off.png

technic/technic/textures/technic_constructor_mk3_side1_on.png

technic/technic/textures/technic_constructor_mk3_side2_off.png

technic/technic/textures/technic_constructor_mk3_side2_on.png

technic/technic/textures/technic_constructor_mk3_top_off.png

technic/technic/textures/technic_constructor_mk3_top_on.png

technic/technic/textures/technic_copper_chest_front.png

technic/technic/textures/technic_copper_chest_locked.png

technic/technic/textures/technic_copper_chest_side.png

technic/technic/textures/technic_copper_chest_top.png

technic/technic/textures/technic_copper_coil.png

technic/technic/textures/technic_copper_dust.png

technic/technic/textures/technic_deployer_back.png

technic/technic/textures/technic_deployer_bottom.png

technic/technic/textures/technic_deployer_front_off.png

technic/technic/textures/technic_deployer_front_on.png

technic/technic/textures/technic_deployer_side.png

technic/technic/textures/technic_deployer_side1.png

technic/technic/textures/technic_deployer_side2.png

technic/technic/textures/technic_deployer_top.png

technic/technic/textures/technic_diamond.png

technic/technic/textures/technic_diamond_block.png

technic/technic/textures/technic_diamond_block_blue.png

technic/technic/textures/technic_diamond_block_green.png

technic/technic/textures/technic_diamond_block_red.png

technic/technic/textures/technic_diamond_drill_head.png

technic/technic/textures/technic_doped_silicon_wafer.png

technic/technic/textures/technic_electric_furnace_GUI.png
technic/technic/textures/technic_electric_furnace_GUI.xcf
Binary files differ
technic/technic/textures/technic_electric_furnace_bottom.png

technic/technic/textures/technic_electric_furnace_front.png

technic/technic/textures/technic_electric_furnace_front_active.png

technic/technic/textures/technic_electric_furnace_side.png

technic/technic/textures/technic_electric_furnace_top.png

technic/technic/textures/technic_fine_copper_wire.png

technic/technic/textures/technic_flashlight.png

technic/technic/textures/technic_generator_front.png

technic/technic/textures/technic_generator_front_active.png

technic/technic/textures/technic_generator_side.png

technic/technic/textures/technic_generator_top.png

technic/technic/textures/technic_geothermal_side.png

technic/technic/textures/technic_geothermal_top.png

technic/technic/textures/technic_geothermal_top_active.png

technic/technic/textures/technic_gold_chest_front.png

technic/technic/textures/technic_gold_chest_front_black.png

technic/technic/textures/technic_gold_chest_front_blue.png

technic/technic/textures/technic_gold_chest_front_brown.png

technic/technic/textures/technic_gold_chest_front_cyan.png

technic/technic/textures/technic_gold_chest_front_dark_green.png

technic/technic/textures/technic_gold_chest_front_dark_grey.png

technic/technic/textures/technic_gold_chest_front_green.png

technic/technic/textures/technic_gold_chest_front_grey.png

technic/technic/textures/technic_gold_chest_front_magenta.png

technic/technic/textures/technic_gold_chest_front_orange.png

technic/technic/textures/technic_gold_chest_front_pink.png

technic/technic/textures/technic_gold_chest_front_red.png

technic/technic/textures/technic_gold_chest_front_violet.png

technic/technic/textures/technic_gold_chest_front_white.png

technic/technic/textures/technic_gold_chest_front_yellow.png

technic/technic/textures/technic_gold_chest_locked.png

technic/technic/textures/technic_gold_chest_locked_black.png

technic/technic/textures/technic_gold_chest_locked_blue.png

technic/technic/textures/technic_gold_chest_locked_brown.png

technic/technic/textures/technic_gold_chest_locked_cyan.png

technic/technic/textures/technic_gold_chest_locked_dark_green.png

technic/technic/textures/technic_gold_chest_locked_dark_grey.png

technic/technic/textures/technic_gold_chest_locked_green.png

technic/technic/textures/technic_gold_chest_locked_grey.png

technic/technic/textures/technic_gold_chest_locked_magenta.png

technic/technic/textures/technic_gold_chest_locked_orange.png

technic/technic/textures/technic_gold_chest_locked_pink.png

technic/technic/textures/technic_gold_chest_locked_red.png

technic/technic/textures/technic_gold_chest_locked_violet.png

technic/technic/textures/technic_gold_chest_locked_white.png

technic/technic/textures/technic_gold_chest_locked_yellow.png

technic/technic/textures/technic_gold_chest_side.png

technic/technic/textures/technic_gold_chest_top.png

technic/technic/textures/technic_gold_dust.png

technic/technic/textures/technic_granite.png

technic/technic/textures/technic_grinder_front.png

technic/technic/textures/technic_grinder_side.png

technic/technic/textures/technic_grinder_top.png

technic/technic/textures/technic_iron_chest_front.png

technic/technic/textures/technic_iron_chest_locked.png

technic/technic/textures/technic_iron_chest_side.png

technic/technic/textures/technic_iron_chest_top.png

technic/technic/textures/technic_iron_dust.png

technic/technic/textures/technic_laser_beam.png

technic/technic/textures/technic_lava_can.png

technic/technic/textures/technic_light.png

technic/technic/textures/technic_lv_cable.png

technic/technic/textures/technic_lv_cable_wield.png

technic/technic/textures/technic_machine_bottom.png

technic/technic/textures/technic_marble.png

technic/technic/textures/technic_marble_bricks.png

technic/technic/textures/technic_menu_bg.png

technic/technic/textures/technic_mineral_chromium.png

technic/technic/textures/technic_mineral_diamond.png

technic/technic/textures/technic_mineral_uranium.png

technic/technic/textures/technic_mineral_zinc.png

technic/technic/textures/technic_mining_drill.png

technic/technic/textures/technic_mining_laser_mk1.png

technic/technic/textures/technic_mithril_chest_front.png

technic/technic/textures/technic_mithril_chest_locked.png

technic/technic/textures/technic_mithril_chest_side.png

technic/technic/textures/technic_mithril_chest_top.png

technic/technic/textures/technic_mithril_dust.png

technic/technic/textures/technic_motor.png

technic/technic/textures/technic_music_player_bottom.png

technic/technic/textures/technic_music_player_side.png

technic/technic/textures/technic_music_player_top.png

technic/technic/textures/technic_mv_battery_box_bottom.png

technic/technic/textures/technic_mv_battery_box_side0.png

technic/technic/textures/technic_mv_battery_box_top.png

technic/technic/textures/technic_mv_cable.png

technic/technic/textures/technic_mv_cable_wield.png

technic/technic/textures/technic_mv_solar_panel_bottom.png

technic/technic/textures/technic_mv_solar_panel_side.png

technic/technic/textures/technic_mv_solar_panel_top.png

technic/technic/textures/technic_mv_transformer.png

technic/technic/textures/technic_nodebreaker_back.png

technic/technic/textures/technic_nodebreaker_bottom.png

technic/technic/textures/technic_nodebreaker_bottom_off.png

technic/technic/textures/technic_nodebreaker_bottom_on.png

technic/technic/textures/technic_nodebreaker_front_off.png

technic/technic/textures/technic_nodebreaker_front_on.png

technic/technic/textures/technic_nodebreaker_side.png

technic/technic/textures/technic_nodebreaker_side1.png

technic/technic/textures/technic_nodebreaker_side1_off.png

technic/technic/textures/technic_nodebreaker_side1_on.png

technic/technic/textures/technic_nodebreaker_side2.png

technic/technic/textures/technic_nodebreaker_side2_off.png

technic/technic/textures/technic_nodebreaker_side2_on.png

technic/technic/textures/technic_nodebreaker_top.png

technic/technic/textures/technic_nodebreaker_top_off.png

technic/technic/textures/technic_nodebreaker_top_on.png

technic/technic/textures/technic_power_meter.png

technic/technic/textures/technic_power_meter1.png

technic/technic/textures/technic_power_meter2.png

technic/technic/textures/technic_power_meter3.png

technic/technic/textures/technic_power_meter4.png

technic/technic/textures/technic_power_meter5.png

technic/technic/textures/technic_power_meter6.png

technic/technic/textures/technic_power_meter7.png

technic/technic/textures/technic_power_meter8.png

technic/technic/textures/technic_power_meter_bg.png

technic/technic/textures/technic_power_meter_fg.png

technic/technic/textures/technic_raw_latex.png

technic/technic/textures/technic_rebar.png

technic/technic/textures/technic_rubber.png

technic/technic/textures/technic_rubber_sapling.png

technic/technic/textures/technic_rubber_tree_empty.png

technic/technic/textures/technic_rubber_tree_full.png

technic/technic/textures/technic_screwdriver.png

technic/technic/textures/technic_silicon_wafer.png

technic/technic/textures/technic_silver_chest_front.png

technic/technic/textures/technic_silver_chest_locked.png

technic/technic/textures/technic_silver_chest_side.png

technic/technic/textures/technic_silver_chest_top.png

technic/technic/textures/technic_silver_dust.png

technic/technic/textures/technic_solar_panel_bottom.png

technic/technic/textures/technic_solar_panel_side.png

technic/technic/textures/technic_solar_panel_top.png

technic/technic/textures/technic_sonic_screwdriver.png

technic/technic/textures/technic_stainless_steel_dust.png

technic/technic/textures/technic_stainless_steel_ingot.png

technic/technic/textures/technic_tin_dust.png

technic/technic/textures/technic_tree_tap.png

technic/technic/textures/technic_uranium.png

technic/technic/textures/technic_water_can.png

technic/technic/textures/technic_water_mill_side.png

technic/technic/textures/technic_water_mill_top.png

technic/technic/textures/technic_water_mill_top_active.png

technic/technic/textures/technic_workshop_bottom.png

technic/technic/textures/technic_workshop_side.png

technic/technic/textures/technic_workshop_top.png

technic/technic/textures/technic_zinc_dust.png

technic/technic/textures/technic_zinc_ingot.png

technic/technic/textures/technic_zinc_lump.png

technic/technic/textures/tetris_machine_front1.png
technic/technic/textures/tetris_machine_front2.png
technic/technic/textures/tetris_machine_side1B.png
technic/technic/textures/tetris_machine_side1L.png
technic/technic/textures/tetris_machine_side1P.png
technic/technic/textures/tetris_machine_side2B.png
technic/technic/textures/tetris_machine_side2L.png
technic/technic/textures/tetris_machine_side2P.png
technic/technic/textures/tetris_machine_top.png
technic/technic/tool_workshop.lua
technic/technic/tree_tap.lua
File was renamed from tree_tap.lua
@@ -7,7 +7,7 @@
                            local pos=minetest.get_pointed_thing_position(pointed_thing,above)
                            local node=minetest.env:get_node(pos)
                            local node_name=node.name
                            if node_name == "farming_plus:rubber_tree_full" then
                            if node_name == "farming_plus:rubber_tree_full" or node_name == "farming:rubber_tree_full" or node_name == "technic:rubber_tree_full" then
                                    user:get_inventory():add_item("main",ItemStack("technic:raw_latex"))
                                    minetest.env:set_node(pos,node)
                                    local item=itemstack:to_table()
technic/technic/water.lua
New file
@@ -0,0 +1,588 @@
minetest.register_alias("battery", "technic:battery")
minetest.register_alias("battery_box", "technic:battery_box")
minetest.register_alias("electric_furnace", "technic:electric_furnace")
minetest.register_craft({
    output = 'technic:battery 1',
    recipe = {
        {'default:wood', 'moreores:copper_ingot', 'default:wood'},
        {'default:wood', 'moreores:tin_ingot', 'default:wood'},
        {'default:wood', 'moreores:copper_ingot', 'default:wood'},
    }
})
minetest.register_craft({
    output = 'technic:battery_box 1',
    recipe = {
        {'technic:battery', 'default:wood', 'technic:battery'},
        {'technic:battery', 'moreores:copper_ingot', 'technic:battery'},
        {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:electric_furnace',
    recipe = {
        {'default:brick', 'default:brick', 'default:brick'},
        {'default:brick', '', 'default:brick'},
        {'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
    }
})
--minetest.register_craftitem("technic:battery", {
--    description = "Recharcheable battery",
--    inventory_image = "technic_battery.png",
--    stack_max = 1,
--})
minetest.register_tool("technic:battery",
{description = "RE Battery",
inventory_image = "technic_battery.png",
energy_charge = 0,
tool_capabilities = {max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_craftitem("technic:battery_box", {
    description = "Battery box",
    stack_max = 99,
})
battery_box_formspec =
    "invsize[8,9;]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
    "list[current_name;src;3,1;1,1;]"..
    "image[4,1;1,1;technic_battery_reload.png]"..
    "list[current_name;dst;5,1;1,1;]"..
    "label[0,0;Battery box]"..
    "label[3,0;Charge]"..
    "label[5,0;Discharge]"..
    "label[1,3;Power level]"..
    "list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:battery_box", {
    description = "Battery box",
    tiles = {"technic_battery_box_top.png", "technic_battery_box_bottom.png", "technic_battery_box_side.png",
        "technic_battery_box_side.png", "technic_battery_box_side.png", "technic_battery_box_side.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "Battery box")
        meta:set_float("technic_power_machine", 1)
        meta:set_string("formspec", battery_box_formspec)
        local inv = meta:get_inventory()
        inv:set_size("src", 1)
        inv:set_size("dst", 1)
        battery_charge = 0
        max_charge = 60000
        end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not inv:is_empty("dst") then
            return false
        elseif not inv:is_empty("src") then
            return false
        end
        return true
    end,
})
electric_furnace_formspec =
    "invsize[8,9;]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
    "list[current_name;src;3,1;1,1;]"..
    "list[current_name;dst;5,1;2,2;]"..
    "list[current_player;main;0,5;8,4;]"..
    "label[0,0;Electric Furnace]"..
    "label[1,3;Power level]"
minetest.register_node("technic:electric_furnace", {
    description = "Electric furnace",
    tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
        "technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front.png"},
    paramtype2 = "facedir",
    groups = {cracky=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_stone_defaults(),
    technic_power_machine=1,
    internal_EU_buffer=0;
    interal_EU_buffer_size=2000;
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_float("technic_power_machine", 1)
        meta:set_string("formspec", electric_furnace_formspec)
        meta:set_string("infotext", "Electric furnace")
        local inv = meta:get_inventory()
        inv:set_size("src", 1)
        inv:set_size("dst", 4)
        local EU_used  = 0
        local furnace_is_cookin = 0
        local cooked = nil
        meta:set_float("internal_EU_buffer",0)
        meta:set_float("internal_EU_buffer_size",2000)
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not inv:is_empty("dst") then
            return false
        elseif not inv:is_empty("src") then
            return false
        end
        return true
    end,
})
minetest.register_node("technic:electric_furnace_active", {
    description = "Electric Furnace",
    tiles = {"technic_electric_furnace_top.png", "technic_electric_furnace_bottom.png", "technic_electric_furnace_side.png",
        "technic_electric_furnace_side.png", "technic_electric_furnace_side.png", "technic_electric_furnace_front_active.png"},
    paramtype2 = "facedir",
    light_source = 8,
    drop = "technic:electric_furnace",
    groups = {cracky=2, not_in_creative_inventory=1},
    legacy_facedir_simple = true,
    sounds = default.node_sound_stone_defaults(),
    internal_EU_buffer=0;
    interal_EU_buffer_size=2000;
    technic_power_machine=1,
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_float("technic_power_machine", 1)
        meta:set_string("formspec", electric_furnace_formspec)
        meta:set_string("infotext", "Electric furnace");
        local inv = meta:get_inventory()
        inv:set_size("src", 1)
        inv:set_size("dst", 4)
        local EU_used  = 0
        local furnace_is_cookin = 0
        local cooked = nil
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not inv:is_empty("dst") then
            return false
        elseif not inv:is_empty("src") then
            return false
        end
        return true
    end,
})
minetest.register_abm({
    nodenames = {"technic:electric_furnace","technic:electric_furnace_active"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
        local meta = minetest.env:get_meta(pos)
        internal_EU_buffer=meta:get_float("internal_EU_buffer")
        internal_EU_buffer_size=meta:get_float("internal_EU_buffer")
        local load = math.floor(internal_EU_buffer/2000 * 100)
        meta:set_string("formspec",
                "invsize[8,9;]"..
                "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
                        (load)..":technic_power_meter_fg.png]"..
                "list[current_name;src;3,1;1,1;]"..
                "list[current_name;dst;5,1;2,2;]"..
                "list[current_player;main;0,5;8,4;]"..
                "label[0,0;Electric Furnace]"..
                "label[1,3;Power level]")
        local inv = meta:get_inventory()
        local furnace_is_cookin = meta:get_float("furnace_is_cookin")
        local srclist = inv:get_list("src")
        local cooked=nil
        if srclist then
         cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
        end
        if (furnace_is_cookin == 1) then
            if internal_EU_buffer>=150 then
            internal_EU_buffer=internal_EU_buffer-150;
            meta:set_float("internal_EU_buffer",internal_EU_buffer)
            meta:set_float("src_time", meta:get_float("src_time") + 3)
            if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
                -- check if there's room for output in "dst" list
                if inv:room_for_item("dst",cooked.item) then
                    -- Put result in "dst" list
                    inv:add_item("dst", cooked.item)
                    -- take stuff from "src" list
                    srcstack = inv:get_stack("src", 1)
                    srcstack:take_item()
                    inv:set_stack("src", 1, srcstack)
                else
                    print("Furnace inventory full!")
                end
                meta:set_string("src_time", 0)
            end
            end
        end
        if srclist then
            cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
            if cooked.time>0 then
            hacky_swap_node(pos,"technic:electric_furnace_active")
            meta:set_string("infotext","Furnace active")
            meta:set_string("furnace_is_cookin",1)
        --    meta:set_string("formspec", electric_furnace_formspec)
            meta:set_string("src_time", 0)
            return
            end
        end
                hacky_swap_node(pos,"technic:electric_furnace")
                meta:set_string("infotext","Furnace inactive")
                meta:set_string("furnace_is_cookin",0)
        --        meta:set_string("formspec", electric_furnace_formspec)
                meta:set_string("src_time", 0)
end,
})
function take_EU_from_net(pos, EU_to_take)
    local meta = minetest.env:get_meta(pos)
    local pos1=pos
    pos1.z=pos1.z +1
    local meta1 = minetest.env:get_meta(pos1)
    charge=meta1:get_float("battery_charge")
    charge=charge - EU_to_take
    meta1:set_float("battery_charge",charge)
end
    LV_nodes_visited = {}
function get_RE_item_load (load1,max_load)
if load1==0 then load1=65535 end
local temp = 65536-load1
temp= temp/65535*max_load
return math.floor(temp + 0.5)
end
function set_RE_item_load (load1,max_load)
if load1 == 0 then return 65535 end
local temp=load1/max_load*65535
temp=65536-temp
return math.floor(temp)
end
minetest.register_abm({
    nodenames = {"technic:battery_box"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
    local meta = minetest.env:get_meta(pos)
    charge= meta:get_float("battery_charge")
    max_charge= 60000
        local inv = meta:get_inventory()
        if inv:is_empty("src")==false  then
        srcstack = inv:get_stack("src", 1)
        src_item=srcstack:to_table()
        if src_item["name"]== "technic:battery" then
        local load1=tonumber((src_item["wear"]))
        load1=get_RE_item_load(load1,10000)
        load_step=1000
        if load1<10000 and charge>0 then
         if charge-load_step<0 then load_step=charge end
         if load1+load_step>10000 then load_step=10000-load1 end
        load1=load1+load_step
        charge=charge-load_step
        load1=set_RE_item_load(load1,10000)
        src_item["wear"]=tostring(load1)
        inv:set_stack("src", 1, src_item)
        end
        end
        end
        meta:set_float("battery_charge",charge)
        if inv:is_empty("src")==false  then
        srcstack = inv:get_stack("src", 1)
        src_item=srcstack:to_table()
        if src_item["name"]== "technic:laser_mk1" then
        local load1=tonumber((src_item["wear"]))
        load1=get_RE_item_load(load1,40000)
        load_step=1000
        if load1<40000 and charge>0 then
         if charge-load_step<0 then load_step=charge end
         if load1+load_step>40000 then load_step=40000-load1 end
        load1=load1+load_step
        charge=charge-load_step
        load1=set_RE_item_load(load1,40000)
        src_item["wear"]=tostring(load1)
        inv:set_stack("src", 1, src_item)
        end
        end
        end
        meta:set_float("battery_charge",charge)
        if inv:is_empty("dst") == false then
        srcstack = inv:get_stack("dst", 1)
        src_item=srcstack:to_table()
        if src_item["name"]== "technic:battery" then
        local load1=tonumber((src_item["wear"]))
        load1=get_RE_item_load(load1,10000)
        load_step=1000
        if load1>0 and charge<max_charge then
             if charge+load_step>max_charge then load_step=max_charge-charge end
               if load1-load_step<0 then load_step=load1 end
        load1=load1-load_step
        charge=charge+load_step
        load1=set_RE_item_load(load1,10000)
        src_item["wear"]=tostring(load1)
        inv:set_stack("dst", 1, src_item)
        end
        end
        end
    meta:set_float("battery_charge",charge)
    meta:set_string("infotext", "Battery box: "..charge.."/"..max_charge);
    local load = math.floor(charge/60000 * 100)
    meta:set_string("formspec",
                "invsize[8,9;]"..
                "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
                        (load)..":technic_power_meter_fg.png]"..
                "list[current_name;src;3,1;1,1;]"..
                "image[4,1;1,1;technic_battery_reload.png]"..
                "list[current_name;dst;5,1;1,1;]"..
                "label[0,0;Battery box]"..
                "label[3,0;Charge]"..
                "label[5,0;Discharge]"..
                "label[1,3;Power level]"..
                "list[current_player;main;0,5;8,4;]")
    local pos1={}
    pos1.y=pos.y-1
    pos1.x=pos.x
    pos1.z=pos.z
    meta1 = minetest.env:get_meta(pos1)
    if meta1:get_float("cablelike")~=1 then return end
        local LV_nodes = {}
        local PR_nodes = {}
        local RE_nodes = {}
         LV_nodes[1]={}
         LV_nodes[1].x=pos1.x
        LV_nodes[1].y=pos1.y
        LV_nodes[1].z=pos1.z
        LV_nodes[1].visited=false
table_index=1
    repeat
    check_LV_node (PR_nodes,RE_nodes,LV_nodes,table_index)
    table_index=table_index+1
    if LV_nodes[table_index]==nil then break end
    until false
local pos1={}
i=1
    repeat
    if PR_nodes[i]==nil then break end
        pos1.x=PR_nodes[i].x
        pos1.y=PR_nodes[i].y
        pos1.z=PR_nodes[i].z
    local meta1 = minetest.env:get_meta(pos1)
    local active=meta1:get_float("active")
    if active==1 then charge=charge+80 end
    i=i+1
    until false
if charge>max_charge then charge=max_charge end
i=1
    repeat
    if RE_nodes[i]==nil then break end
        pos1.x=RE_nodes[i].x         -- loading all conected machines buffers
        pos1.y=RE_nodes[i].y
        pos1.z=RE_nodes[i].z
    local meta1 = minetest.env:get_meta(pos1)
    local internal_EU_buffer=meta1:get_float("internal_EU_buffer")
    local internal_EU_buffer_size=meta1:get_float("internal_EU_buffer_size")
    local charge_to_give=200
    if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
        charge_to_give=internal_EU_buffer_size-internal_EU_buffer
    end
    if charge-charge_to_give<0 then charge_to_give=charge end
    internal_EU_buffer=internal_EU_buffer+charge_to_give
    meta1:set_float("internal_EU_buffer",internal_EU_buffer)
    charge=charge-charge_to_give;
    i=i+1
    until false
    meta:set_float("battery_charge",charge)
    meta:set_string("infotext", "Battery box: "..charge.."/"..max_charge);
end
})
function add_new_cable_node (LV_nodes,pos1)
local i=1
    repeat
        if LV_nodes[i]==nil then break end
        if pos1.x==LV_nodes[i].x and pos1.y==LV_nodes[i].y and pos1.z==LV_nodes[i].z then return false end
        i=i+1
    until false
LV_nodes[i]={}
LV_nodes[i].x=pos1.x
LV_nodes[i].y=pos1.y
LV_nodes[i].z=pos1.z
LV_nodes[i].visited=false
return true
end
function check_LV_node (PR_nodes,RE_nodes,LV_nodes,i)
        local pos1={}
        pos1.x=LV_nodes[i].x
        pos1.y=LV_nodes[i].y
        pos1.z=LV_nodes[i].z
        LV_nodes[i].visited=true
        new_node_added=false
        pos1.x=pos1.x+1
        check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
        pos1.x=pos1.x-2
        check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
        pos1.x=pos1.x+1
        pos1.y=pos1.y+1
        check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
        pos1.y=pos1.y-2
        check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
        pos1.y=pos1.y+1
        pos1.z=pos1.z+1
        check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
        pos1.z=pos1.z-2
        check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
        pos1.z=pos1.z+1
return new_node_added
end
function check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1)
meta = minetest.env:get_meta(pos1)
if meta:get_float("cablelike")==1 then new_node_added=add_new_cable_node(LV_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:solar_panel" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:electric_furnace" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:electric_furnace_active" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:tool_workshop" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:music_player" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:grinder" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end
end
function get_connected_charge (charge,pos1)
    local charge1=0
    local meta={}
    if minetest.env:get_node(pos1).name == "technic:battery_box" then
    print ("found batbox")
    meta = minetest.env:get_meta(pos1)
    return meta:get_float("cable_OUT")
    end
    if minetest.env:get_node(pos1).name == "technic:lv_cable" then
    meta = minetest.env:get_meta(pos1)
    charge1=meta:get_float("cable_OUT")
        if charge1>charge then
        charge=charge1
        end
    end
return charge
end
minetest.register_node("technic:solar_panel", {
    tiles = {"technic_solar_panel_top.png", "technic_solar_panel_side.png", "technic_solar_panel_side.png",
        "technic_solar_panel_side.png", "technic_solar_panel_side.png", "technic_solar_panel_side.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
        description="Solar Panel",
    active = false,
    technic_power_machine=1,
    drawtype = "nodebox",
    paramtype = "light",
    is_ground_content = true,
    node_box = {
            type = "fixed",
            fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
        },
        selection_box = {
            type = "fixed",
            fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
        },
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_float("technic_power_machine", 1)
        meta:set_string("infotext", "Solar Panel")
        meta:set_float("active", false)
    end,
})
minetest.register_craft({
    output = 'technic:solar_panel 1',
    recipe = {
        {'default:sand', 'default:sand','default:sand'},
        {'default:sand', 'moreores:copper_ingot','default:sand'},
        {'default:sand', 'default:sand','default:sand'},
    }
})
minetest.register_abm(
    {nodenames = {"technic:solar_panel"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
        local pos1={}
        pos1.y=pos.y+1
        pos1.x=pos.x
        pos1.z=pos.z
        local light = minetest.env:get_node_light(pos1, nil)
        local meta = minetest.env:get_meta(pos)
        if light == nil then light = 0 end
        if light >= 12 then
            meta:set_string("infotext", "Solar Panel is active ")
            meta:set_float("active",1)
        else
            meta:set_string("infotext", "Solar Panel is inactive");
            meta:set_float("active",0)
        end
    end,
})
technic/technic/water_mill.lua
technic/technic/wires.lua
technic/technic/wires_mv.lua