RealBadAngel
2013-01-27 82cba919fa8c6872718cf3f47520299f40ea700b
cleanup phase2
502 files added
8340 ■■■■■ changed files
modpack.txt 1 ●●●● patch | view | raw | blame | history
technic/alloy_furnace.lua 434 ●●●●● patch | view | raw | blame | history
technic/battery_box.lua 398 ●●●●● patch | view | raw | blame | history
technic/battery_box_mv.lua 321 ●●●●● patch | view | raw | blame | history
technic/cans.lua 162 ●●●●● patch | view | raw | blame | history
technic/chainsaw.lua 59 ●●●●● patch | view | raw | blame | history
technic/chest_commons.lua 78 ●●●●● patch | view | raw | blame | history
technic/concrete.lua 83 ●●●●● patch | view | raw | blame | history
technic/config.lua 10 ●●●●● patch | view | raw | blame | history
technic/constructor.lua 298 ●●●●● patch | view | raw | blame | history
technic/copper_chest.lua 95 ●●●●● patch | view | raw | blame | history
technic/creative.lua 21 ●●●●● patch | view | raw | blame | history
technic/depends.txt 4 ●●●● patch | view | raw | blame | history
technic/deployer.lua 91 ●●●●● patch | view | raw | blame | history
technic/electric.lua 268 ●●●●● patch | view | raw | blame | history
technic/electric_furnace.lua 177 ●●●●● patch | view | raw | blame | history
technic/flashlight.lua 169 ●●●●● patch | view | raw | blame | history
technic/flashlight_old.lua 176 ●●●●● patch | view | raw | blame | history
technic/generator.lua 148 ●●●●● patch | view | raw | blame | history
technic/geothermal.lua 135 ●●●●● patch | view | raw | blame | history
technic/gold_chest.lua 466 ●●●●● patch | view | raw | blame | history
technic/grinder.lua 326 ●●●●● patch | view | raw | blame | history
technic/grinder_gloopores.lua 55 ●●●●● patch | view | raw | blame | history
technic/init.lua 82 ●●●●● patch | view | raw | blame | history
technic/injector.lua 325 ●●●●● patch | view | raw | blame | history
technic/injector1.lua 248 ●●●●● patch | view | raw | blame | history
technic/iron_chest.lua 97 ●●●●● patch | view | raw | blame | history
technic/item_drop.lua 100 ●●●●● patch | view | raw | blame | history
technic/item_pickup.lua 63 ●●●●● patch | view | raw | blame | history
technic/items.lua 157 ●●●●● patch | view | raw | blame | history
technic/mining_drill.lua 49 ●●●●● patch | view | raw | blame | history
technic/mining_laser_mk1.lua 174 ●●●●● patch | view | raw | blame | history
technic/mithril_chest.lua 145 ●●●●● patch | view | raw | blame | history
technic/mithril_subspace_chest.lua 145 ●●●●● patch | view | raw | blame | history
technic/music_player.lua 126 ●●●●● patch | view | raw | blame | history
technic/node_breaker.lua 89 ●●●●● patch | view | raw | blame | history
technic/ores.lua 339 ●●●●● patch | view | raw | blame | history
technic/project_table.lua 39 ●●●●● patch | view | raw | blame | history
technic/rubber.lua 121 ●●●●● patch | view | raw | blame | history
technic/screwdriver.lua 47 ●●●●● patch | view | raw | blame | history
technic/silver_chest.lua 131 ●●●●● patch | view | raw | blame | history
technic/solar_panel.lua 76 ●●●●● patch | view | raw | blame | history
technic/solar_panel_mv.lua 76 ●●●●● patch | view | raw | blame | history
technic/sonic_screwdriver.lua 55 ●●●●● patch | view | raw | blame | history
technic/tetris.lua 17 ●●●●● patch | view | raw | blame | history
technic/textures/power_meter.png patch | view | raw | blame | history
technic/textures/technic_alloy_furnace_front.png patch | view | raw | blame | history
technic/textures/technic_alloy_furnace_front_active.png patch | view | raw | blame | history
technic/textures/technic_alloy_furnace_side.png patch | view | raw | blame | history
technic/textures/technic_alloy_furnace_top.png patch | view | raw | blame | history
technic/textures/technic_battery.png patch | view | raw | blame | history
technic/textures/technic_battery_box_bottom.png patch | view | raw | blame | history
technic/textures/technic_battery_box_side.png patch | view | raw | blame | history
technic/textures/technic_battery_box_side0.png patch | view | raw | blame | history
technic/textures/technic_battery_box_side8.png patch | view | raw | blame | history
technic/textures/technic_battery_box_side_mv.png patch | view | raw | blame | history
technic/textures/technic_battery_box_top.png patch | view | raw | blame | history
technic/textures/technic_battery_meter_fg.png patch | view | raw | blame | history
technic/textures/technic_battery_reload.png patch | view | raw | blame | history
technic/textures/technic_brass_dust.png patch | view | raw | blame | history
technic/textures/technic_brass_ingot.png patch | view | raw | blame | history
technic/textures/technic_bronze_dust.png patch | view | raw | blame | history
technic/textures/technic_chainsaw.png patch | view | raw | blame | history
technic/textures/technic_chromium_dust.png patch | view | raw | blame | history
technic/textures/technic_chromium_ingot.png patch | view | raw | blame | history
technic/textures/technic_chromium_lump.png patch | view | raw | blame | history
technic/textures/technic_coal_alloy_furnace_bottom.png patch | view | raw | blame | history
technic/textures/technic_coal_alloy_furnace_front.png patch | view | raw | blame | history
technic/textures/technic_coal_alloy_furnace_front_active.png patch | view | raw | blame | history
technic/textures/technic_coal_alloy_furnace_side.png patch | view | raw | blame | history
technic/textures/technic_coal_alloy_furnace_top.png patch | view | raw | blame | history
technic/textures/technic_coal_dust.png patch | view | raw | blame | history
technic/textures/technic_concrete_block.png patch | view | raw | blame | history
technic/textures/technic_constructor_back.png patch | view | raw | blame | history
technic/textures/technic_constructor_front_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_front_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk1_bottom_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk1_bottom_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk1_side1_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk1_side1_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk1_side2_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk1_side2_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk1_top_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk1_top_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk2_bottom_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk2_bottom_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk2_side1_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk2_side1_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk2_side2_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk2_side2_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk2_top_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk2_top_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk3_bottom_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk3_bottom_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk3_side1_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk3_side1_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk3_side2_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk3_side2_on.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk3_top_off.png patch | view | raw | blame | history
technic/textures/technic_constructor_mk3_top_on.png patch | view | raw | blame | history
technic/textures/technic_copper_chest_front.png patch | view | raw | blame | history
technic/textures/technic_copper_chest_locked.png patch | view | raw | blame | history
technic/textures/technic_copper_chest_side.png patch | view | raw | blame | history
technic/textures/technic_copper_chest_top.png patch | view | raw | blame | history
technic/textures/technic_copper_coil.png patch | view | raw | blame | history
technic/textures/technic_copper_dust.png patch | view | raw | blame | history
technic/textures/technic_deployer_back.png patch | view | raw | blame | history
technic/textures/technic_deployer_bottom.png patch | view | raw | blame | history
technic/textures/technic_deployer_front_off.png patch | view | raw | blame | history
technic/textures/technic_deployer_front_on.png patch | view | raw | blame | history
technic/textures/technic_deployer_side.png patch | view | raw | blame | history
technic/textures/technic_deployer_side1.png patch | view | raw | blame | history
technic/textures/technic_deployer_side2.png patch | view | raw | blame | history
technic/textures/technic_deployer_top.png patch | view | raw | blame | history
technic/textures/technic_diamond.png patch | view | raw | blame | history
technic/textures/technic_diamond_block.png patch | view | raw | blame | history
technic/textures/technic_diamond_block_blue.png patch | view | raw | blame | history
technic/textures/technic_diamond_block_green.png patch | view | raw | blame | history
technic/textures/technic_diamond_block_red.png patch | view | raw | blame | history
technic/textures/technic_diamond_drill_head.png patch | view | raw | blame | history
technic/textures/technic_doped_silicon_wafer.png patch | view | raw | blame | history
technic/textures/technic_electric_furnace_bottom.png patch | view | raw | blame | history
technic/textures/technic_electric_furnace_front.png patch | view | raw | blame | history
technic/textures/technic_electric_furnace_front_active.png patch | view | raw | blame | history
technic/textures/technic_electric_furnace_side.png patch | view | raw | blame | history
technic/textures/technic_electric_furnace_top.png patch | view | raw | blame | history
technic/textures/technic_fine_copper_wire.png patch | view | raw | blame | history
technic/textures/technic_flashlight.png patch | view | raw | blame | history
technic/textures/technic_generator_front.png patch | view | raw | blame | history
technic/textures/technic_generator_front_active.png patch | view | raw | blame | history
technic/textures/technic_generator_side.png patch | view | raw | blame | history
technic/textures/technic_generator_top.png patch | view | raw | blame | history
technic/textures/technic_geothermal_side.png patch | view | raw | blame | history
technic/textures/technic_geothermal_top.png patch | view | raw | blame | history
technic/textures/technic_geothermal_top_active.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_black.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_blue.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_brown.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_cyan.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_dark_green.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_dark_grey.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_green.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_grey.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_magenta.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_orange.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_pink.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_red.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_violet.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_white.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_front_yellow.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_black.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_blue.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_brown.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_cyan.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_dark_green.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_dark_grey.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_green.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_grey.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_magenta.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_orange.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_pink.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_red.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_violet.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_white.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_locked_yellow.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_side.png patch | view | raw | blame | history
technic/textures/technic_gold_chest_top.png patch | view | raw | blame | history
technic/textures/technic_gold_dust.png patch | view | raw | blame | history
technic/textures/technic_granite.png patch | view | raw | blame | history
technic/textures/technic_grinder_front.png patch | view | raw | blame | history
technic/textures/technic_grinder_side.png patch | view | raw | blame | history
technic/textures/technic_grinder_top.png patch | view | raw | blame | history
technic/textures/technic_iron_chest_front.png patch | view | raw | blame | history
technic/textures/technic_iron_chest_locked.png patch | view | raw | blame | history
technic/textures/technic_iron_chest_side.png patch | view | raw | blame | history
technic/textures/technic_iron_chest_top.png patch | view | raw | blame | history
technic/textures/technic_iron_dust.png patch | view | raw | blame | history
technic/textures/technic_laser_beam.png patch | view | raw | blame | history
technic/textures/technic_lava_can.png patch | view | raw | blame | history
technic/textures/technic_light.png patch | view | raw | blame | history
technic/textures/technic_lv_cable.png patch | view | raw | blame | history
technic/textures/technic_lv_cable_wield.png patch | view | raw | blame | history
technic/textures/technic_machine_bottom.png patch | view | raw | blame | history
technic/textures/technic_marble.png patch | view | raw | blame | history
technic/textures/technic_marble_bricks.png patch | view | raw | blame | history
technic/textures/technic_mineral_chromium.png patch | view | raw | blame | history
technic/textures/technic_mineral_diamond.png patch | view | raw | blame | history
technic/textures/technic_mineral_uranium.png patch | view | raw | blame | history
technic/textures/technic_mineral_zinc.png patch | view | raw | blame | history
technic/textures/technic_mining_drill.png patch | view | raw | blame | history
technic/textures/technic_mining_laser_mk1.png patch | view | raw | blame | history
technic/textures/technic_mithril_chest_front.png patch | view | raw | blame | history
technic/textures/technic_mithril_chest_locked.png patch | view | raw | blame | history
technic/textures/technic_mithril_chest_side.png patch | view | raw | blame | history
technic/textures/technic_mithril_chest_top.png patch | view | raw | blame | history
technic/textures/technic_mithril_dust.png patch | view | raw | blame | history
technic/textures/technic_motor.png patch | view | raw | blame | history
technic/textures/technic_music_player_bottom.png patch | view | raw | blame | history
technic/textures/technic_music_player_side.png patch | view | raw | blame | history
technic/textures/technic_music_player_top.png patch | view | raw | blame | history
technic/textures/technic_mv_battery_box_bottom.png patch | view | raw | blame | history
technic/textures/technic_mv_battery_box_side0.png patch | view | raw | blame | history
technic/textures/technic_mv_battery_box_top.png patch | view | raw | blame | history
technic/textures/technic_mv_cable.png patch | view | raw | blame | history
technic/textures/technic_mv_cable_wield.png patch | view | raw | blame | history
technic/textures/technic_mv_solar_panel_bottom.png patch | view | raw | blame | history
technic/textures/technic_mv_solar_panel_side.png patch | view | raw | blame | history
technic/textures/technic_mv_solar_panel_top.png patch | view | raw | blame | history
technic/textures/technic_mv_solarpanel_bottom.png patch | view | raw | blame | history
technic/textures/technic_mv_solarpanel_side.png patch | view | raw | blame | history
technic/textures/technic_mv_solarpanel_top.png patch | view | raw | blame | history
technic/textures/technic_mv_transformer.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_back.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_bottom.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_bottom_off.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_bottom_on.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_front_off.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_front_on.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_side.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_side1.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_side1_off.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_side1_on.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_side2.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_side2_off.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_side2_on.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_top.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_top_off.png patch | view | raw | blame | history
technic/textures/technic_nodebreaker_top_on.png patch | view | raw | blame | history
technic/textures/technic_obsidian.png patch | view | raw | blame | history
technic/textures/technic_power_meter.png patch | view | raw | blame | history
technic/textures/technic_power_meter1.png patch | view | raw | blame | history
technic/textures/technic_power_meter2.png patch | view | raw | blame | history
technic/textures/technic_power_meter3.png patch | view | raw | blame | history
technic/textures/technic_power_meter4.png patch | view | raw | blame | history
technic/textures/technic_power_meter5.png patch | view | raw | blame | history
technic/textures/technic_power_meter6.png patch | view | raw | blame | history
technic/textures/technic_power_meter7.png patch | view | raw | blame | history
technic/textures/technic_power_meter8.png patch | view | raw | blame | history
technic/textures/technic_power_meter_bg.png patch | view | raw | blame | history
technic/textures/technic_power_meter_fg.png patch | view | raw | blame | history
technic/textures/technic_raw_latex.png patch | view | raw | blame | history
technic/textures/technic_rebar.png patch | view | raw | blame | history
technic/textures/technic_rubber.png patch | view | raw | blame | history
technic/textures/technic_rubber_leaves.png patch | view | raw | blame | history
technic/textures/technic_rubber_sapling.png patch | view | raw | blame | history
technic/textures/technic_rubber_tree_empty.png patch | view | raw | blame | history
technic/textures/technic_rubber_tree_full.png patch | view | raw | blame | history
technic/textures/technic_screwdriver.png patch | view | raw | blame | history
technic/textures/technic_silicon_wafer.png patch | view | raw | blame | history
technic/textures/technic_silver_chest_front.png patch | view | raw | blame | history
technic/textures/technic_silver_chest_locked.png patch | view | raw | blame | history
technic/textures/technic_silver_chest_side.png patch | view | raw | blame | history
technic/textures/technic_silver_chest_top.png patch | view | raw | blame | history
technic/textures/technic_silver_dust.png patch | view | raw | blame | history
technic/textures/technic_solar_panel_bottom.png patch | view | raw | blame | history
technic/textures/technic_solar_panel_side.png patch | view | raw | blame | history
technic/textures/technic_solar_panel_top.png patch | view | raw | blame | history
technic/textures/technic_sonic_screwdriver.png patch | view | raw | blame | history
technic/textures/technic_stainless_steel_dust.png patch | view | raw | blame | history
technic/textures/technic_stainless_steel_ingot.png patch | view | raw | blame | history
technic/textures/technic_tin_dust.png patch | view | raw | blame | history
technic/textures/technic_tree_tap.png patch | view | raw | blame | history
technic/textures/technic_uranium.png patch | view | raw | blame | history
technic/textures/technic_water_can.png patch | view | raw | blame | history
technic/textures/technic_water_mill_side.png patch | view | raw | blame | history
technic/textures/technic_water_mill_top.png patch | view | raw | blame | history
technic/textures/technic_water_mill_top_active.png patch | view | raw | blame | history
technic/textures/technic_workshop_bottom.png patch | view | raw | blame | history
technic/textures/technic_workshop_side.png patch | view | raw | blame | history
technic/textures/technic_workshop_top.png patch | view | raw | blame | history
technic/textures/technic_zinc_dust.png patch | view | raw | blame | history
technic/textures/technic_zinc_ingot.png patch | view | raw | blame | history
technic/textures/technic_zinc_lump.png patch | view | raw | blame | history
technic/textures/technicx32/technic_alloy_furnace_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_alloy_furnace_front_active.png patch | view | raw | blame | history
technic/textures/technicx32/technic_alloy_furnace_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_alloy_furnace_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_battery.png patch | view | raw | blame | history
technic/textures/technicx32/technic_battery_box_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_battery_box_side0.png patch | view | raw | blame | history
technic/textures/technicx32/technic_battery_box_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_battery_reload.png patch | view | raw | blame | history
technic/textures/technicx32/technic_brass_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_brass_ingot.png patch | view | raw | blame | history
technic/textures/technicx32/technic_bronze_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_chainsaw.png patch | view | raw | blame | history
technic/textures/technicx32/technic_chromium_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_chromium_ingot.png patch | view | raw | blame | history
technic/textures/technicx32/technic_chromium_lump.png patch | view | raw | blame | history
technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_coal_alloy_furnace_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png patch | view | raw | blame | history
technic/textures/technicx32/technic_coal_alloy_furnace_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_coal_alloy_furnace_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_coal_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_concrete_block.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_back.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_front_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_front_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk1_bottom_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk1_bottom_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk1_side1_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk1_side1_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk1_side2_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk1_side2_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk1_top_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk1_top_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk2_bottom_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk2_bottom_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk2_side1_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk2_side1_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk2_side2_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk2_side2_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk2_top_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk2_top_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk3_bottom_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk3_bottom_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk3_side1_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk3_side1_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk3_side2_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk3_side2_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk3_top_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_constructor_mk3_top_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_copper_chest_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_copper_chest_locked.png patch | view | raw | blame | history
technic/textures/technicx32/technic_copper_chest_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_copper_chest_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_copper_coil.png patch | view | raw | blame | history
technic/textures/technicx32/technic_copper_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_deployer_back.png patch | view | raw | blame | history
technic/textures/technicx32/technic_deployer_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_deployer_front_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_deployer_front_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_deployer_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_deployer_side1.png patch | view | raw | blame | history
technic/textures/technicx32/technic_deployer_side2.png patch | view | raw | blame | history
technic/textures/technicx32/technic_deployer_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_diamond.png patch | view | raw | blame | history
technic/textures/technicx32/technic_diamond_block.png patch | view | raw | blame | history
technic/textures/technicx32/technic_diamond_block_blue.png patch | view | raw | blame | history
technic/textures/technicx32/technic_diamond_block_green.png patch | view | raw | blame | history
technic/textures/technicx32/technic_diamond_block_red.png patch | view | raw | blame | history
technic/textures/technicx32/technic_diamond_drill_head.png patch | view | raw | blame | history
technic/textures/technicx32/technic_doped_silicon_wafer.png patch | view | raw | blame | history
technic/textures/technicx32/technic_electric_furnace_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_electric_furnace_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_electric_furnace_front_active.png patch | view | raw | blame | history
technic/textures/technicx32/technic_electric_furnace_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_electric_furnace_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_fine_copper_wire.png patch | view | raw | blame | history
technic/textures/technicx32/technic_flashlight.png patch | view | raw | blame | history
technic/textures/technicx32/technic_generator_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_generator_front_active.png patch | view | raw | blame | history
technic/textures/technicx32/technic_generator_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_generator_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_geothermal_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_geothermal_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_geothermal_top_active.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_black.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_blue.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_brown.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_cyan.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_dark_green.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_dark_grey.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_green.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_grey.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_magenta.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_orange.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_pink.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_red.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_violet.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_white.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_front_yellow.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_black.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_blue.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_brown.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_cyan.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_dark_green.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_dark_grey.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_green.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_grey.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_magenta.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_orange.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_pink.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_red.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_violet.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_white.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_locked_yellow.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_chest_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_gold_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_granite.png patch | view | raw | blame | history
technic/textures/technicx32/technic_grinder_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_grinder_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_grinder_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_iron_chest_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_iron_chest_locked.png patch | view | raw | blame | history
technic/textures/technicx32/technic_iron_chest_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_iron_chest_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_iron_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_laser_beam.png patch | view | raw | blame | history
technic/textures/technicx32/technic_lava_can.png patch | view | raw | blame | history
technic/textures/technicx32/technic_light.png patch | view | raw | blame | history
technic/textures/technicx32/technic_lv_cable.png patch | view | raw | blame | history
technic/textures/technicx32/technic_lv_cable_wield.png patch | view | raw | blame | history
technic/textures/technicx32/technic_machine_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_marble.png patch | view | raw | blame | history
technic/textures/technicx32/technic_marble_bricks.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mineral_chromium.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mineral_diamond.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mineral_uranium.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mineral_zinc.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mining_drill.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mining_laser_mk1.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mithril_chest_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mithril_chest_locked.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mithril_chest_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mithril_chest_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mithril_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_motor.png patch | view | raw | blame | history
technic/textures/technicx32/technic_music_player_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_music_player_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_music_player_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_battery_box_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_battery_box_side0.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_battery_box_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_cable.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_cable_wield.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_solar_panel_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_solar_panel_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_solar_panel_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_mv_transformer.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_back.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_bottom_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_bottom_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_front_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_front_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_side1.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_side1_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_side1_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_side2.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_side2_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_side2_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_top_off.png patch | view | raw | blame | history
technic/textures/technicx32/technic_nodebreaker_top_on.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter1.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter2.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter3.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter4.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter5.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter6.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter7.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter8.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter_bg.png patch | view | raw | blame | history
technic/textures/technicx32/technic_power_meter_fg.png patch | view | raw | blame | history
technic/textures/technicx32/technic_raw_latex.png patch | view | raw | blame | history
technic/textures/technicx32/technic_rebar.png patch | view | raw | blame | history
technic/textures/technicx32/technic_rubber.png patch | view | raw | blame | history
technic/textures/technicx32/technic_rubber_sapling.png patch | view | raw | blame | history
technic/textures/technicx32/technic_rubber_tree_empty.png patch | view | raw | blame | history
technic/textures/technicx32/technic_rubber_tree_full.png patch | view | raw | blame | history
technic/textures/technicx32/technic_screwdriver.png patch | view | raw | blame | history
technic/textures/technicx32/technic_silicon_wafer.png patch | view | raw | blame | history
technic/textures/technicx32/technic_silver_chest_front.png patch | view | raw | blame | history
technic/textures/technicx32/technic_silver_chest_locked.png patch | view | raw | blame | history
technic/textures/technicx32/technic_silver_chest_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_silver_chest_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_silver_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_solar_panel_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_solar_panel_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_solar_panel_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_sonic_screwdriver.png patch | view | raw | blame | history
technic/textures/technicx32/technic_stainless_steel_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_stainless_steel_ingot.png patch | view | raw | blame | history
technic/textures/technicx32/technic_tin_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_tree_tap.png patch | view | raw | blame | history
technic/textures/technicx32/technic_uranium.png patch | view | raw | blame | history
technic/textures/technicx32/technic_water_can.png patch | view | raw | blame | history
technic/textures/technicx32/technic_water_mill_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_water_mill_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_water_mill_top_active.png patch | view | raw | blame | history
technic/textures/technicx32/technic_workshop_bottom.png patch | view | raw | blame | history
technic/textures/technicx32/technic_workshop_side.png patch | view | raw | blame | history
technic/textures/technicx32/technic_workshop_top.png patch | view | raw | blame | history
technic/textures/technicx32/technic_zinc_dust.png patch | view | raw | blame | history
technic/textures/technicx32/technic_zinc_ingot.png patch | view | raw | blame | history
technic/textures/technicx32/technic_zinc_lump.png patch | view | raw | blame | history
technic/textures/textures_here.txt 1 ●●●● patch | view | raw | blame | history
technic/tool_workshop.lua 97 ●●●●● patch | view | raw | blame | history
technic/tree_tap.lua 49 ●●●●● patch | view | raw | blame | history
technic/water.lua 588 ●●●●● patch | view | raw | blame | history
technic/water_mill.lua 128 ●●●●● patch | view | raw | blame | history
technic/wires.lua 401 ●●●●● patch | view | raw | blame | history
technic/wires_mv.lua 400 ●●●●● patch | view | raw | blame | history
modpack.txt
New file
@@ -0,0 +1 @@
technic/alloy_furnace.lua
New file
@@ -0,0 +1,434 @@
alloy_recipes ={}
registered_recipes_count=1
function register_alloy_recipe (string1,count1, string2,count2, string3,count3)
alloy_recipes[registered_recipes_count]={}
alloy_recipes[registered_recipes_count].src1_name=string1
alloy_recipes[registered_recipes_count].src1_count=count1
alloy_recipes[registered_recipes_count].src2_name=string2
alloy_recipes[registered_recipes_count].src2_count=count2
alloy_recipes[registered_recipes_count].dst_name=string3
alloy_recipes[registered_recipes_count].dst_count=count3
registered_recipes_count=registered_recipes_count+1
alloy_recipes[registered_recipes_count]={}
alloy_recipes[registered_recipes_count].src1_name=string2
alloy_recipes[registered_recipes_count].src1_count=count2
alloy_recipes[registered_recipes_count].src2_name=string1
alloy_recipes[registered_recipes_count].src2_count=count1
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)
register_alloy_recipe ("moreores:copper_ingot",3, "moreores:tin_ingot",1, "moreores:bronze_ingot",4)
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 ("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)
minetest.register_craft({
    output = 'technic:alloy_furnace',
    recipe = {
        {'default:brick', 'default:brick', 'default:brick'},
        {'default:brick', '', 'default:brick'},
        {'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
    }
})
alloy_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;src2;3,2;1,1;]"..
    "list[current_name;dst;5,1;2,2;]"..
    "list[current_player;main;0,5;8,4;]"..
    "label[0,0;Electric Alloy Furnace]"..
    "label[1,3;Power level]"
minetest.register_node("technic:alloy_furnace", {
    description = "Electric alloy furnace",
    tiles = {"technic_alloy_furnace_top.png", "technic_machine_bottom.png", "technic_alloy_furnace_side.png",
        "technic_alloy_furnace_side.png", "technic_alloy_furnace_side.png", "technic_alloy_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", alloy_furnace_formspec)
        meta:set_string("infotext", "Electric Alloy furnace")
        local inv = meta:get_inventory()
        inv:set_size("src", 1)
        inv:set_size("src2", 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 end
        if not inv:is_empty("src") then
            return false end
        if not inv:is_empty("src2") then
            return false end
        return true
    end,
})
minetest.register_node("technic:alloy_furnace_active", {
    description = "Alloy Furnace",
    tiles = {"technic_alloy_furnace_top.png", "technic_machine_bottom.png", "technic_alloy_furnace_side.png",
        "technic_alloy_furnace_side.png", "technic_alloy_furnace_side.png", "technic_alloy_furnace_front_active.png"},
    paramtype2 = "facedir",
    light_source = 8,
    drop = "technic:alloy_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,
    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:alloy_furnace","technic:alloy_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;src2;3,2;1,1;]"..
                "list[current_name;dst;5,1;2,2;]"..
                "list[current_player;main;0,5;8,4;]"..
                "label[0,0;Electric Alloy Furnace]"..
                "label[1,3;Power level]")
        local inv = meta:get_inventory()
        local furnace_is_cookin = meta:get_int("furnace_is_cookin")
        local srclist = inv:get_list("src")
        local srclist2 = inv:get_list("src2")
        srcstack = inv:get_stack("src", 1)
        if srcstack then src_item1=srcstack:to_table() end
        srcstack = inv:get_stack("src2", 1)
        if srcstack then src_item2=srcstack:to_table() end
        dst_index=nil
        if src_item1 and src_item2 then
                dst_index=get_cook_result(src_item1,src_item2)
                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") + 1)
            if dst_index and meta:get_float("src_time") >= 4 then
                -- check if there's room for output in "dst" list
                dst_stack={}
                dst_stack["name"]=alloy_recipes[dst_index].dst_name
                dst_stack["count"]=alloy_recipes[dst_index].dst_count
                if inv:room_for_item("dst",dst_stack) then
                    -- Put result in "dst" list
                    inv:add_item("dst",dst_stack)
                    -- take stuff from "src" list
                    for i=1,alloy_recipes[dst_index].src1_count,1 do
                        srcstack = inv:get_stack("src", 1)
                        srcstack:take_item()
                        inv:set_stack("src", 1, srcstack)
                        end
                    for i=1,alloy_recipes[dst_index].src2_count,1 do
                        srcstack = inv:get_stack("src2", 1)
                        srcstack:take_item()
                        inv:set_stack("src2", 1, srcstack)
                        end
                else
                    print("Furnace inventory full!")
                end
                meta:set_string("src_time", 0)
            end
            end
        end
        if dst_index and meta:get_int("furnace_is_cookin")==0 then
            hacky_swap_node(pos,"technic:alloy_furnace_active")
            meta:set_string("infotext","Electric Alloy Furnace active")
            meta:set_int("furnace_is_cookin",1)
            meta:set_string("src_time", 0)
            return
            end
        if meta:get_int("furnace_is_cookin")==0 or dst_index==nil then
            hacky_swap_node(pos,"technic:alloy_furnace")
            meta:set_string("infotext","Electric Alloy Furnace inactive")
            meta:set_int("furnace_is_cookin",0)
            meta:set_string("src_time", 0)
        end
end,
})
function get_cook_result(src_item1, src_item2)
local counter=registered_recipes_count-1
for i=1, counter,1 do
if    alloy_recipes[i].src1_name==src_item1["name"] and
    alloy_recipes[i].src2_name==src_item2["name"] and
    alloy_recipes[i].src1_count<=src_item1["count"] and
    alloy_recipes[i].src2_count<=src_item2["count"]
    then return i end
end
return nil
end
--coal driven alloy furnace:
minetest.register_craft({
    output = 'technic:coal_alloy_furnace',
    recipe = {
        {'default:brick', 'default:brick', 'default:brick'},
        {'default:brick', '', 'default:brick'},
        {'default:brick', 'default:brick', 'default:brick'},
    }
})
coal_alloy_furnace_formspec =
    "size[8,9]"..
    "label[0,0;Alloy Furnace]"..
    "image[2,2;1,1;default_furnace_fire_bg.png]"..
    "list[current_name;fuel;2,3;1,1;]"..
    "list[current_name;src;2,1;1,1;]"..
    "list[current_name;src2;3,1;1,1;]"..
    "list[current_name;dst;5,1;2,2;]"..
    "list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:coal_alloy_furnace", {
    description = "Alloy Furnace",
    tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", "technic_coal_alloy_furnace_side.png",
        "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front.png"},
    paramtype2 = "facedir",
    groups = {cracky=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_stone_defaults(),
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec", coal_alloy_furnace_formspec)
        meta:set_string("infotext", "Alloy Furnace")
        local inv = meta:get_inventory()
        inv:set_size("fuel", 1)
        inv:set_size("src", 1)
        inv:set_size("src2", 1)
        inv:set_size("dst", 4)
        local furnace_is_cookin = 0
        local dst_index = nil
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not (inv:is_empty("fuel") or inv:is_empty("dst") or inv:is_empty("src") or inv:is_empty("src2") )then
            return false
            end
        return true
    end,
})
minetest.register_node("technic:coal_alloy_furnace_active", {
    description = "Alloy Furnace",
    tiles = {"technic_coal_alloy_furnace_top.png", "technic_coal_alloy_furnace_bottom.png", "technic_coal_alloy_furnace_side.png",
        "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_side.png", "technic_coal_alloy_furnace_front_active.png"},
    paramtype2 = "facedir",
    light_source = 8,
    drop = "technic:coal_alloy_furnace",
    groups = {cracky=2, not_in_creative_inventory=1},
    legacy_facedir_simple = true,
    sounds = default.node_sound_stone_defaults(),
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not (inv:is_empty("fuel") or inv:is_empty("dst") or inv:is_empty("src") or inv:is_empty("src2") )then
            return false
            end
        return true
    end,
})
minetest.register_abm({
    nodenames = {"technic:coal_alloy_furnace","technic:coal_alloy_furnace_active"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
        local meta = minetest.env:get_meta(pos)
        for i, name in ipairs({
                "fuel_totaltime",
                "fuel_time",
                "src_totaltime",
                "src_time"
        }) do
            if meta:get_string(name) == "" then
                meta:set_float(name, 0.0)
            end
        end
        local inv = meta:get_inventory()
        srcstack = inv:get_stack("src", 1)
        if srcstack then src_item1=srcstack:to_table() end
        srcstack = inv:get_stack("src2", 1)
        if srcstack then src_item2=srcstack:to_table() end
        dst_index=nil
        if src_item1 and src_item2 then
                dst_index=get_cook_result(src_item1,src_item2)
                end
        local was_active = false
        if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
            was_active = true
            meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
            meta:set_float("src_time", meta:get_float("src_time") + 1)
            if dst_index and meta:get_float("src_time") >= 5 then
                -- check if there's room for output in "dst" list
                dst_stack={}
                dst_stack["name"]=alloy_recipes[dst_index].dst_name
                dst_stack["count"]=alloy_recipes[dst_index].dst_count
                if inv:room_for_item("dst",dst_stack) then
                    -- Put result in "dst" list
                    inv:add_item("dst", dst_stack)
                    -- take stuff from "src" list
                    for i=1,alloy_recipes[dst_index].src1_count,1 do
                        srcstack = inv:get_stack("src", 1)
                        srcstack:take_item()
                        inv:set_stack("src", 1, srcstack)
                        end
                    for i=1,alloy_recipes[dst_index].src2_count,1 do
                        srcstack = inv:get_stack("src2", 1)
                        srcstack:take_item()
                        inv:set_stack("src2", 1, srcstack)
                        end
                else
                    print("Furnace inventory full!")
                end
                meta:set_string("src_time", 0)
            end
        end
        if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
            local percent = math.floor(meta:get_float("fuel_time") /
                    meta:get_float("fuel_totaltime") * 100)
            meta:set_string("infotext","Furnace active: "..percent.."%")
            hacky_swap_node(pos,"technic:coal_alloy_furnace_active")
            meta:set_string("formspec",
                "size[8,9]"..
                "label[0,0;Electric Alloy Furnace]"..
                "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..
                        (100-percent)..":default_furnace_fire_fg.png]"..
                "list[current_name;fuel;2,3;1,1;]"..
                "list[current_name;src;2,1;1,1;]"..
                "list[current_name;src2;3,1;1,1;]"..
                "list[current_name;dst;5,1;2,2;]"..
                "list[current_player;main;0,5;8,4;]")
            return
        end
        local fuel = nil
        local fuellist = inv:get_list("fuel")
        srcstack = inv:get_stack("src", 1)
        if srcstack then src_item1=srcstack:to_table() end
        srcstack = inv:get_stack("src2", 1)
        if srcstack then src_item2=srcstack:to_table() end
        dst_index=nil
        if src_item1 and src_item2 then
                dst_index=get_cook_result(src_item1,src_item2)
                end
        if fuellist then
            fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
        end
        if fuel.time <= 0 then
            meta:set_string("infotext","Furnace out of fuel")
            hacky_swap_node(pos,"technic:coal_alloy_furnace")
            meta:set_string("formspec", coal_alloy_furnace_formspec)
            return
        end
        if dst_index==nil then
            if was_active then
                meta:set_string("infotext","Furnace is empty")
                hacky_swap_node(pos,"technic:coal_alloy_furnace")
                meta:set_string("formspec", coal_alloy_furnace_formspec)
            end
            return
        end
        meta:set_string("fuel_totaltime", fuel.time)
        meta:set_string("fuel_time", 0)
        local stack = inv:get_stack("fuel", 1)
        stack:take_item()
        inv:set_stack("fuel", 1, stack)
end,
})
technic/battery_box.lua
New file
@@ -0,0 +1,398 @@
power_tools ={}
registered_power_tools_count=1
function register_power_tool (string1,max_charge)
power_tools[registered_power_tools_count]={}
power_tools[registered_power_tools_count].tool_name=string1
power_tools[registered_power_tools_count].max_charge=max_charge
registered_power_tools_count=registered_power_tools_count+1
end
register_power_tool ("technic:mining_drill",60000)
register_power_tool ("technic:chainsaw",30000)
register_power_tool ("technic:laser_mk1",40000)
register_power_tool ("technic:battery",10000)
register_power_tool ("technic:sonic_screwdriver",15000)
register_power_tool ("technic:flashlight",30000)
register_power_tool ("technic:red_energy_crystal",100000)
register_power_tool ("technic:green_energy_crystal",250000)
register_power_tool ("technic:blue_energy_crystal",500000)
minetest.register_alias("battery", "technic:battery")
minetest.register_alias("battery_box", "technic:battery_box")
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_tool("technic:battery",
{description = "RE Battery",
inventory_image = "technic_battery.png",
tool_capabilities = {load=0,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_side0.png",
        "technic_battery_box_side0.png", "technic_battery_box_side0.png", "technic_battery_box_side0.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    last_side_shown=0,
    drop="technic:battery_box",
    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
        last_side_shown=0
        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,
})
for i=1,8,1 do
minetest.register_node("technic:battery_box"..i, {
    description = "Battery box",
    tiles = {"technic_battery_box_top.png", "technic_battery_box_bottom.png", "technic_battery_box_side0.png^technic_power_meter"..i..".png",
        "technic_battery_box_side0.png^technic_power_meter"..i..".png", "technic_battery_box_side0.png^technic_power_meter"..i..".png", "technic_battery_box_side0.png^technic_power_meter"..i..".png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    last_side_shown=0,
    drop="technic:battery_box",
    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
        last_side_shown=0
        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,
})
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
function set_RE_wear (item_stack,load1,max_load)
local temp=65536-math.floor(load1/max_load*65535)
item_stack["wear"]=tostring(temp)
return item_stack
end
minetest.register_abm({
    nodenames = {"technic:battery_box","technic:battery_box1","technic:battery_box2","technic:battery_box3","technic:battery_box4",
             "technic:battery_box5","technic:battery_box6","technic:battery_box7","technic:battery_box8"
            },
    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_int("battery_charge")
    max_charge= 60000
    local i=math.ceil((charge/max_charge)*8)
    if i>8 then i=8 end
    j=meta:get_float("last_side_shown")
    if i~=j then
    if i>0 then hacky_swap_node(pos,"technic:battery_box"..i)
    elseif i==0 then hacky_swap_node(pos,"technic:battery_box") end
    meta:set_float("last_side_shown",i)
    end
--loading registered power tools
    local inv = meta:get_inventory()
    if inv:is_empty("src")==false  then
        srcstack = inv:get_stack("src", 1)
        src_item=srcstack:to_table()
        item_meta=srcstack:get_metadata()
        if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before tool/item
    local item_max_charge = nil
    local counter=registered_power_tools_count-1
    for i=1, counter,1 do
        if power_tools[i].tool_name==src_item["name"] then
        item_max_charge=power_tools[i].max_charge
        end
        end
    if item_max_charge then
        load1=tonumber((src_item["metadata"]))
        load_step=1000
        if load1<item_max_charge and charge>0 then
         if charge-load_step<0 then load_step=charge end
         if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end
        load1=load1+load_step
        charge=charge-load_step
        set_RE_wear(src_item,load1,item_max_charge)
        src_item["metadata"]=tostring(load1)
        inv:set_stack("src", 1, src_item)
        end
        meta:set_int("battery_charge",charge)
    end
    end
-- dischargin registered power tools
        if inv:is_empty("dst") == false then
        srcstack = inv:get_stack("dst", 1)
        src_item=srcstack:to_table()
        local item_max_charge = nil
        local counter=registered_power_tools_count-1
        for i=1, counter,1 do
        if power_tools[i].tool_name==src_item["name"] then
        item_max_charge=power_tools[i].max_charge
        end
        end
        if item_max_charge then
        if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before battery/crystal
        local load1=tonumber((src_item["metadata"]))
        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
        set_RE_wear(src_item,load1,item_max_charge)
        src_item["metadata"]=tostring(load1)
        inv:set_stack("dst", 1, src_item)
        end
        end
        end
    meta:set_int("battery_charge",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 -- gettin power from all connected producers
        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 internal_EU_buffer=meta1:get_float("internal_EU_buffer")
    if charge<max_charge then
    charge_to_take=200
    if internal_EU_buffer-charge_to_take<=0 then
        charge_to_take=internal_EU_buffer
    end
    if charge_to_take>0 then
    charge=charge+charge_to_take
    internal_EU_buffer=internal_EU_buffer-charge_to_take
    meta1:set_float("internal_EU_buffer",internal_EU_buffer)
    end
    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
    charge=math.floor(charge)
    charge_string=tostring(charge)
    meta:set_string("infotext", "Battery box: "..charge_string.."/"..max_charge);
    meta:set_int("battery_charge",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:generator" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:generator_active" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:geothermal" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:geothermal_active" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:water_mill" then     new_node_added=add_new_cable_node(PR_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:water_mill_active" 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:alloy_furnace" then     new_node_added=add_new_cable_node(RE_nodes,pos1) end
if minetest.env:get_node(pos1).name == "technic:alloy_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
technic/battery_box_mv.lua
New file
@@ -0,0 +1,321 @@
minetest.register_craft({
    output = 'technic:mv_battery_box 1',
    recipe = {
        {'technic:battery_box', 'technic:battery_box', 'technic:battery_box'},
        {'technic:battery_box', 'technic:mv_transformer', 'technic:battery_box'},
        {'', 'technic:mv_cable', ''},
    }
})
mv_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;MV_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:mv_battery_box", {
    description = "MV Battery Box",
    tiles = {"technic_mv_battery_box_top.png", "technic_mv_battery_box_bottom.png", "technic_mv_battery_box_side0.png",
        "technic_mv_battery_box_side0.png", "technic_mv_battery_box_side0.png", "technic_mv_battery_box_side0.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
    technic_mv_power_machine=1,
    last_side_shown=0,
    drop="technic:mv_battery_box",
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "MV Battery box")
        meta:set_float("technic_mv_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 = 300000
        last_side_shown=0
        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,
})
for i=1,8,1 do
minetest.register_node("technic:mv_battery_box"..i, {
    description = "MV Battery Box",
    tiles = {"technic_mv_battery_box_top.png", "technic_mv_battery_box_bottom.png", "technic_mv_battery_box_side0.png^technic_power_meter"..i..".png",
        "technic_mv_battery_box_side0.png^technic_power_meter"..i..".png", "technic_mv_battery_box_side0.png^technic_power_meter"..i..".png", "technic_mv_battery_box_side0.png^technic_power_meter"..i..".png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    last_side_shown=0,
    drop="technic:mv_battery_box",
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "MV Battery box")
        meta:set_float("technic_mv_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 = 300000
        last_side_shown=0
        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,
})
end
MV_nodes_visited = {}
minetest.register_abm({
    nodenames = {"technic:mv_battery_box","technic:mv_battery_box1","technic:mv_battery_box2","technic:mv_battery_box3","technic:mv_battery_box4",
             "technic:mv_battery_box5","technic:mv_battery_box6","technic:mv_battery_box7","technic:mv_battery_box8"
            },
    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_int("battery_charge")
    max_charge= 300000
    local i=math.ceil((charge/max_charge)*8)
    if i>8 then i=8 end
    j=meta:get_float("last_side_shown")
    if i~=j then
    if i>0 then hacky_swap_node(pos,"technic:mv_battery_box"..i)
    elseif i==0 then hacky_swap_node(pos,"technic:mv_battery_box") end
    meta:set_float("last_side_shown",i)
    end
--loading registered power tools
    local inv = meta:get_inventory()
    if inv:is_empty("src")==false  then
        srcstack = inv:get_stack("src", 1)
        src_item=srcstack:to_table()
        item_meta=srcstack:get_metadata()
        if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before tool/item
    local item_max_charge = nil
    local counter=registered_power_tools_count-1
    for i=1, counter,1 do
        if power_tools[i].tool_name==src_item["name"] then
        item_max_charge=power_tools[i].max_charge
        end
        end
    if item_max_charge then
        load1=tonumber((src_item["metadata"]))
        load_step=4000
        if load1<item_max_charge and charge>0 then
         if charge-load_step<0 then load_step=charge end
         if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end
        load1=load1+load_step
        charge=charge-load_step
        set_RE_wear(src_item,load1,item_max_charge)
        src_item["metadata"]=tostring(load1)
        inv:set_stack("src", 1, src_item)
        end
        meta:set_int("battery_charge",charge)
    end
    end
-- dischargin registered power tools
        if inv:is_empty("dst") == false then
        srcstack = inv:get_stack("dst", 1)
        src_item=srcstack:to_table()
        local item_max_charge = nil
        local counter=registered_power_tools_count-1
        for i=1, counter,1 do
        if power_tools[i].tool_name==src_item["name"] then
        item_max_charge=power_tools[i].max_charge
        end
        end
        if item_max_charge then
        if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before battery/crystal
        local load1=tonumber((src_item["metadata"]))
        load_step=4000
        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
        set_RE_wear(src_item,load1,item_max_charge)
        src_item["metadata"]=tostring(load1)
        inv:set_stack("dst", 1, src_item)
        end
        end
        end
    meta:set_int("battery_charge",charge)
    local load = math.floor(charge/300000 * 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;MV 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("mv_cablelike")~=1 then return end
        local MV_nodes = {}
        local PR_nodes = {}
        local RE_nodes = {}
         MV_nodes[1]={}
         MV_nodes[1].x=pos1.x
        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)
    table_index=table_index+1
    if MV_nodes[table_index]==nil then break end
    until false
local pos1={}
i=1
    repeat
    if PR_nodes[i]==nil then break end -- gettin power from all connected producers
        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 internal_EU_buffer=meta1:get_float("internal_EU_buffer")
    if charge<max_charge then
    charge_to_take=1000
    if internal_EU_buffer-charge_to_take<=0 then
        charge_to_take=internal_EU_buffer
    end
    if charge_to_take>0 then
    charge=charge+charge_to_take
    internal_EU_buffer=internal_EU_buffer-charge_to_take
    meta1:set_float("internal_EU_buffer",internal_EU_buffer)
    end
    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=1000
    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
    charge=math.floor(charge)
    charge_string=tostring(charge)
    meta:set_string("infotext", "Battery box: "..charge_string.."/"..max_charge);
    meta:set_int("battery_charge",charge)
end
})
function add_new_MVcable_node (MV_nodes,pos1)
local i=1
    repeat
        if MV_nodes[i]==nil then break end
        if pos1.x==MV_nodes[i].x and pos1.y==MV_nodes[i].y and pos1.z==MV_nodes[i].z then return false end
        i=i+1
    until false
MV_nodes[i]={}
MV_nodes[i].x=pos1.x
MV_nodes[i].y=pos1.y
MV_nodes[i].z=pos1.z
MV_nodes[i].visited=false
return true
end
function check_MV_node (PR_nodes,RE_nodes,MV_nodes,i)
        local pos1={}
        pos1.x=MV_nodes[i].x
        pos1.y=MV_nodes[i].y
        pos1.z=MV_nodes[i].z
        MV_nodes[i].visited=true
        new_node_added=false
        pos1.x=pos1.x+1
        check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
        pos1.x=pos1.x-2
        check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
        pos1.x=pos1.x+1
        pos1.y=pos1.y+1
        check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
        pos1.y=pos1.y-2
        check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
        pos1.y=pos1.y+1
        pos1.z=pos1.z+1
        check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
        pos1.z=pos1.z-2
        check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
        pos1.z=pos1.z+1
return new_node_added
end
function check_MV_node_subp (PR_nodes,RE_nodes,MV_nodes,pos1)
meta = minetest.env:get_meta(pos1)
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/cans.lua
New file
@@ -0,0 +1,162 @@
water_can_max_load = 16
lava_can_max_load = 8
minetest.register_craft({
    output = 'technic:water_can 1',
    recipe = {
        {'technic:zinc_ingot', 'technic:rubber','technic:zinc_ingot'},
        {'default:steel_ingot', '', 'default:steel_ingot'},
        {'technic:zinc_ingot', 'default:steel_ingot', 'technic:zinc_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:lava_can 1',
    recipe = {
        {'technic:zinc_ingot', 'technic:stainless_steel_ingot','technic:zinc_ingot'},
        {'technic:stainless_steel_ingot', '', 'technic:stainless_steel_ingot'},
        {'technic:zinc_ingot', 'technic:stainless_steel_ingot', 'technic:zinc_ingot'},
    }
})
minetest.register_tool("technic:water_can", {
    description = "Water Can",
    inventory_image = "technic_water_can.png",
    stack_max = 1,
    liquids_pointable = true,
    on_use = function(itemstack, user, pointed_thing)
        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
            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:water_flowing" then
            minetest.env:add_node(pointed_thing.under, {name="default:water_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:water_source"})
            load=load-1;
            item["metadata"]=tostring(load)
            set_RE_wear(item,load,water_can_max_load)
            itemstack:replace(item)
            return itemstack
            end
    end,
})
minetest.register_tool("technic:lava_can", {
    description = "Lava Can",
    inventory_image = "technic_lava_can.png",
    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
        n = minetest.env:get_node(pointed_thing.under)
        if n.name == "default:lava_source" then
            item=itemstack:to_table()
            local load=tonumber((item["wear"]))
            if  load==0 then load =65535 end
            load=get_RE_item_load(load,lava_can_max_load)
            if load+1<9 then
            minetest.env:add_node(pointed_thing.under, {name="air"})
             load=load+1;
            load=set_RE_item_load(load,lava_can_max_load)
            item["wear"]=tostring(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,lava_can_max_load)
            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;
            load=set_RE_item_load(load,lava_can_max_load)
            item["wear"]=tostring(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;
            load=set_RE_item_load(load,lava_can_max_load)
            item["wear"]=tostring(load)
            itemstack:replace(item)
            return itemstack
            end
    end,
})
technic/chainsaw.lua
New file
@@ -0,0 +1,59 @@
chainsaw_max_charge=30000
minetest.register_tool("technic:chainsaw", {
    description = "Chainsaw",
    inventory_image = "technic_chainsaw.png",
    stack_max = 1,
    on_use = function(itemstack, user, pointed_thing)
        if pointed_thing.type=="node" then
        item=itemstack:to_table()
        if item["metadata"]=="" or item["metadata"]=="0" then return end --tool not charged
        charge=tonumber(item["metadata"])
        charge_to_take=600;
        if charge-charge_to_take>0 then
         charge_to_take=chainsaw_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,charge_to_take)
         charge=charge-charge_to_take;
        set_RE_wear(item,charge,chainsaw_max_charge)
        item["metadata"]=tostring(charge)
        itemstack:replace(item)
        return itemstack
        end
        end
    end,
})
minetest.register_craft({
    output = 'technic:chainsaw',
    recipe = {
        {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'},
        {'technic:stainless_steel_ingot', 'technic:motor', 'technic:battery'},
        {'','','moreores:copper_ingot'},
    }
})
timber_nodenames={"default:jungletree", "default:papyrus", "default:cactus", "default:tree"}
function chainsaw_dig_it (pos, player,charge_to_take)
    charge_to_take=0
    local node=minetest.env:get_node(pos)
    local i=1
    while timber_nodenames[i]~=nil do
        if node.name==timber_nodenames[i] then
            charge_to_take=600
            np={x=pos.x, y=pos.y, z=pos.z}
            while minetest.env:get_node(np).name==timber_nodenames[i] do
                minetest.env:remove_node(np)
                minetest.env:add_item(np, timber_nodenames[i])
                np={x=np.x, y=np.y+1, z=np.z}
            end
            minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, max_hear_distance = 10,})
            return charge_to_take
        end
        i=i+1
    end
return charge_to_take
end
technic/chest_commons.lua
New file
@@ -0,0 +1,78 @@
chest_groups1 = {snappy=2,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1}
chest_groups2 = {snappy=2,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1,not_in_creative_inventory=1}
tubes_properties = {insert_object=function(pos,node,stack,direction)
                    local meta=minetest.env:get_meta(pos)
                    local inv=meta:get_inventory()
                    return inv:add_item("main",stack)
                end,
                can_insert=function(pos,node,stack,direction)
                    local meta=minetest.env:get_meta(pos)
                    local inv=meta:get_inventory()
                    return inv:room_for_item("main",stack)
                end,
                input_inventory="main"}
chest_can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return inv:is_empty("main")
end
def_allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
    minetest.log("action", player:get_player_name()..
    " tried to access a locked chest belonging to "..
    meta:get_string("owner").." at "..
    minetest.pos_to_string(pos))
    return 0
    end
    return count
end
def_allow_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
    minetest.log("action", player:get_player_name()..
    " tried to access a locked chest belonging to "..
    meta:get_string("owner").." at "..
    minetest.pos_to_string(pos))
    return 0
end
return stack:get_count()
end
def_allow_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.env:get_meta(pos)
if not has_locked_chest_privilege(meta, player) then
    minetest.log("action", player:get_player_name()..
    " tried to access a locked chest belonging to "..
    meta:get_string("owner").." at "..
    minetest.pos_to_string(pos))
    return 0
    end
return stack:get_count()
end
def_on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
    minetest.log("action", player:get_player_name()..
    " moves stuff in locked chest at "..minetest.pos_to_string(pos))
end
def_on_metadata_inventory_put = function(pos, listname, index, stack, player)
    minetest.log("action", player:get_player_name()..
    " moves stuff to locked chest at "..minetest.pos_to_string(pos))
end
def_on_metadata_inventory_take = function(pos, listname, index, stack, player)
    minetest.log("action", player:get_player_name()..
    " takes stuff from locked chest at "..minetest.pos_to_string(pos))
end
function has_locked_chest_privilege(meta, player)
    if player:get_player_name() ~= meta:get_string("owner") then
        return false
    end
    return true
end
technic/concrete.lua
New file
@@ -0,0 +1,83 @@
minetest.register_craft({
    output = 'technic:rebar 6',
    recipe = {
        {'','', 'default:steel_ingot'},
        {'','default:steel_ingot',''},
        {'default:steel_ingot', '', ''},
    }
})
minetest.register_craft({
    output = 'technic:concrete 5',
    recipe = {
        {'default:stone','technic:rebar','default:stone'},
        {'technic:rebar','default:stone','technic:rebar'},
        {'default:stone','technic:rebar','default:stone'},
    }
})
minetest.register_craft({
    output = 'technic:concrete_post 4',
    recipe = {
        {'default:stone','technic:rebar','default:stone'},
        {'default:stone','technic:rebar','default:stone'},
        {'default:stone','technic:rebar','default:stone'},
}
})
minetest.register_craftitem("technic:rebar", {
    description = "Rebar",
    inventory_image = "technic_rebar.png",
    stack_max = 99,
})
minetest.register_craftitem("technic:concrete", {
    description = "Concrete Block",
    inventory_image = "technic_concrete_block.png",
    stack_max = 99,
})
minetest.register_craftitem("technic:concrete_post", {
    description = "Concrete Post",
    inventory_image = "technic_concrete_post.png",
    stack_max = 99,
})
-- NODES:
minetest.register_node("technic:concrete", {
    description = "Concrete Block",
    tile_images = {"technic_concrete_block.png",},
    is_ground_content = true,
    groups = {cracky=1},
    sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("technic:concrete_post", {
    description = "Concrete Post",
    drawtype = "fencelike",
    tiles = {"technic_concrete_block.png"},
    inventory_image = "default_fence.png",
    wield_image = "default_fence.png",
    paramtype = "light",
    is_ground_content = true,
    selection_box = {
        type = "fixed",
        fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
    },
    groups = {cracky=1},
    sounds = default.node_sound_stone_defaults(),
})
stairsplus.register_stair_and_slab_and_panel_and_micro(":stairsplus", "concrete", "technic:concrete",
        {cracky=3},
        {"technic_concrete_block.png"},
        "Concrete Stairs",
        "Concrete Slab",
        "Concrete Panel",
        "Concrete Microblock",
        "concrete")
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/constructor.lua
New file
@@ -0,0 +1,298 @@
minetest.register_craft({
    type = "shapeless",
    output = 'technic:constructor_mk1_off 1',
    recipe = {'technic:nodebreaker_off', 'technic:deployer_off'},
})
minetest.register_craft({
    type = "shapeless",
    output = 'technic:constructor_mk2_off 1',
    recipe = {'technic:constructor_mk1_off', 'technic:constructor_mk1_off'},
})
minetest.register_craft({
    type = "shapeless",
    output = 'technic:constructor_mk3_off 1',
    recipe = {'technic:constructor_mk2_off', 'technic:constructor_mk2_off'},
})
mk1_on = function(pos, node)
    local meta = minetest.env:get_meta(pos)
    local inv = meta:get_inventory()
    local pos1={}
    pos1.x=pos.x
    pos1.y=pos.y
    pos1.z=pos.z
    if node.param2==3 then pos1.x=pos1.x+1 end
    if node.param2==2 then pos1.z=pos1.z+1 end
    if node.param2==1 then pos1.x=pos1.x-1 end
    if node.param2==0 then pos1.z=pos1.z-1 end
    if node.name == "technic:constructor_mk1_off" then
        hacky_swap_node(pos,"technic:constructor_mk1_on")
        nodeupdate(pos)
        local node1=minetest.env:get_node(pos1)
        deploy_node (inv,"slot1",pos1,node1,node)
    end
end
mk1_off = function(pos, node)
    if node.name == "technic:constructor_mk1_on" then
        hacky_swap_node(pos,"technic:constructor_mk1_off")
        nodeupdate(pos)
    end
end
minetest.register_node("technic:constructor_mk1_off", {
    description = "Constructor MK1",
    tile_images = {"technic_constructor_mk1_top_off.png","technic_constructor_mk1_bottom_off.png","technic_constructor_mk1_side2_off.png","technic_constructor_mk1_side1_off.png",
            "technic_constructor_back.png","technic_constructor_front_off.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2},
    mesecons= {effector={action_on=mk1_on}},
    sounds = default.node_sound_stone_defaults(),
    on_construct = function(pos)
    local meta = minetest.env:get_meta(pos)
    meta:set_string("formspec",
                "invsize[8,9;]"..
                "label[0,0;Constructor MK1]"..
                "label[5,0;Slot 1]"..
                "list[current_name;slot1;6,0;1,1;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Constructor MK1")
        local inv = meta:get_inventory()
        inv:set_size("slot1", 1)
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos)
        local inv = meta:get_inventory()
        return inv:is_empty("slot1")
    end,
})
minetest.register_node("technic:constructor_mk1_on", {
    description = "Constructor MK1",
    tile_images = {"technic_constructor_mk1_top_on.png","technic_constructor_mk1_bottom_on.png","technic_constructor_mk1_side2_on.png","technic_constructor_mk1_side1_on.png",
            "technic_constructor_back.png","technic_constructor_front_on.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon = 2,not_in_creative_inventory=1},
    mesecons= {effector={action_off=mk1_off}},
    sounds = default.node_sound_stone_defaults(),
})
--Constructor MK2
mk2_on = function(pos, node)
    local meta = minetest.env:get_meta(pos)
    local inv = meta:get_inventory()
    local pos1={}
    local pos2={}
    pos1.x=pos.x
    pos1.y=pos.y
    pos1.z=pos.z
    pos2.x=pos.x
    pos2.y=pos.y
    pos2.z=pos.z
    if node.param2==3 then pos1.x=pos1.x+1 pos2.x=pos2.x+2 end
    if node.param2==2 then pos1.z=pos1.z+1 pos2.z=pos2.z+2 end
    if node.param2==1 then pos1.x=pos1.x-1 pos2.x=pos2.x-2 end
    if node.param2==0 then pos1.z=pos1.z-1 pos2.z=pos2.z-2 end
    if node.name == "technic:constructor_mk2_off" then
        hacky_swap_node(pos,"technic:constructor_mk2_on")
        nodeupdate(pos)
        local node1=minetest.env:get_node(pos1)
        deploy_node (inv,"slot1",pos1,node1,node)
        local node1=minetest.env:get_node(pos2)
        deploy_node (inv,"slot2",pos2,node1,node)
    end
end
mk2_off = function(pos, node)
    if node.name == "technic:constructor_mk2_on" then
        hacky_swap_node(pos,"technic:constructor_mk2_off")
        nodeupdate(pos)
    end
end
minetest.register_node("technic:constructor_mk2_off", {
    description = "Constructor MK2",
    tile_images = {"technic_constructor_mk2_top_off.png","technic_constructor_mk2_bottom_off.png","technic_constructor_mk2_side2_off.png","technic_constructor_mk2_side1_off.png",
            "technic_constructor_back.png","technic_constructor_front_off.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2},
    mesecons= {effector={action_on=mk2_on}},
    sounds = default.node_sound_stone_defaults(),
    on_construct = function(pos)
    local meta = minetest.env:get_meta(pos)
    meta:set_string("formspec",
                "invsize[8,9;]"..
                "label[0,0;Constructor MK2]"..
                "label[5,0;Slot 1]"..
                "list[current_name;slot1;6,0;1,1;]"..
                "label[5,1;Slot 2]"..
                "list[current_name;slot2;6,1;1,1;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Constructor MK2")
        local inv = meta:get_inventory()
        inv:set_size("slot1", 1)
        inv:set_size("slot2", 1)
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos)
        local inv = meta:get_inventory()
        if inv:is_empty("slot1")==false or inv:is_empty("slot2")==false then return false end
        return true
    end,
})
minetest.register_node("technic:constructor_mk2_on", {
    description = "Constructor MK2",
    tile_images = {"technic_constructor_mk2_top_on.png","technic_constructor_mk2_bottom_on.png","technic_constructor_mk2_side2_on.png","technic_constructor_mk2_side1_on.png",
            "technic_constructor_back.png","technic_constructor_front_on.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2, not_in_creative_inventory=1},
    mesecons= {effector={action_off=mk2_off}},
    sounds = default.node_sound_stone_defaults(),
})
-- Constructor MK3
mk3_on = function(pos, node)
    local meta = minetest.env:get_meta(pos)
    local inv = meta:get_inventory()
    local pos1={}
    local pos2={}
    local pos3={}
    local pos4={}
    pos1.x=pos.x
    pos1.y=pos.y
    pos1.z=pos.z
    pos2.x=pos.x
    pos2.y=pos.y
    pos2.z=pos.z
    pos3.x=pos.x
    pos3.y=pos.y
    pos3.z=pos.z
    pos4.x=pos.x
    pos4.y=pos.y
    pos4.z=pos.z
    if node.param2==3 then pos1.x=pos1.x+1 pos2.x=pos2.x+2 pos3.x=pos3.x+3 pos4.x=pos4.x+4 end
    if node.param2==2 then pos1.z=pos1.z+1 pos2.z=pos2.z+2 pos3.z=pos3.z+3 pos4.z=pos4.z+4 end
    if node.param2==1 then pos1.x=pos1.x-1 pos2.x=pos2.x-2 pos3.x=pos3.x-3 pos4.x=pos4.x-4 end
    if node.param2==0 then pos1.z=pos1.z-1 pos2.z=pos2.z-2 pos3.z=pos3.z-3 pos4.z=pos4.z-4 end
    if node.name == "technic:constructor_mk3_off" then
        hacky_swap_node(pos,"technic:constructor_mk3_on")
        nodeupdate(pos)
        local node1=minetest.env:get_node(pos1)
        deploy_node (inv,"slot1",pos1,node1,node)
        local node1=minetest.env:get_node(pos2)
        deploy_node (inv,"slot2",pos2,node1,node)
        local node1=minetest.env:get_node(pos3)
        deploy_node (inv,"slot3",pos3,node1,node)
        local node1=minetest.env:get_node(pos4)
        deploy_node (inv,"slot4",pos4,node1,node)
    end
end
mk3_off = function(pos, node)
    if node.name == "technic:constructor_mk3_on" then
        hacky_swap_node(pos,"technic:constructor_mk3_off")
        nodeupdate(pos)
    end
end
minetest.register_node("technic:constructor_mk3_off", {
    description = "Constructor MK3",
    tile_images = {"technic_constructor_mk3_top_off.png","technic_constructor_mk3_bottom_off.png","technic_constructor_mk3_side2_off.png","technic_constructor_mk3_side1_off.png",
            "technic_constructor_back.png","technic_constructor_front_off.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2},
    mesecons= {effector={action_on=mk3_on}},
    sounds = default.node_sound_stone_defaults(),
    on_construct = function(pos)
    local meta = minetest.env:get_meta(pos)
    meta:set_string("formspec",
                "invsize[8,9;]"..
                "label[0,0;Constructor MK2]"..
                "label[5,0;Slot 1]"..
                "list[current_name;slot1;6,0;1,1;]"..
                "label[5,1;Slot 2]"..
                "list[current_name;slot2;6,1;1,1;]"..
                "label[5,2;Slot 3]"..
                "list[current_name;slot3;6,2;1,1;]"..
                "label[5,3;Slot 4]"..
                "list[current_name;slot4;6,3;1,1;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Constructor MK3")
        local inv = meta:get_inventory()
        inv:set_size("slot1", 1)
        inv:set_size("slot2", 1)
        inv:set_size("slot3", 1)
        inv:set_size("slot4", 1)
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos)
        local inv = meta:get_inventory()
        if inv:is_empty("slot1")==false or inv:is_empty("slot2")==false or inv:is_empty("slot3")==false or inv:is_empty("slot4")==false then return false end
        return true
    end,
})
minetest.register_node("technic:constructor_mk3_on", {
    description = "Constructor MK3",
    tile_images = {"technic_constructor_mk3_top_on.png","technic_constructor_mk3_bottom_on.png","technic_constructor_mk3_side2_on.png","technic_constructor_mk3_side1_on.png",
            "technic_constructor_back.png","technic_constructor_front_on.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,not_in_creative_inventory=1},
    mesecons= {effector={action_off=mk3_off}},
    sounds = default.node_sound_stone_defaults(),
})
deploy_node =function (inv, slot_name, pos1, node1, node)
if node1.name == "air" then
            if not inv:is_empty(slot_name) then
            stack1=inv:get_list(slot_name)
            node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2}
            minetest.env:set_node(pos1,node_to_be_placed)
            stack1[1]:take_item()
            inv:set_stack(slot_name, 1, stack1[1])
            return
            end
        return
        end
        if node1.name == "ignore" or
           node1.name == "default:lava_source" or
           node1.name == "default:lava_flowing" or
           node1.name == "default:water_source" or
           node1.name == "default:water_flowing"
           then return end
        if inv:room_for_item(slot_name,node1) then
            inv:add_item(slot_name,node1)
            minetest.env:remove_node(pos1)
        end
end
technic/copper_chest.lua
New file
@@ -0,0 +1,95 @@
minetest.register_craft({
    output = 'technic:copper_chest 1',
    recipe = {
        {'moreores:copper_ingot','moreores:copper_ingot','moreores:copper_ingot'},
        {'moreores:copper_ingot','technic:iron_chest','moreores:copper_ingot'},
        {'moreores:copper_ingot','moreores:copper_ingot','moreores:copper_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:copper_locked_chest 1',
    recipe = {
        {'moreores:copper_ingot','moreores:copper_ingot','moreores:copper_ingot'},
        {'moreores:copper_ingot','technic:iron_locked_chest','moreores:copper_ingot'},
        {'moreores:copper_ingot','moreores:copper_ingot','moreores:copper_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:copper_locked_chest 1',
    recipe = {
        {'default:steel_ingot'},
        {'technic:copper_chest'},
    }
})
minetest.register_craftitem("technic:copper_chest", {
    description = "Copper Chest",
    stack_max = 99,
})
minetest.register_craftitem("technic:copper_locked_chest", {
    description = "Copper Locked Chest",
    stack_max = 99,
})
minetest.register_node("technic:copper_chest", {
    description = "Copper Chest",
    tiles = {"technic_copper_chest_top.png", "technic_copper_chest_top.png", "technic_copper_chest_side.png",
        "technic_copper_chest_side.png", "technic_copper_chest_side.png", "technic_copper_chest_front.png"},
    paramtype2 = "facedir",
    groups = chest_groups1,
    tube = tubes_properties,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[10,9;]"..
                "list[current_name;main;0,0;10,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Copper Chest")
        local inv = meta:get_inventory()
        inv:set_size("main", 10*4)
    end,
    can_dig = chest_can_dig,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
minetest.register_node("technic:copper_locked_chest", {
    description = "Copper Locked Chest",
    tiles = {"technic_copper_chest_top.png", "technic_copper_chest_top.png", "technic_copper_chest_side.png",
        "technic_copper_chest_side.png", "technic_copper_chest_side.png", "technic_copper_chest_locked.png"},
    paramtype2 = "facedir",
    groups = chest_groups1,
    tube = tubes_properties,legacy_facedir_simple = true,
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    after_place_node = function(pos, placer)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("owner", placer:get_player_name() or "")
        meta:set_string("infotext", "Copper Locked Chest (owned by "..
                meta:get_string("owner")..")")
    end,
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",
                "invsize[10,9;]"..
                "list[current_name;main;0,0;10,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Copper Locked Chest")
        meta:set_string("owner", "")
        local inv = meta:get_inventory()
        inv:set_size("main", 10*4)
    end,
    can_dig = chest_can_dig,
    allow_metadata_inventory_move = def_allow_metadata_inventory_move,
    allow_metadata_inventory_put = def_allow_metadata_inventory_put,
    allow_metadata_inventory_take = def_allow_metadata_inventory_take,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
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/depends.txt
New file
@@ -0,0 +1,4 @@
moreores
pipeworks
mesecons
stairsplus
technic/deployer.lua
New file
@@ -0,0 +1,91 @@
minetest.register_craft({
    output = 'technic:deployer_off 1',
    recipe = {
        {'default:wood', 'default:chest','default:wood'},
        {'default:stone', 'mesecons:piston','default:stone'},
        {'default:stone', 'mesecons:mesecon','default:stone'},
    }
})
minetest.register_node("technic:deployer_off", {
    description = "Deployer",
    tile_images = {"technic_deployer_top.png","technic_deployer_bottom.png","technic_deployer_side2.png","technic_deployer_side1.png",
            "technic_deployer_back.png","technic_deployer_front_off.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,tubedevice=1},
    sounds = default.node_sound_stone_defaults(),
    on_construct = function(pos)
    local meta = minetest.env:get_meta(pos)
    meta:set_string("formspec",
                "invsize[8,9;]"..
                "label[0,0;Deployer]"..
                "list[current_name;main;4,1;3,3;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Deployer")
        local inv = meta:get_inventory()
        inv:set_size("main", 3*3)
    end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not inv:is_empty("main") then
            return false
        end
        return true
        end,
})
minetest.register_node("technic:deployer_on", {
    description = "Deployer",
    tile_images = {"technic_deployer_top.png","technic_deployer_bottom.png","technic_deployer_side2.png","technic_deployer_side1.png",
            "technic_deployer_back.png","technic_deployer_front_on.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    tubelike=1,
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon_receptor_off = 1, mesecon_effector_off = 1, mesecon = 2,tubedevice=1,not_in_creative_inventory=1},
    sounds = default.node_sound_stone_defaults(),
})
mesecon:register_on_signal_on(function(pos, node)
    local pos1={}
    pos1.x=pos.x
    pos1.y=pos.y
    pos1.z=pos.z
    if node.param2==3 then pos1.x=pos1.x+1 end
    if node.param2==2 then pos1.z=pos1.z+1 end
    if node.param2==1 then pos1.x=pos1.x-1 end
    if node.param2==0 then pos1.z=pos1.z-1 end
    if node.name == "technic:deployer_off" then
        hacky_swap_node(pos,"technic:deployer_on")
        nodeupdate(pos)
            local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        print (dump(inv))
        for _,stack in ipairs(inv:get_list("main")) do
        print (dump(stack:get_name()))
        if stack:get_name() ~=nil then
            node1={name=stack:get_name(), param1=0, param2=node.param2}
            minetest.env:place_node(pos1,node1)
            return
            end
    end
    end
end)
mesecon:register_on_signal_off(function(pos, node)
    if node.name == "technic:deployer_on" then
        hacky_swap_node(pos,"technic:deployer_off")
        nodeupdate(pos)
    end
end)
mesecon:register_effector("technic:deployer_on", "technic:deployer_off")
technic/electric.lua
New file
@@ -0,0 +1,268 @@
power_tools ={}
registered_power_tools_count=1
function register_power_tool (string1,max_charge)
power_tools[registered_power_tools_count]={}
power_tools[registered_power_tools_count].tool_name=string1
power_tools[registered_power_tools_count].max_charge=max_charge
registered_power_tools_count=registered_power_tools_count+1
end
register_power_tool ("technic:mining_drill",60000)
register_power_tool ("technic:laser_mk1",40000)
register_power_tool ("technic:battery",10000)
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_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,
})
technic/electric_furnace.lua
New file
@@ -0,0 +1,177 @@
minetest.register_alias("electric_furnace", "technic:electric_furnace")
minetest.register_craft({
    output = 'technic:electric_furnace',
    recipe = {
        {'default:cobble', 'default:cobble', 'default:cobble'},
        {'default:cobble', '', 'default:cobble'},
        {'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
    }
})
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,
})
technic/flashlight.lua
New file
@@ -0,0 +1,169 @@
-- 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 = {
            {"technic:rubber","glass","technic:rubber"},
                    {"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)
    local pos = player:getpos()
    local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
    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 player then
        flashlight_weared=check_for_flashlight(player)
        local pos = player:getpos()
        local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
        local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
        if last_wielded[player_name] and not flashlight_weared then --remove light, flashlight weared out or was removed from hotbar
            local node=minetest.env:get_node_or_nil(old_pos)
            if node then
            if node.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"})
              last_wielded[player_name]=false
              end
            end
            end
        player_moved=not(old_pos.x==rounded_pos.x and old_pos.y==rounded_pos.y and old_pos.z==rounded_pos.z)
        if player_moved and last_wielded[player_name] and flashlight_weared  then
            local node=minetest.env:get_node_or_nil(rounded_pos)
            if node then
            if node.name=="air" then
                  minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
              end
            end
            local node=minetest.env:get_node_or_nil(old_pos)
            if node then
              if node.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
            player_positions[player_name]["x"] = rounded_pos.x
            player_positions[player_name]["y"] = rounded_pos.y
            player_positions[player_name]["z"] = rounded_pos.z
        else if not last_wielded[player_name] and flashlight_weared then
            local node=minetest.env:get_node_or_nil(rounded_pos)
            if node then
            if node.name=="air" then
                  minetest.env:add_node(rounded_pos,{type="node",name="technic:light"})
              end
            end
            player_positions[player_name]["x"] = rounded_pos.x
            player_positions[player_name]["y"] = rounded_pos.y
            player_positions[player_name]["z"] = rounded_pos.z
            last_wielded[player_name]=true
            end
    end
    end
    end
end)
minetest.register_node("technic:light", {
    drawtype = "glasslike",
    tile_images = {"technic_light.png"},
    paramtype = "light",
    walkable = false,
    buildable_to = true,
    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,
    buildable_to = true,
    is_ground_content = true,
    light_propagates = true,
    sunlight_propagates = true,
    selection_box = {
        type = "fixed",
        fixed = {0, 0, 0, 0, 0, 0},
    },
})
function check_for_flashlight (player)
if player==nil then return false end
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 false end --flashlight not charghed
            charge=tonumber(item["metadata"])
            if charge-2>0 then
             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 false
end
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/generator.lua
New file
@@ -0,0 +1,148 @@
minetest.register_alias("generator", "technic:generator")
minetest.register_alias("generator", "technic:generator_active")
minetest.register_craft({
    output = 'technic:generator',
    recipe = {
        {'default:stone', 'default:stone', 'default:stone'},
        {'default:stone', '', 'default:stone'},
        {'default:stone', 'moreores:copper_ingot', 'default:stone'},
    }
})
minetest.register_craftitem("technic:generator", {
    description = "Coal Driven Generator",
    stack_max = 99,
})
generator_formspec =
    "invsize[8,9;]"..
    "image[0,0;5,5;technic_generator_menu.png]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
--    "label[0,0;Generator]"..
    "label[1,3;Power level]"..
    "list[current_name;src;3,1;1,1;]"..
    "image[4,1;1,1;default_furnace_fire_bg.png]"..
    "list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:generator", {
    description = "Coal Driven Generator",
    tiles = {"technic_generator_top.png", "technic_machine_bottom.png", "technic_generator_side.png",
        "technic_generator_side.png", "technic_generator_side.png", "technic_generator_front.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=5000;
    burn_time=0;
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "Generator")
        meta:set_float("technic_power_machine", 1)
        meta:set_float("internal_EU_buffer", 0)
        meta:set_float("internal_EU_buffer_size", 5000)
        meta:set_string("formspec", generator_formspec)
        meta:set_float("burn_time", 0)
        local inv = meta:get_inventory()
        inv:set_size("src", 1)
        end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not inv:is_empty("src") then
            return false
        end
        return true
        end,
})
minetest.register_node("technic:generator_active", {
    description = "Coal Driven Generator",
    tiles = {"technic_generator_top.png", "technic_machine_bottom.png", "technic_generator_side.png",
        "technic_generator_side.png", "technic_generator_side.png", "technic_generator_front_active.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    drop="technic:generator",
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=0;
    burn_time=0;
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not inv:is_empty("src") then
            return false
        end
        return true
        end,
})
minetest.register_abm({
    nodenames = {"technic:generator","technic:generator_active"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
    local meta = minetest.env:get_meta(pos)
    local burn_time= meta:get_float("burn_time")
    local charge= meta:get_float("internal_EU_buffer")
    local max_charge= meta:get_float("internal_EU_buffer_size")
    local burn_charge=200
    if burn_time>0 then
        if charge+burn_charge>max_charge then
        burn_charge=max_charge-charge
        end
        if burn_charge>0 then
        burn_time=burn_time-1
        meta:set_float("burn_time",burn_time)
        charge=charge+burn_charge
        meta:set_float("internal_EU_buffer",charge)
        end
    end
    if burn_time==0 then
        local inv = meta:get_inventory()
        if inv:is_empty("src")==false  then
        local srcstack = inv:get_stack("src", 1)
        src_item=srcstack:to_table()
        if src_item["name"]== "default:coal_lump" then
        srcstack:take_item()
        inv:set_stack("src", 1, srcstack)
        burn_time=16
        meta:set_float("burn_time",burn_time)
        hacky_swap_node (pos,"technic:generator_active")
        end
        end
    end
    local load = math.floor((charge/max_charge)*100)
    local percent = math.floor((burn_time/16)*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]"..
                "label[0,0;Generator]"..
                "label[1,3;Power level]"..
                "list[current_name;src;3,1;1,1;]"..
                "image[4,1;1,1;default_furnace_fire_bg.png^[lowpart:"..
                        (percent)..":default_furnace_fire_fg.png]"..
                "list[current_player;main;0,5;8,4;]"
                )
    if burn_time==0 then
        hacky_swap_node (pos,"technic:generator")
    end
    end
})
technic/geothermal.lua
New file
@@ -0,0 +1,135 @@
minetest.register_alias("geothermal", "technic:geothermal")
minetest.register_craft({
    output = 'technic:geothermal',
    recipe = {
        {'default:stone', 'default:stone', 'default:stone'},
        {'moreores:copper_ingot', 'technic:diamond', 'moreores:copper_ingot'},
        {'default:stone', 'moreores:copper_ingot', 'default:stone'},
    }
})
minetest.register_craftitem("technic:geothermal", {
    description = "Geothermal Generator",
    stack_max = 99,
})
geothermal_formspec =
    "invsize[8,4;]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
    "label[0,0;Geothermal Generator]"..
    "label[1,3;Power level]"..
    "list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:geothermal", {
    description = "Geothermal Generator",
    tiles = {"technic_geothermal_top.png", "technic_machine_bottom.png", "technic_geothermal_side.png",
        "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=5000;
    burn_time=0;
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "Geothermal Generator")
        meta:set_float("technic_power_machine", 1)
        meta:set_float("internal_EU_buffer", 0)
        meta:set_float("internal_EU_buffer_size", 2000)
        meta:set_string("formspec", geothermal_formspec)
        end,
})
minetest.register_node("technic:geothermal_active", {
    description = "Geothermal Generator",
    tiles = {"technic_geothermal_top_active.png", "technic_machine_bottom.png", "technic_geothermal_side.png",
        "technic_geothermal_side.png", "technic_geothermal_side.png", "technic_geothermal_side.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    drop="technic:geothermal",
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=0;
})
minetest.register_abm({
    nodenames = {"technic:geothermal","technic:geothermal_active"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
    local meta = minetest.env:get_meta(pos)
    local charge= meta:get_float("internal_EU_buffer")
    local max_charge= meta:get_float("internal_EU_buffer_size")
    local water_nodes = 0
    local lava_nodes = 0
    local production_level=0
    local load_step=0
    pos.x=pos.x+1
    local check=check_node_around (pos)
    if check==1 then water_nodes=water_nodes+1 end
    if check==2 then lava_nodes=lava_nodes+1 end
    pos.x=pos.x-2
    check=check_node_around (pos)
    if check==1 then water_nodes=water_nodes+1 end
    if check==2 then lava_nodes=lava_nodes+1 end
    pos.x=pos.x+1
    pos.z=pos.z+1
    check=check_node_around (pos)
    if check==1 then water_nodes=water_nodes+1 end
    if check==2 then lava_nodes=lava_nodes+1 end
    pos.z=pos.z-2
    check=check_node_around (pos)
    if check==1 then water_nodes=water_nodes+1 end
    if check==2 then lava_nodes=lava_nodes+1 end
    pos.z=pos.z+1
    if water_nodes==1 and lava_nodes==1 then production_level=50 load_step=30 end
    if water_nodes==2 and lava_nodes==1 then production_level=75 load_step=45 end
    if water_nodes==1 and lava_nodes==2 then production_level=75 load_step=45 end
    if water_nodes==2 and lava_nodes==2 then production_level=100 load_step=60 end
    if water_nodes==3 and lava_nodes==1 then production_level=25 load_step=15 end
    if water_nodes==1 and lava_nodes==3 then production_level=25 load_step=15 end
        if production_level>0 then
        if charge+load_step>max_charge then
        load_step=max_charge-charge
        end
        if load_step>0 then
        charge=charge+load_step
        meta:set_float("internal_EU_buffer",charge)
        end
    end
    local load = math.floor((charge/max_charge)*100)
    meta:set_string("formspec",
                "invsize[8,4;]"..
                "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
                        (load)..":technic_power_meter_fg.png]"..
                "label[0,0;Geothermal Generator]"..
                "label[1,3;Power level]"..
                "label[4,0;Production at "..tostring(production_level).."%]"
                )
    if production_level>0 and minetest.env:get_node(pos).name=="technic:geothermal" then
        hacky_swap_node (pos,"technic:geothermal_active")
        return
    end
    if production_level==0 then hacky_swap_node (pos,"technic:geothermal") end
end
})
function check_node_around (pos)
local node=minetest.env:get_node(pos)
if node.name=="default:water_source" or node.name=="default:water_flowing"  then return 1 end
if node.name=="default:lava_source" or node.name=="default:lava_flowing"  then return 2 end
return 0
end
technic/gold_chest.lua
New file
@@ -0,0 +1,466 @@
local chest_mark_colors = {
    '_black',
    '_blue',
    '_brown',
    '_cyan',
    '_dark_green',
    '_dark_grey',
    '_green',
    '_grey',
    '_magenta',
    '_orange',
    '_pink',
    '_red',
    '_violet',
    '_white',
    '_yellow',
}
minetest.register_craft({
    output = 'technic:gold_chest 1',
    recipe = {
        {'moreores:gold_ingot','moreores:gold_ingot','moreores:gold_ingot'},
        {'moreores:gold_ingot','technic:silver_chest','moreores:gold_ingot'},
        {'moreores:gold_ingot','moreores:gold_ingot','moreores:gold_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:gold_locked_chest 1',
    recipe = {
        {'moreores:gold_ingot','moreores:gold_ingot','moreores:gold_ingot'},
        {'moreores:gold_ingot','technic:silver_locked_chest','moreores:gold_ingot'},
        {'moreores:gold_ingot','moreores:gold_ingot','moreores:gold_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:gold_locked_chest 1',
    recipe = {
        {'default:steel_ingot'},
        {'technic:gold_chest'},
    }
})
minetest.register_craftitem("technic:gold_chest", {
    description = "Gold Chest",
    stack_max = 99,
})
minetest.register_craftitem("technic:gold_locked_chest", {
    description = "Gold Locked Chest",
    stack_max = 99,
})
gold_chest_formspec    =    "invsize[12,9;]"..
                        "list[current_name;main;0,0;12,4;]"..
                        "list[current_player;main;0,5;8,4;]"
gold_chest_inv_size = 12*4
minetest.register_node("technic:gold_chest", {
    description = "Gold Chest",
    tiles = {"technic_gold_chest_top.png", "technic_gold_chest_top.png", "technic_gold_chest_side.png",
        "technic_gold_chest_side.png", "technic_gold_chest_side.png", "technic_gold_chest_front.png"},
    paramtype2 = "facedir",
    groups = chest_groups1,
    tube = tubes_properties,
    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",gold_chest_formspec)
        meta:set_string("infotext", "Gold Chest")
        local inv = meta:get_inventory()
        inv:set_size("main", gold_chest_inv_size)
    end,
    can_dig = chest_can_dig,
    on_punch = function (pos, node, puncher)
    chest_punched (pos,node,puncher);
    end,
    on_receive_fields = function(pos, formname, fields, sender)
    local meta = minetest.env:get_meta(pos);
    fields.text = fields.text or ""
    meta:set_string("text", fields.text)
    meta:set_string("infotext", '"'..fields.text..'"')
    meta:set_string("formspec",gold_chest_formspec)
    end,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
for i, state in ipairs(chest_mark_colors) do
minetest.register_node("technic:gold_chest".. state, {
    description = "Gold Chest",
    tiles = {"technic_gold_chest_top.png", "technic_gold_chest_top.png", "technic_gold_chest_side.png",
        "technic_gold_chest_side.png", "technic_gold_chest_side.png", "technic_gold_chest_front"..state..".png"},
    paramtype2 = "facedir",
    groups = chest_groups2,
    tube = tubes_properties,
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    drop = "technic:gold_chest",
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",gold_chest_formspec)
        meta:set_string("infotext", "Gold Chest")
        local inv = meta:get_inventory()
        inv:set_size("main", gold_chest_inv_size)
    end,
    can_dig =chest_can_dig,
    on_punch = function (pos, node, puncher)
    chest_punched (pos,node,puncher);
    end,
    on_receive_fields = function(pos, formname, fields, sender)
        local meta = minetest.env:get_meta(pos);
              fields.text = fields.text or ""
        meta:set_string("text", fields.text)
        meta:set_string("infotext", '"'..fields.text..'"')
        meta:set_string("formspec",gold_chest_formspec)
    end,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
end
minetest.register_node("technic:gold_locked_chest", {
    description = "Gold Locked Chest",
    tiles = {"technic_gold_chest_top.png", "technic_gold_chest_top.png", "technic_gold_chest_side.png",
        "technic_gold_chest_side.png", "technic_gold_chest_side.png", "technic_gold_chest_locked.png"},
    paramtype2 = "facedir",
    drop = "technic:gold_locked_chest",
    groups = chest_groups1,
    tube = tubes_properties,
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    after_place_node = function(pos, placer)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("owner", placer:get_player_name() or "")
        meta:set_string("infotext", "Gold Locked Chest (owned by "..
                meta:get_string("owner")..")")
    end,
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",gold_chest_formspec)
        meta:set_string("infotext", "Gold Locked Chest")
        meta:set_string("owner", "")
        local inv = meta:get_inventory()
        inv:set_size("main", gold_chest_inv_size)
    end,
    can_dig =chest_can_dig,
    on_punch = function (pos, node, puncher)
        local meta = minetest.env:get_meta(pos);
        if (has_locked_chest_privilege(meta, puncher)) then
            locked_chest_punched (pos,node,puncher);
        end
    end,
    on_receive_fields = function(pos, formname, fields, sender)
        local meta = minetest.env:get_meta(pos);
        fields.text = fields.text or ""
        meta:set_string("text", fields.text)
        meta:set_string("infotext", '"'..fields.text..'"')
        meta:set_string("formspec",gold_chest_formspec)
    end,
    allow_metadata_inventory_move = def_allow_metadata_inventory_move,
    allow_metadata_inventory_put = def_allow_metadata_inventory_put,
    allow_metadata_inventory_take = def_allow_metadata_inventory_take,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
for i, state in ipairs(chest_mark_colors) do
minetest.register_node("technic:gold_locked_chest".. state, {
    description = "Gold Locked Chest",
    tiles = {"technic_gold_chest_top.png", "technic_gold_chest_top.png", "technic_gold_chest_side.png",
        "technic_gold_chest_side.png", "technic_gold_chest_side.png", "technic_gold_chest_locked"..state..".png"},
    paramtype2 = "facedir",
    drop = "technic:gold_locked_chest",
    groups = chest_groups2,
    tube = tubes_properties,
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    after_place_node = function(pos, placer)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("owner", placer:get_player_name() or "")
        meta:set_string("infotext", "Gold Locked Chest (owned by "..
                meta:get_string("owner")..")")
    end,
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",gold_chest_formspec)
        meta:set_string("infotext", "Gold Locked Chest")
        meta:set_string("owner", "")
        local inv = meta:get_inventory()
        inv:set_size("main", gold_chest_inv_size)
    end,
    can_dig = chest_can_dig,
    on_punch = function (pos, node, puncher)
            local meta = minetest.env:get_meta(pos);
        if (has_locked_chest_privilege(meta, puncher)) then
        locked_chest_punched (pos,node,puncher);
        end
    end,
    on_receive_fields = function(pos, formname, fields, sender)
        local meta = minetest.env:get_meta(pos);
        fields.text = fields.text or ""
        meta:set_string("text", fields.text)
        meta:set_string("infotext", '"'..fields.text..'"')
        meta:set_string("formspec",gold_chest_formspec)
    end,
    allow_metadata_inventory_move = def_allow_metadata_inventory_move,
    allow_metadata_inventory_put = def_allow_metadata_inventory_put,
    allow_metadata_inventory_take = def_allow_metadata_inventory_take,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
end
function chest_punched (pos,node,puncher)
    local player_tool = puncher:get_wielded_item();
    local item=player_tool:get_name();
    if item == "dye:black" then
        if (hacky_swap_node(pos,"technic:gold_chest_black")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:blue" then
        if (hacky_swap_node(pos,"technic:gold_chest_blue")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:brown" then
        if (hacky_swap_node(pos,"technic:gold_chest_brown")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:cyan" then
        if (hacky_swap_node(pos,"technic:gold_chest_cyan")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:dark_green" then
        if (hacky_swap_node(pos,"technic:gold_chest_dark_green")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:dark_grey" then
        if (hacky_swap_node(pos,"technic:gold_chest_dark_grey")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:green" then
        if (hacky_swap_node(pos,"technic:gold_chest_green")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:grey" then
        if (hacky_swap_node(pos,"technic:gold_chest_grey")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:magenta" then
        if (hacky_swap_node(pos,"technic:gold_chest_magenta")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:orange" then
        if (hacky_swap_node(pos,"technic:gold_chest_orange")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:pink" then
        if (hacky_swap_node(pos,"technic:gold_chest_pink")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:red" then
        if (hacky_swap_node(pos,"technic:gold_chest_red")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:violet" then
        if (hacky_swap_node(pos,"technic:gold_chest_violet")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:white" then
        if (hacky_swap_node(pos,"technic:gold_chest_white")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:yellow" then
        if (hacky_swap_node(pos,"technic:gold_chest_yellow")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
        local meta = minetest.env:get_meta(pos);
                meta:set_string("formspec", "hack:sign_text_input")
    end
function locked_chest_punched (pos,node,puncher)
    local player_tool = puncher:get_wielded_item();
    local item=player_tool:get_name();
    if item == "dye:black" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_black")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:blue" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_blue")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:brown" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_brown")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:cyan" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_cyan")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:dark_green" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_dark_green")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:dark_grey" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_dark_grey")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:green" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_green")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:grey" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_grey")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:magenta" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_magenta")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:orange" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_orange")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:pink" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_pink")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:red" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_red")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:violet" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_violet")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:white" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_white")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
    if item == "dye:yellow" then
        if (hacky_swap_node(pos,"technic:gold_locked_chest_yellow")) then
            player_tool:take_item(1);
            puncher:set_wielded_item(player_tool);
            return
           end
        end
        local meta = minetest.env:get_meta(pos);
                meta:set_string("formspec", "hack:sign_text_input")
    end
technic/grinder.lua
New file
@@ -0,0 +1,326 @@
grinder_recipes ={}
registered_grinder_recipes_count=1
function register_grinder_recipe (string1,string2)
grinder_recipes[registered_grinder_recipes_count]={}
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")
register_grinder_recipe("default:cobble","default:gravel")
register_grinder_recipe("default:gravel","default:dirt")
register_grinder_recipe("default:desert_stone","default:desert_sand")
register_grinder_recipe("default:iron_lump","technic:iron_dust 2")
register_grinder_recipe("default:coal_lump","technic:coal_dust 2")
register_grinder_recipe("moreores:copper_lump","technic:copper_dust 2")
register_grinder_recipe("moreores:tin_lump","technic:tin_dust 2")
register_grinder_recipe("moreores:silver_lump","technic:silver_dust 2")
register_grinder_recipe("moreores:gold_lump","technic:gold_dust 2")
register_grinder_recipe("moreores:mithril_lump","technic:mithril_dust 2")
register_grinder_recipe("technic:chromium_lump","technic:chromium_dust 2")
register_grinder_recipe("technic:zinc_lump","technic:zinc_dust 2")
register_grinder_recipe("technic:coal_dust","dye:black 2")
register_grinder_recipe("default:cactus","dye:green 2")
register_grinder_recipe("default:dry_shrub","dye:brown 2")
register_grinder_recipe("flowers:flower_geranium","dye:blue 2")
register_grinder_recipe("flowers:flower_dandelion_white","dye:white 2")
register_grinder_recipe("flowers:flower_dandelion_yellow","dye:yellow 2")
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",
    inventory_image = "technic_coal_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craftitem( "technic:iron_dust", {
    description = "Iron Dust",
    inventory_image = "technic_iron_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "default:steel_ingot",
    recipe = "technic:iron_dust",
})
minetest.register_craftitem( "technic:copper_dust", {
    description = "Copper Dust",
    inventory_image = "technic_copper_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "moreores:copper_ingot",
    recipe = "technic:copper_dust",
})
minetest.register_craftitem( "technic:tin_dust", {
    description = "Tin Dust",
    inventory_image = "technic_tin_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "moreores:tin_ingot",
    recipe = "technic:tin_dust",
})
minetest.register_craftitem( "technic:silver_dust", {
    description = "Silver Dust",
    inventory_image = "technic_silver_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "moreores:silver_ingot",
    recipe = "technic:silver_dust",
})
minetest.register_craftitem( "technic:gold_dust", {
    description = "Gold Dust",
    inventory_image = "technic_gold_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "moreores:gold_ingot",
    recipe = "technic:gold_dust",
})
minetest.register_craftitem( "technic:mithril_dust", {
    description = "Mithril Dust",
    inventory_image = "technic_mithril_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "moreores:mithril_ingot",
    recipe = "technic:mithril_dust",
})
minetest.register_craftitem( "technic:chromium_dust", {
    description = "Chromium Dust",
    inventory_image = "technic_chromium_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "technic:chromium_ingot",
    recipe = "technic:chromium_dust",
})
minetest.register_craftitem( "technic:bronze_dust", {
    description = "Bronze Dust",
    inventory_image = "technic_bronze_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "moreores:bronze_ingot",
    recipe = "technic:bronze_dust",
})
minetest.register_craftitem( "technic:brass_dust", {
    description = "Brass Dust",
    inventory_image = "technic_brass_dust.png",
    on_place_on_ground = minetest.craftitem_place_item,
    })
minetest.register_craft({
    type = "cooking",
    output = "technic:brass_ingot",
    recipe = "technic:brass_dust",
})
minetest.register_craftitem( "technic:stainless_steel_dust", {
    description = "Stainless Steel Dust",
    inventory_image = "technic_stainless_steel_dust.png",
    })
minetest.register_craft({
    type = "cooking",
    output = "technic:stainless_steel_ingot",
    recipe = "technic:stainless_steel_dust",
})
minetest.register_craftitem( "technic:zinc_dust", {
    description = "Zinc Dust",
    inventory_image = "technic_zinc_dust.png",
    })
minetest.register_craft({
    type = "cooking",
    output = "technic:zinc_ingot",
    recipe = "technic:zinc_dust",
})
minetest.register_alias("grinder", "technic:grinder")
minetest.register_craft({
    output = 'technic:grinder',
    recipe = {
        {'default:desert_stone', 'default:desert_stone', 'default:desert_stone'},
        {'default:desert_stone', 'technic:diamond', 'default:desert_stone'},
        {'default:stone', 'moreores:copper_ingot', 'default:stone'},
    }
})
minetest.register_craftitem("technic:grinder", {
    description = "Grinder",
    stack_max = 99,
})
grinder_formspec =
    "invsize[8,9;]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
    "label[0,0;Grinder]"..
    "label[1,3;Power level]"..
    "list[current_name;src;3,1;1,1;]"..
    "list[current_name;dst;5,1;2,2;]"..
    "list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:grinder", {
    description = "Grinder",
    tiles = {"technic_grinder_top.png", "technic_machine_bottom.png", "technic_grinder_side.png",
        "technic_grinder_side.png", "technic_grinder_side.png", "technic_grinder_front.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=5000;
    grind_time=0;
    grinded = nil;
    src_time = 0;
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "Grinder")
        meta:set_float("technic_power_machine", 1)
        meta:set_float("internal_EU_buffer", 0)
        meta:set_float("internal_EU_buffer_size", 5000)
        meta:set_string("formspec", grinder_formspec)
        meta:set_float("grind_time", 0)
        local inv = meta:get_inventory()
        inv:set_size("src", 1)
        inv:set_size("dst", 4)
        end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not inv:is_empty("src") then
            return false
        end
        if not inv:is_empty("dst") then
            return false
        end
        return true
        end,
})
minetest.register_abm({
    nodenames = {"technic:grinder"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
    local meta = minetest.env:get_meta(pos)
    local charge= meta:get_float("internal_EU_buffer")
    local max_charge= meta:get_float("internal_EU_buffer_size")
    local grind_cost=200
    local load = math.floor((charge/max_charge)*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]"..
                "label[0,0;Grinder]"..
                "label[1,3;Power level]"..
                "list[current_name;src;3,1;1,1;]"..
                "list[current_name;dst;5,1;2,2;]"..
                "list[current_player;main;0,5;8,4;]"
                )
        local inv = meta:get_inventory()
--        local grinder_on = meta:get_float("grinder_on")
        local srclist = inv:get_list("src")
        if inv:is_empty("src") then meta:set_float("grinder_on",0) end
        if (meta:get_float("grinder_on") == 1) then
            if charge>=grind_cost then
            charge=charge-grind_cost;
            meta:set_float("internal_EU_buffer",charge)
            meta:set_float("src_time", meta:get_float("src_time") + 1)
            if meta:get_float("src_time") >= meta:get_float("grind_time") then
                -- check if there's room for output in "dst" list
                grinded = get_grinded_item (inv:get_stack("src", 1))
                if inv:room_for_item("dst",grinded) then
                    -- Put result in "dst" list
                    inv:add_item("dst", grinded)
                    -- take stuff from "src" list
                    srcstack = inv:get_stack("src", 1)
                    srcstack:take_item()
                    inv:set_stack("src", 1, srcstack)
                    if inv:is_empty("src") then meta:set_float("grinder_on",0) end
                else
                    print("Grinder inventory full!")
                end
                meta:set_float("src_time", 0)
            end
            end
        end
        if (meta:get_float("grinder_on")==0) then
        local grinded=nil
        if not inv:is_empty("src") then
         grinded = get_grinded_item (inv:get_stack("src", 1))
         if grinded then meta:set_float("grinder_on",1) end
         grind_time=4
         meta:set_float("grind_time",grind_time)
         meta:set_float("src_time", 0)
         return
        end
        end
    end
})
function get_grinded_item (items)
new_item =nil
src_item=items:to_table()
item_name=src_item["name"]
local counter=registered_grinder_recipes_count-1
for i=1, counter,1 do
if    grinder_recipes[i].src_name==item_name then return ItemStack(grinder_recipes[i].dst_name) end
end
return nil
end
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/init.lua
New file
@@ -0,0 +1,82 @@
-- Minetest 0.4.4 : technic
modpath=minetest.get_modpath("technic")
--Read technic config file
dofile(modpath.."/config.lua")
-- world gen
dofile(modpath.."/ores.lua")
if enable_rubber_tree_generation==true then dofile(modpath.."/rubber.lua") end
-- chests
dofile(modpath.."/chest_commons.lua")
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")
--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.."/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_drill==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
        return false
    end
    return true
end
function hacky_swap_node(pos,name)
    local node = minetest.env:get_node(pos)
    local meta = minetest.env:get_meta(pos)
    local meta0 = meta:to_table()
    if node.name == name then
        return nil
    end
    node.name = name
    local meta0 = meta:to_table()
    minetest.env:set_node(pos,node)
    meta = minetest.env:get_meta(pos)
    meta:from_table(meta0)
    return 1
end
technic/injector.lua
New file
@@ -0,0 +1,325 @@
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)
            pos1=pos
            pos1.y=pos1.y
            local x=pos1.x+1.5
            local z=pos1.z
            item1=tube_item({x=pos1.x,y=pos1.y,z=pos1.z},stack)
            item1:get_luaentity().start_pos = {x=pos1.x,y=pos1.y,z=pos1.z}
            item1:setvelocity({x=1, y=0, z=0})
            item1:setacceleration({x=0, y=0, z=0})
            return
            end
    end
end,
})
function tube_item(pos, item)
        local TUBE_nodes = {}
        local CHEST_nodes = {}
         TUBE_nodes[1]={}
         TUBE_nodes[1].x=pos.x
        TUBE_nodes[1].y=pos.y
        TUBE_nodes[1].z=pos.z
table_index=1
    repeat
    check_TUBE_node (TUBE_nodes,CHEST_nodes,table_index)
    table_index=table_index+1
    if TUBE_nodes[table_index]==nil then break end
    until false
found=table_index-1
print("Found "..found.." tubes connected")
print(dump(CHEST_nodes))
    -- 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())
    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={},
        route={}
    },
    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)
--        print (dump(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 stack = ItemStack(self.itemstring)
    local drop_pos=nil
    local velocity=self.object:getvelocity()
    if velocity==nil then print ("wypadl") 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
            if check_next_step (self.start_pos, velocity)==0 then
                drop_pos=minetest.env:find_node_near({x=self.start_pos.x,y=self.start_pos.y,z=self.start_pos.z+velocity.x}, 1, "air")
                if drop_pos then minetest.item_drop(stack, "", drop_pos) end
                self.object:remove()
                end
            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
            if check_next_step (self.start_pos, velocity)==0 then
                drop_pos=minetest.env:find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air")
                if drop_pos then minetest.item_drop(stack, "", drop_pos) end
                self.object:remove()
                end
            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
            if check_next_step (self.start_pos, velocity)==0 then
                drop_pos=minetest.env:find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air")
                if drop_pos then minetest.item_drop(stack, "", drop_pos) end
                self.object:remove()
                end
            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 1 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 1 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 1 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 1 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 1 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 1 end
end
print ("spadl")
return 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
function add_new_TUBE_node (TUBE_nodes,pos1,parent)
local i=1
    repeat
        if TUBE_nodes[i]==nil then break end
        if pos1.x==TUBE_nodes[i].x and pos1.y==TUBE_nodes[i].y and pos1.z==TUBE_nodes[i].z then return false end
        i=i+1
    until false
TUBE_nodes[i]={}
TUBE_nodes[i].x=pos1.x
TUBE_nodes[i].y=pos1.y
TUBE_nodes[i].z=pos1.z
TUBE_nodes[i].parent_x=parent.x
TUBE_nodes[i].parent_y=parent.y
TUBE_nodes[i].parent_z=parent.z
return true
end
function check_TUBE_node (TUBE_nodes,CHEST_nodes,i)
        local pos1={}
        local parent={}
        pos1.x=TUBE_nodes[i].x
        pos1.y=TUBE_nodes[i].y
        pos1.z=TUBE_nodes[i].z
        parent.x=pos1.x
        parent.y=pos1.y
        parent.z=pos1.z
        new_node_added=false
        pos1.x=pos1.x+1
        check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
        pos1.x=pos1.x-2
        check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
        pos1.x=pos1.x+1
        pos1.y=pos1.y+1
        check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
        pos1.y=pos1.y-2
        check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
        pos1.y=pos1.y+1
        pos1.z=pos1.z+1
        check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
        pos1.z=pos1.z-2
        check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
        pos1.z=pos1.z+1
return new_node_added
end
function check_TUBE_node_subp (TUBE_nodes,CHEST_nodes,pos1,parent)
meta = minetest.env:get_meta(pos1)
if meta:get_float("tubelike")==1 then add_new_TUBE_node(TUBE_nodes,pos1,parent) return end
nctr = minetest.env:get_node(pos1)
if minetest.get_item_group(nctr.name, "tubedevice_receiver") == 1 then add_new_TUBE_node(CHEST_nodes,pos1,parent) return end
end
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/iron_chest.lua
New file
@@ -0,0 +1,97 @@
minetest.register_craft({
    output = 'technic:iron_chest 1',
    recipe = {
        {'default:steel_ingot','default:steel_ingot','default:steel_ingot'},
        {'default:steel_ingot','default:chest','default:steel_ingot'},
        {'default:steel_ingot','default:steel_ingot','default:steel_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:iron_locked_chest 1',
    recipe = {
        {'default:steel_ingot','default:steel_ingot','default:steel_ingot'},
        {'default:steel_ingot','default:chest_locked','default:steel_ingot'},
        {'default:steel_ingot','default:steel_ingot','default:steel_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:iron_locked_chest 1',
    recipe = {
        {'default:steel_ingot'},
        {'technic:iron_chest'},
    }
})
minetest.register_craftitem("technic:iron_chest", {
    description = "Iron Chest",
    stack_max = 99,
})
minetest.register_craftitem("technic:iron_locked_chest", {
    description = "Iron Locked Chest",
    stack_max = 99,
})
minetest.register_alias("blabla", "technic:iron_chest")
minetest.register_node("technic:iron_chest", {
    description = "Iron Chest",
    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 = chest_groups1,
    tube = tubes_properties,
    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,0;9,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Iron Chest")
        local inv = meta:get_inventory()
        inv:set_size("main", 9*4)
    end,
    can_dig = chest_can_dig,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
minetest.register_node("technic:iron_locked_chest", {
    description = "Iron Locked Chest",
    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_locked.png"},
    paramtype2 = "facedir",
    groups = chest_groups1,
    tube = tubes_properties,
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    after_place_node = function(pos, placer)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("owner", placer:get_player_name() or "")
        meta:set_string("infotext", "Locked Iron Chest (owned by "..
                meta:get_string("owner")..")")
    end,
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",
                "invsize[9,9;]"..
                "list[current_name;main;0,0;9,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Iron Locked Chest")
        meta:set_string("owner", "")
        local inv = meta:get_inventory()
        inv:set_size("main", 9*4)
    end,
    can_dig = chest_can_dig,
    allow_metadata_inventory_move = def_allow_metadata_inventory_move,
    allow_metadata_inventory_put = def_allow_metadata_inventory_put,
    allow_metadata_inventory_take = def_allow_metadata_inventory_take,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
technic/item_drop.lua
New file
@@ -0,0 +1,100 @@
-- This part written by PilzAdam (item_drop mod)
minetest.register_globalstep(function(dtime)
    for _,player in ipairs(minetest.get_connected_players()) do
        local pos = player:getpos()
        pos.y = pos.y+0.5
        local inv = player:get_inventory()
        for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do
            if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
                if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
                    inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
                    if object:get_luaentity().itemstring ~= "" then
                        minetest.sound_play("item_drop_pickup", {
                            to_player = player:get_player_name(),
                        })
                    end
                    object:get_luaentity().itemstring = ""
                    object:remove()
                end
            end
        end
        for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 2)) do
            if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
                if object:get_luaentity().collect then
                    if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
                        local pos1 = pos
                        pos1.y = pos1.y+0.2
                        local pos2 = object:getpos()
                        local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z}
                        vec.x = vec.x*3
                        vec.y = vec.y*3
                        vec.z = vec.z*3
                        object:setvelocity(vec)
                        minetest.after(1, function(args)
                            local lua = object:get_luaentity()
                            if object == nil or lua == nil or lua.itemstring == nil then
                                return
                            end
                            if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
                                inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
                                if object:get_luaentity().itemstring ~= "" then
                                    minetest.sound_play("item_drop_pickup", {
                                        to_player = player:get_player_name(),
                                    })
                                end
                                object:get_luaentity().itemstring = ""
                                object:remove()
                            else
                                object:setvelocity({x=0,y=0,z=0})
                            end
                        end, {player, object})
                    end
                end
            end
        end
    end
end)
function minetest.handle_node_drops(pos, drops, digger)
    for _,item in ipairs(drops) do
        local count, name
        if type(item) == "string" then
            count = 1
            name = item
        else
            count = item:get_count()
            name = item:get_name()
        end
        for i=1,count do
            local obj = minetest.env:add_item(pos, name)
            if obj ~= nil then
                obj:get_luaentity().collect = true
                local x = math.random(1, 5)
                if math.random(1,2) == 1 then
                    x = -x
                end
                local z = math.random(1, 5)
                if math.random(1,2) == 1 then
                    z = -z
                end
                obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z})
                -- FIXME this doesnt work for deactiveted objects
                if minetest.setting_get("remove_items") and tonumber(minetest.setting_get("remove_items")) then
                    minetest.after(tonumber(minetest.setting_get("remove_items")), function(obj)
                        obj:remove()
                    end, obj)
                end
            end
        end
    end
end
if minetest.setting_get("log_mods") then
    minetest.log("action", "item_drop loaded")
end
technic/item_pickup.lua
New file
@@ -0,0 +1,63 @@
minetest.register_globalstep(function(dtime)
    for _,player in ipairs(minetest.get_connected_players()) do
        local pos = player:getpos()
        pos.y = pos.y+0.5
        local inv = player:get_inventory()
        for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do
            if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
                if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
                    inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
                    if object:get_luaentity().itemstring ~= "" then
                        minetest.sound_play("item_drop_pickup", {
                            to_player = player:get_player_name(),
                        })
                    end
                    object:get_luaentity().itemstring = ""
                    object:remove()
                end
            end
        end
        for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 2)) do
            if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
                if object:get_luaentity().collect then
                    if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
                        local pos1 = pos
                        pos1.y = pos1.y+0.2
                        local pos2 = object:getpos()
                        local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z}
                        vec.x = vec.x*3
                        vec.y = vec.y*3
                        vec.z = vec.z*3
                        object:setvelocity(vec)
                        minetest.after(1, function(args)
                            local lua = object:get_luaentity()
                            if object == nil or lua == nil or lua.itemstring == nil then
                                return
                            end
                            if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
                                inv:add_item("main", ItemStack(object:get_luaentity().itemstring))
                                if object:get_luaentity().itemstring ~= "" then
                                    minetest.sound_play("item_drop_pickup", {
                                        to_player = player:get_player_name(),
                                    })
                                end
                                object:get_luaentity().itemstring = ""
                                object:remove()
                            else
                                object:setvelocity({x=0,y=0,z=0})
                            end
                        end, {player, object})
                    end
                else
                    minetest.after(0.5, function(entity)
                        entity.collect = true
                    end, object:get_luaentity())
                end
            end
        end
    end
end)
technic/items.lua
New file
@@ -0,0 +1,157 @@
minetest.register_craftitem( "technic:silicon_wafer", {
    description = "Silicon Wafer",
    inventory_image = "technic_silicon_wafer.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craftitem( "technic:doped_silicon_wafer", {
    description = "Doped Silicon Wafer",
    inventory_image = "technic_doped_silicon_wafer.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
    output = 'pipeworks:tube_000000 9',
    recipe = {
        {'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'},
        {'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'},
        {'technic:stainless_steel_ingot', 'default:glass', 'technic:stainless_steel_ingot'},
    }
})
minetest.register_craftitem( "technic:diamond_drill_head", {
    description = "Diamond Drill Head",
    inventory_image = "technic_diamond_drill_head.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
    output = 'technic:diamond_drill_head',
    recipe = {
        {'technic:stainless_steel_ingot', 'technic:diamond', 'technic:stainless_steel_ingot'},
        {'technic:diamond', '', 'technic:diamond'},
        {'technic:stainless_steel_ingot', 'technic:diamond', 'technic:stainless_steel_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:diamond_block',
    recipe = {
        {'technic:diamond', 'technic:diamond', 'technic:diamond'},
        {'technic:diamond', 'technic:diamond', 'technic:diamond'},
        {'technic:diamond', 'technic:diamond', 'technic:diamond'},
    }
})
minetest.register_node( "technic:diamond_block", {
    description = "Diamond Block",
    tiles = { "technic_diamond_block.png" },
    is_ground_content = true,
    groups = {cracky=3},
    sounds = default.node_sound_stone_defaults(),
    drop = 'craft "technic:diamond_block" 1',
})
minetest.register_craft({
    output = 'technic:green_energy_crystal',
    recipe = {
        {'moreores:gold_ingot', 'technic:battery', 'dye:green'},
        {'technic:battery', 'technic:red_energy_crystal', 'technic:battery'},
        {'dye:green', 'technic:battery', 'moreores:gold_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:blue_energy_crystal',
    recipe = {
        {'moreores:gold_ingot', 'technic:battery', 'dye:blue'},
        {'technic:battery', 'technic:green_energy_crystal', 'technic:battery'},
        {'dye:blue', 'technic:battery', 'moreores:gold_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:red_energy_crystal',
    recipe = {
        {'moreores:gold_ingot', 'technic:battery', 'dye:red'},
        {'technic:battery', 'technic:diamond_block', 'technic:battery'},
        {'dye:red', 'technic:battery', 'moreores:gold_ingot'},
    }
})
minetest.register_tool("technic:blue_energy_crystal",
{description = "Blue Energy Crystal",
inventory_image = minetest.inventorycube("technic_diamond_block_blue.png", "technic_diamond_block_blue.png", "technic_diamond_block_blue.png"),
tool_capabilities = {load=0,max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_tool("technic:green_energy_crystal",
{description = "Green Energy Crystal",
inventory_image = minetest.inventorycube("technic_diamond_block_green.png", "technic_diamond_block_green.png", "technic_diamond_block_green.png"),
tool_capabilities = {load=0,max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_tool("technic:red_energy_crystal",
{description = "Red Energy Crystal",
inventory_image = minetest.inventorycube("technic_diamond_block_red.png", "technic_diamond_block_red.png", "technic_diamond_block_red.png"),
tool_capabilities = {load=0,max_drop_level=0, groupcaps={fleshy={times={}, uses=10000, maxlevel=0}}}})
minetest.register_craftitem( "technic:fine_copper_wire", {
    description = "Fine Copper Wire",
    inventory_image = "technic_fine_copper_wire.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
    output = 'technic:fine_copper_wire 2',
    recipe = {
        {'', 'moreores:copper_ingot', ''},
        {'', 'moreores:copper_ingot', ''},
        {'', 'moreores:copper_ingot', ''},
    }
})
minetest.register_craftitem( "technic:copper_coil", {
    description = "Copper Coil",
    inventory_image = "technic_copper_coil.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
    output = 'technic:copper_coil 1',
    recipe = {
        {'technic:fine_copper_wire', 'default:steel_ingot', 'technic:fine_copper_wire'},
        {'default:steel_ingot', '', 'default:steel_ingot'},
        {'technic:fine_copper_wire', 'default:steel_ingot', 'technic:fine_copper_wire'},
    }
})
minetest.register_craftitem( "technic:motor", {
    description = "Electric Motor",
    inventory_image = "technic_motor.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
    output = 'technic:motor',
    recipe = {
        {'default:steel_ingot', 'technic:copper_coil', 'default:steel_ingot'},
        {'default:steel_ingot', 'technic:copper_coil', 'default:steel_ingot'},
        {'default:steel_ingot', 'moreores:copper_ingot', 'default:steel_ingot'},
    }
})
minetest.register_craftitem( "technic:mv_transformer", {
    description = "Medium Voltage Transformer",
    inventory_image = "technic_mv_transformer.png",
    on_place_on_ground = minetest.craftitem_place_item,
})
minetest.register_craft({
    output = 'technic:mv_transformer',
    recipe = {
        {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
        {'technic:copper_coil', 'default:steel_ingot', 'technic:copper_coil'},
        {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
    }
})
technic/mining_drill.lua
New file
@@ -0,0 +1,49 @@
mining_drill_max_charge=60000
minetest.register_tool("technic:mining_drill", {
    description = "Mining Drill",
    inventory_image = "technic_mining_drill.png",
    stack_max = 1,
    on_use = function(itemstack, user, pointed_thing)
        if pointed_thing.type=="node" then
        item=itemstack:to_table()
        if item["metadata"]=="" or item["metadata"]=="0" then return end --tool not charged
        charge=tonumber(item["metadata"])
        if charge-200>0 then
         drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user)
         charge =charge-200;
        item["metadata"]=tostring(charge)
        set_RE_wear(item,charge,mining_drill_max_charge)
        itemstack:replace(item)
        end
        return itemstack
        end
    end,
})
minetest.register_craft({
    output = 'technic:mining_drill',
    recipe = {
        {'technic:stainless_steel_ingot', 'technic:diamond_drill_head', 'technic:stainless_steel_ingot'},
        {'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'},
        {'', 'technic:red_energy_crystal', 'moreores:copper_ingot'},
    }
})
function drill_dig_it (pos, player)
    local node=minetest.env:get_node(pos)
    if node.name == "air" or node.name == "ignore" then return end
    if node.name == "default:lava_source" then return end
    if node.name == "default:lava_flowing" then return end
    if node.name == "default:water_source" then minetest.env:remove_node(pos) return end
    if node.name == "default:water_flowing" then minetest.env:remove_node(pos) return end
    minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
    minetest.node_dig(pos,node,player)
end
technic/mining_laser_mk1.lua
New file
@@ -0,0 +1,174 @@
laser_mk1_max_charge=40000
local laser_shoot = function(itemstack, player, pointed_thing)
                local laser_straight_mode=0
                local playerpos=player:getpos()
                local dir=player:get_look_dir()
                if pointed_thing.type=="node" then
                    pos=minetest.get_pointed_thing_position(pointed_thing, above)
                    local node = minetest.env:get_node(pos)
                    if node.name~="ignore" then
                    minetest.node_dig(pos,node,player)
                    end
                    laser_straight_mode=1
                    end
                direction_y=math.abs(math.floor(dir.y*100))
                if direction_y>50 then entity_name="technic:laser_beam_entityV"
                    else entity_name="technic:laser_beam_entity" end
                if laser_straight_mode==1  then
                    pos1=minetest.get_pointed_thing_position(pointed_thing, under)
                    pos1.x=math.floor(pos1.x)
                    pos1.y=math.floor(pos1.y)
                    pos1.z=math.floor(pos1.z)
                    obj=minetest.env:add_entity(pos1,entity_name)
                else
                obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.6,z=playerpos.z},entity_name)
                end
                if obj:get_luaentity().player == nil then
                    obj:get_luaentity().player = player
                end
                if laser_straight_mode==1 and direction_y<50 then
                    obj:setvelocity({x=dir.x*8, y=0, z=dir.z*8})
                else if laser_straight_mode==1 and direction_y>50 then
                    obj:setvelocity({x=0, y=dir.y*8, z=dir.z*8})
                    end
                end
                if laser_straight_mode==0 then
                    obj:setvelocity({x=dir.x*8, y=dir.y*8, z=dir.z*8})
                    end
                obj:setacceleration({x=0, y=0, z=0})
                obj:setyaw(player:get_look_yaw()+math.pi)
                if obj:get_luaentity().player == nil then
                    obj:get_luaentity().player = player
                end
                --obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name()
                minetest.sound_play("technic_laser", {pos = playerpos, gain = 1.0, max_hear_distance = 10,})
                return true
end
minetest.register_tool("technic:laser_mk1", {
    description = "Mining Laser MK1",
    inventory_image = "technic_mining_laser_mk1.png",
    stack_max = 1,
    on_use = function(itemstack, user, pointed_thing)
        item=itemstack:to_table()
        if item["metadata"]=="" or item["metadata"]=="0" then  return end
        local charge=tonumber((item["metadata"]))
        if charge-400>0 then
         laser_shoot(item, user, pointed_thing)
         charge =charge-400;
        item["metadata"]=tostring(charge)
        charge=set_RE_wear(item,charge,laser_mk1_max_charge)
        itemstack:replace(item)
        end
        return itemstack
    end,
})
minetest.register_craft({
    output = 'technic:laser_mk1',
    recipe = {
        {'technic:diamond', 'default:steel_ingot', 'technic:battery'},
        {'', 'default:steel_ingot', 'technic:battery'},
        {'', '', 'moreores:copper_ingot'},
    }
})
minetest.register_node("technic:laser_beam_box", {
    drawtype = "nodebox",
    node_box = {
        type = "fixed",
        fixed = {
            { -0.5 , -0.1, -0.1 ,  0.1 ,  0.1 , 0.1  },
            { -0.1 , -0.1 , -0.1 , 0.5, 0.1 , 0.1  },
        }
    },
    tiles = {"technic_laser_beam.png"},
    groups = {not_in_creative_inventory=1},
})
minetest.register_node("technic:laser_beam_boxV", {
    drawtype = "nodebox",
    node_box = {
        type = "fixed",
        fixed = {
            { -0.1 , -0.1 , -0.1 , 0.1 , 0.5, 0.1  },
            { -0.1 , -0.5, -0.1 ,  0.1 ,  0.1 , 0.1  },
        }
    },
    tiles = {"technic_laser_beam.png"},
    groups = {not_in_creative_inventory=1},
})
LASER_BEAM_ENTITY={
    physical = false,
    timer=0,
    visual = "wielditem",
    visual_size = {x=0.2, y=0.2},
    textures = {"technic:laser_beam_box"},
    lastpos={},
    max_range=10,
    count=0,
--    digger=nil,
    collisionbox = {0,0,0,0,0,0},
}
LASER_BEAM_ENTITY.on_step = function(self, dtime)
    self.timer=self.timer+dtime
    local pos = self.object:getpos()
    if self.player~=nil then if self.lastpos.x~=nil then lazer_it (pos, self.player) end end
    if self.lastpos.x ~=nil and self.lastpos.y ~=nil and self.lastpos.y ~=nil then
            temp1={x=math.floor(self.lastpos.x),y=math.floor(self.lastpos.y),z=math.floor(self.lastpos.z)}
            temp2={x=math.floor(pos.x),y=math.floor(pos.y),z=math.floor(pos.z)}
            if temp1.x==temp2.x and temp1.y==temp2.y and temp1.z==temp2.z then return end
            end
    self.lastpos={x=pos.x, y=pos.y, z=pos.z}
    self.count=self.count+1
    if self.count==self.max_range then self.object:remove() end
end
LASER_BEAM_ENTITYV={
    physical = false,
    timer=0,
    visual = "wielditem",
    visual_size = {x=0.2, y=0.2},
    textures = {"technic:laser_beam_boxV"},
    lastpos={},
    max_range=15,
    count=0,
    collisionbox = {0,0,0,0,0,0},
}
LASER_BEAM_ENTITYV.on_step = function(self, dtime)
    self.timer=self.timer+dtime
    local pos = self.object:getpos()
    if self.player~=nil then if self.lastpos.x~=nil then lazer_it (pos, self.player) end end
    if self.lastpos.x ~=nil and self.lastpos.y ~=nil and self.lastpos.y ~=nil then
            temp1={x=math.floor(self.lastpos.x),y=math.floor(self.lastpos.y),z=math.floor(self.lastpos.z)}
            temp2={x=math.floor(pos.x),y=math.floor(pos.y),z=math.floor(pos.z)}
            if temp1.x==temp2.x and temp1.y==temp2.y and temp1.z==temp2.z then return end
            end
    self.lastpos={x=pos.x, y=pos.y, z=pos.z}
    self.count=self.count+1
    if self.count==self.max_range then self.object:remove() end
end
minetest.register_entity("technic:laser_beam_entity", LASER_BEAM_ENTITY)
minetest.register_entity("technic:laser_beam_entityV", LASER_BEAM_ENTITYV)
function lazer_it (pos, player)
    local pos1={}
--    pos1.x=math.floor(pos.x)
--    pos1.y=math.floor(pos.y)
--    pos1.z=math.floor(pos.z)
    local node = minetest.env:get_node(pos)
    if node.name == "air" or node.name == "ignore" or node.name == "default:lava_source" or node.name == "default:lava_flowing" then return end
    if node.name == "default:water_source" or node.name == "default:water_flowing" then minetest.env:remove_node(pos) return end
    if player then minetest.node_dig(pos,node,player) end
end
technic/mithril_chest.lua
New file
@@ -0,0 +1,145 @@
minetest.register_craft({
    output = 'technic:mithril_chest 1',
    recipe = {
        {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
        {'moreores:mithril_ingot','technic:gold_chest','moreores:mithril_ingot'},
        {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:mithril_locked_chest 1',
    recipe = {
        {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
        {'moreores:mithril_ingot','technic:gold_locked_chest','moreores:mithril_ingot'},
        {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:mithril_locked_chest 1',
    recipe = {
        {'default:steel_ingot'},
        {'technic:mithril_chest'},
    }
})
minetest.register_node("technic:mithril_chest", {
    description = "Mithril Chest",
    tiles = {"technic_mithril_chest_top.png", "technic_mithril_chest_top.png", "technic_mithril_chest_side.png",
        "technic_mithril_chest_side.png", "technic_mithril_chest_side.png", "technic_mithril_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[13,9;]"..
                "list[current_name;main;0,0;13,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Mithril Chest")
        local inv = meta:get_inventory()
        inv:set_size("main", 13*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_metadata_inventory_move = function(pos, from_list, from_index,
            to_list, to_index, count, player)
        minetest.log("action", player:get_player_name()..
                " moves stuff in chest at "..minetest.pos_to_string(pos))
        return minetest.node_metadata_inventory_move_allow_all(
                pos, from_list, from_index, to_list, to_index, count, player)
    end,
    on_metadata_inventory_offer = function(pos, listname, index, stack, player)
        minetest.log("action", player:get_player_name()..
                " moves stuff to chest at "..minetest.pos_to_string(pos))
        return minetest.node_metadata_inventory_offer_allow_all(
                pos, listname, index, stack, player)
    end,
    on_metadata_inventory_take = function(pos, listname, index, stack, player)
        minetest.log("action", player:get_player_name()..
                " takes stuff from chest at "..minetest.pos_to_string(pos))
    end,
})
minetest.register_node("technic:mithril_locked_chest", {
    description = "Mithril Locked Chest",
    tiles = {"technic_mithril_chest_top.png", "technic_mithril_chest_top.png", "technic_mithril_chest_side.png",
        "technic_mithril_chest_side.png", "technic_mithril_chest_side.png", "technic_mithril_chest_locked.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    after_place_node = function(pos, placer)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("owner", placer:get_player_name() or "")
        meta:set_string("infotext", "Mithril Locked Chest (owned by "..
                meta:get_string("owner")..")")
    end,
on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",
                "invsize[13,9;]"..
                "list[current_name;main;0,0;13,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Mithril Locked Chest")
        meta:set_string("owner", "")
        local inv = meta:get_inventory()
        inv:set_size("main", 13*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,
    allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
        local meta = minetest.env:get_meta(pos)
        if not has_locked_chest_privilege(meta, player) then
            minetest.log("action", player:get_player_name()..
                    " tried to access a locked chest belonging to "..
                    meta:get_string("owner").." at "..
                    minetest.pos_to_string(pos))
            return 0
        end
        return count
    end,
    allow_metadata_inventory_put = function(pos, listname, index, stack, player)
        local meta = minetest.env:get_meta(pos)
        if not has_locked_chest_privilege(meta, player) then
            minetest.log("action", player:get_player_name()..
                    " tried to access a locked chest belonging to "..
                    meta:get_string("owner").." at "..
                    minetest.pos_to_string(pos))
            return 0
        end
        return stack:get_count()
    end,
    allow_metadata_inventory_take = function(pos, listname, index, stack, player)
        local meta = minetest.env:get_meta(pos)
        if not has_locked_chest_privilege(meta, player) then
            minetest.log("action", player:get_player_name()..
                    " tried to access a locked chest belonging to "..
                    meta:get_string("owner").." at "..
                    minetest.pos_to_string(pos))
            return 0
        end
        return stack:get_count()
    end,
    on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
        minetest.log("action", player:get_player_name()..
                " moves stuff in locked chest at "..minetest.pos_to_string(pos))
    end,
    on_metadata_inventory_put = function(pos, listname, index, stack, player)
        minetest.log("action", player:get_player_name()..
                " moves stuff to locked chest at "..minetest.pos_to_string(pos))
    end,
    on_metadata_inventory_take = function(pos, listname, index, stack, player)
        minetest.log("action", player:get_player_name()..
                " takes stuff from locked chest at "..minetest.pos_to_string(pos))
    end,
})
technic/mithril_subspace_chest.lua
New file
@@ -0,0 +1,145 @@
minetest.register_craft({
    output = 'technic:mithril_chest 1',
    recipe = {
        {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
        {'moreores:mithril_ingot','technic:gold_chest','moreores:mithril_ingot'},
        {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:mithril_locked_chest 1',
    recipe = {
        {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
        {'moreores:mithril_ingot','technic:gold_locked_chest','moreores:mithril_ingot'},
        {'moreores:mithril_ingot','moreores:mithril_ingot','moreores:mithril_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:mithril_locked_chest 1',
    recipe = {
        {'default:steel_ingot'},
        {'technic:mithril_chest'},
    }
})
minetest.register_node("technic:mithril_chest", {
    description = "Mithril Chest",
    tiles = {"technic_mithril_chest_top.png", "technic_mithril_chest_top.png", "technic_mithril_chest_side.png",
        "technic_mithril_chest_side.png", "technic_mithril_chest_side.png", "technic_mithril_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[13,9;]"..
                "list[current_name;main;0,0;13,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Mithril Chest")
        local inv = meta:get_inventory()
        inv:set_size("main", 13*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_metadata_inventory_move = function(pos, from_list, from_index,
            to_list, to_index, count, player)
        minetest.log("action", player:get_player_name()..
                " moves stuff in chest at "..minetest.pos_to_string(pos))
        return minetest.node_metadata_inventory_move_allow_all(
                pos, from_list, from_index, to_list, to_index, count, player)
    end,
    on_metadata_inventory_offer = function(pos, listname, index, stack, player)
        minetest.log("action", player:get_player_name()..
                " moves stuff to chest at "..minetest.pos_to_string(pos))
        return minetest.node_metadata_inventory_offer_allow_all(
                pos, listname, index, stack, player)
    end,
    on_metadata_inventory_take = function(pos, listname, index, stack, player)
        minetest.log("action", player:get_player_name()..
                " takes stuff from chest at "..minetest.pos_to_string(pos))
    end,
})
minetest.register_node("technic:mithril_locked_chest", {
    description = "Mithril Locked Chest",
    tiles = {"technic_mithril_chest_top.png", "technic_mithril_chest_top.png", "technic_mithril_chest_side.png",
        "technic_mithril_chest_side.png", "technic_mithril_chest_side.png", "technic_mithril_chest_locked.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    after_place_node = function(pos, placer)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("owner", placer:get_player_name() or "")
        meta:set_string("infotext", "Mithril Locked Chest (owned by "..
                meta:get_string("owner")..")")
    end,
on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",
                "invsize[13,9;]"..
                "list[current_name;main;0,0;13,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Mithril Locked Chest")
        meta:set_string("owner", "")
        local inv = meta:get_inventory()
        inv:set_size("main", 13*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,
    allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
        local meta = minetest.env:get_meta(pos)
        if not has_locked_chest_privilege(meta, player) then
            minetest.log("action", player:get_player_name()..
                    " tried to access a locked chest belonging to "..
                    meta:get_string("owner").." at "..
                    minetest.pos_to_string(pos))
            return 0
        end
        return count
    end,
    allow_metadata_inventory_put = function(pos, listname, index, stack, player)
        local meta = minetest.env:get_meta(pos)
        if not has_locked_chest_privilege(meta, player) then
            minetest.log("action", player:get_player_name()..
                    " tried to access a locked chest belonging to "..
                    meta:get_string("owner").." at "..
                    minetest.pos_to_string(pos))
            return 0
        end
        return stack:get_count()
    end,
    allow_metadata_inventory_take = function(pos, listname, index, stack, player)
        local meta = minetest.env:get_meta(pos)
        if not has_locked_chest_privilege(meta, player) then
            minetest.log("action", player:get_player_name()..
                    " tried to access a locked chest belonging to "..
                    meta:get_string("owner").." at "..
                    minetest.pos_to_string(pos))
            return 0
        end
        return stack:get_count()
    end,
    on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
        minetest.log("action", player:get_player_name()..
                " moves stuff in locked chest at "..minetest.pos_to_string(pos))
    end,
    on_metadata_inventory_put = function(pos, listname, index, stack, player)
        minetest.log("action", player:get_player_name()..
                " moves stuff to locked chest at "..minetest.pos_to_string(pos))
    end,
    on_metadata_inventory_take = function(pos, listname, index, stack, player)
        minetest.log("action", player:get_player_name()..
                " takes stuff from locked chest at "..minetest.pos_to_string(pos))
    end,
})
technic/music_player.lua
New file
@@ -0,0 +1,126 @@
minetest.register_alias("music_player", "technic:music_player")
minetest.register_craft({
    output = 'technic:music_player',
    recipe = {
        {'default:wood', 'default:wood', 'default:wood'},
        {'technic:diamond', 'technic:diamond', 'technic:diamond'},
        {'default:stone', 'moreores:copper_ingot', 'default:stone'},
    }
})
minetest.register_craftitem("technic:music_player", {
    description = "Music Player",
    stack_max = 99,
})
music_player_formspec =
    "invsize[8,9;]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
    "label[0,0;Music Player]"..
    "label[1,3;Power level]"..
    "button[5,2;1,1;track1;1]"..
    "button[6,2;1,1;track2;2]"
minetest.register_node("technic:music_player", {
    description = "Music Player",
    tiles = {"technic_music_player_top.png", "technic_machine_bottom.png", "technic_music_player_side.png",
        "technic_music_player_side.png", "technic_music_player_side.png", "technic_music_player_side.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    internal_EU_buffer=0,
    internal_EU_buffer_size=5000,
    music_player_on=0,
    music_playing =0,
    music_handle = 0,
    music_player_current_track =1,
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "Music Player")
        meta:set_float("technic_power_machine", 1)
        meta:set_float("internal_EU_buffer", 1)
        meta:set_float("internal_EU_buffer_size", 5000)
        meta:set_string("formspec", music_player_formspec)
        meta:set_float("music_player_on", 0)
        meta:set_float("music_player_current_track", 1)
        end,
    on_receive_fields = function(pos, formanme, fields, sender)
    local meta = minetest.env:get_meta(pos)
    player_on=meta:get_float("music_player_on")
    music_handle=meta:get_float("music_handle")
    music_player_current_track=meta:get_float("music_player_current_track")
    if fields.track1 then music_player_current_track=1 end
    if fields.track2 then music_player_current_track=2 end
    if fields.track3 then music_player_current_track=3 end
    if fields.track4 then music_player_current_track=4 end
    if fields.track5 then music_player_current_track=5 end
    if fields.track6 then music_player_current_track=6 end
    if fields.track7 then music_player_current_track=7 end
    if fields.track8 then music_player_current_track=8 end
    if fields.track9 then music_player_current_track=9 end
    meta:set_float("music_player_current_track",music_player_current_track)
    if fields.play and player_on==1 then
    if music_handle then minetest.sound_stop(music_handle) end
    music_handle=minetest.sound_play("technic_track"..music_player_current_track, {pos = pos, gain = 1.0,loop = true, max_hear_distance = 72,})
    meta:set_float("music_playing",1)
    end
    if fields.stop then
    meta:set_float("music_playing",0)
    if music_handle then minetest.sound_stop(music_handle) end
    end
    meta:set_float("music_handle",music_handle)
    end,
})
minetest.register_abm({
    nodenames = {"technic:music_player"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
    local meta = minetest.env:get_meta(pos)
    local charge= meta:get_float("internal_EU_buffer")
    local max_charge= meta:get_float("internal_EU_buffer_size")
    player_on=meta:get_float("music_player_on")
    music_player_current_track=meta:get_float("music_player_current_track")
    local play_cost=80
    if charge>play_cost then
        if meta:get_float("music_playing")==1 then charge=charge-play_cost end
            meta:set_float("internal_EU_buffer",charge)
        meta:set_float("music_player_on",1)
    else
        meta:set_float("music_playing",0)
        meta:set_float("music_player_on",0)
        if music_handle then minetest.sound_stop(music_handle) end
    end
    local load = math.floor((charge/max_charge)*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]"..
                "label[0,0;Music Player]"..
                "label[1,3;Power level]"..
                "button[4,1;1,1;track1;1]"..
                "button[5,1;1,1;track2;2]"..
                "button[6,1;1,1;track3;3]"..
                "button[4,2;1,1;track4;4]"..
                "button[5,2;1,1;track5;5]"..
                "button[6,2;1,1;track6;6]"..
                "button[4,3;1,1;track7;7]"..
                "button[5,3;1,1;track8;8]"..
                "button[6,3;1,1;track9;9]"..
                "button[4,4;1,2;play;Play]"..
                "button[6,4;1,2;stop;Stop]"..
                "label[4,0;Current track "..tostring(music_player_current_track).."]"
                )
    end
})
technic/node_breaker.lua
New file
@@ -0,0 +1,89 @@
minetest.register_craft({
    output = 'technic:nodebreaker_off 1',
    recipe = {
        {'default:wood', 'default:pick_mese','default:wood'},
        {'default:stone', 'mesecons:piston','default:stone'},
        {'default:stone', 'mesecons:mesecon','default:stone'},
    }
})
node_breaker_on = function(pos, node)
    if node.name == "technic:nodebreaker_off" then
        hacky_swap_node(pos,"technic:nodebreaker_on")
        break_node (pos,node.param2)
        nodeupdate(pos)
    end
end
node_breaker_off = function(pos, node)
    if node.name == "technic:nodebreaker_on" then
        hacky_swap_node(pos,"technic:nodebreaker_off")
        nodeupdate(pos)
    end
end
minetest.register_node("technic:nodebreaker_off", {
    description = "Node Breaker",
    tile_images = {"technic_nodebreaker_top_off.png","technic_nodebreaker_bottom_off.png","technic_nodebreaker_side2_off.png","technic_nodebreaker_side1_off.png",
            "technic_nodebreaker_back.png","technic_nodebreaker_front_off.png"},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1},
    mesecons= {effector={action_on=node_breaker_on, action_off=node_breaker_off}},
    sounds = default.node_sound_stone_defaults(),
    on_construct = function(pos)
    local meta = minetest.env:get_meta(pos)
    end,
})
minetest.register_node("technic:nodebreaker_on", {
    description = "Node Breaker",
    tile_images = {"technic_nodebreaker_top_on.png","technic_nodebreaker_bottom_on.png","technic_nodebreaker_side2_on.png","technic_nodebreaker_side1_on.png",
            "technic_nodebreaker_back.png","technic_nodebreaker_front_on.png"},
    mesecons= {effector={action_on=node_breaker_on, action_off=node_breaker_off}},
    is_ground_content = true,
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1,not_in_creative_inventory=1},
    sounds = default.node_sound_stone_defaults(),
})
function break_node (pos,n_param)
    local pos1={}
    local pos2={}
    pos1.x=pos.x
    pos1.y=pos.y
    pos1.z=pos.z
    pos2.x=pos.x
    pos2.y=pos.y
    pos2.z=pos.z
    --param2 3=x+ 1=x- 2=z+ 0=z-
    local x_velocity=0
    local z_velocity=0
    if n_param==3 then pos2.x=pos2.x+1 pos1.x=pos1.x-1 x_velocity=-1 end
    if n_param==2 then pos2.z=pos2.z+1 pos1.z=pos1.z-1 z_velocity=-1 end
    if n_param==1 then pos2.x=pos2.x-1 pos1.x=pos1.x+1 x_velocity=1 end
    if n_param==0 then pos2.z=pos2.z-1 pos1.x=pos1.z+1 z_velocity=1 end
    local node=minetest.env:get_node(pos2)
    if node.name == "air" then return nil end
    if node.name == "default:lava_source" then return nil end
    if node.name == "default:lava_flowing" then return nil end
    if node.name == "default:water_source" then minetest.env:remove_node(pos2) return nil end
    if node.name == "default:water_flowing" then minetest.env:remove_node(pos2) return nil end
    if node.name == "ignore" then minetest.env:remove_node(pos2) return nil end
    local drops = minetest.get_node_drops(node.name, "default:pick_mese")
        local _, dropped_item
        for _, dropped_item in ipairs(drops) do
            local item1=tube_item({x=pos.x,y=pos.y,z=pos.z},dropped_item)
            item1:get_luaentity().start_pos = {x=pos.x,y=pos.y,z=pos.z}
            item1:setvelocity({x=x_velocity, y=0, z=z_velocity})
            item1:setacceleration({x=0, y=0, z=0})
        end
    minetest.env:remove_node(pos2)
end
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(":stairsplus", "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(":stairsplus", "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(":stairsplus", "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(":stairsplus", "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/project_table.lua
New file
@@ -0,0 +1,39 @@
minetest.register_craft({
    output = 'technic:project_table 1',
    recipe = {
        {'default:wood','default:wood','default:wood'},
        {'default:wood','default:chest','default:wood'},
        {'default:stone','default:stone','default:stone'},
    }
})
minetest.register_craftitem("technic:project_table", {
    description = "Project Table",
    stack_max = 99,
})
minetest.register_node("technic:project_table", {
    description = "Project Table",
    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", "Iron Chest")
        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,
})
technic/rubber.lua
New file
@@ -0,0 +1,121 @@
-- Code of rubber tree by PilzAdam
minetest.register_node("technic:rubber_sapling", {
    description = "Rubber Tree Sapling",
    drawtype = "plantlike",
    tiles = {"technic_rubber_sapling.png"},
    inventory_image = "technic_rubber_sapling.png",
    wield_image = "technic_rubber_sapling.png",
    paramtype = "light",
    walkable = false,
    groups = {dig_immediate=3,flammable=2},
    sounds = default.node_sound_defaults(),
})
minetest.register_node("technic:rubber_tree_full", {
    description = "Rubber Tree",
    tiles = {"default_tree_top.png", "default_tree_top.png", "technic_rubber_tree_full.png"},
    groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
    drop = "default:tree",
    sounds = default.node_sound_wood_defaults(),
    on_dig = function(pos, node, digger)
        minetest.node_dig(pos, node, digger)
        minetest.env:remove_node(pos)
    end,
    after_destruct = function(pos, oldnode)
        oldnode.name = "technic:rubber_tree_empty"
        minetest.env:set_node(pos, oldnode)
    end
})
minetest.register_node("technic:rubber_tree_empty", {
    tiles = {"default_tree_top.png", "default_tree_top.png", "technic_rubber_tree_empty.png"},
    groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2, not_in_creative_inventory=1},
    drop = "default:tree",
    sounds = default.node_sound_wood_defaults(),
})
minetest.register_abm({
    nodenames = {"technic:rubber_tree_empty"},
    interval = 60,
    chance = 15,
    action = function(pos, node)
        node.name = "technic:rubber_tree_full"
        minetest.env:set_node(pos, node)
    end
})
minetest.register_node("technic:rubber_leaves", {
    drawtype = "allfaces_optional",
    visual_scale = 1.3,
    tiles = {"technic_rubber_leaves.png"},
    paramtype = "light",
    groups = {snappy=3, leafdecay=3, flammable=2, not_in_creative_inventory=1},
    drop = {
        max_items = 1,
        items = {
            {
                items = {'technic:rubber_sapling'},
                rarity = 20,
            },
        }
    },
    sounds = default.node_sound_leaves_defaults(),
})
minetest.register_abm({
    nodenames = {"technic:rubber_sapling"},
    interval = 60,
    chance = 20,
    action = function(pos, node)
        rubber_tree={
            axiom="FFFFA",
            rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]",
            rules_b="[&FFA]////[&FFA]////[&FFA]",
            trunk="technic:rubber_tree_full",
            leaves="technic:rubber_leaves",
            angle=35,
            iterations=3,
            random_level=1,
            thin_trunks=false;
            fruit_tree=false,
            fruit=""
            }
            minetest.env:spawn_tree(pos,rubber_tree)
    end
})
minetest.register_on_generated(function(minp, maxp, blockseed)
    if math.random(1, 100) > 5 then
        return
    end
    local tmp = {x=(maxp.x-minp.x)/2+minp.x, y=(maxp.y-minp.y)/2+minp.y, z=(maxp.z-minp.z)/2+minp.z}
    local pos = minetest.env:find_node_near(tmp, maxp.x-minp.x, {"default:dirt_with_grass"})
    if pos ~= nil then
            rubber_tree={
            axiom="FFFFA",
            rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]",
            rules_b="[&FFA]////[&FFA]////[&FFA]",
            trunk="technic:rubber_tree_full",
            leaves="technic:rubber_leaves",
            angle=35,
            iterations=3,
            random_level=1,
            thin_trunks=false;
            fruit_tree=false,
            fruit=""
            }
            minetest.env:spawn_tree({x=pos.x, y=pos.y+1, z=pos.z},rubber_tree)
    end
end)
-- ========= FUEL =========
minetest.register_craft({
    type = "fuel",
    recipe = "technic:rubber_sapling",
    burntime = 10
})
technic/screwdriver.lua
New file
@@ -0,0 +1,47 @@
 minetest.register_tool("technic:screwdriver", {
            description = "Screwdriver",
            inventory_image = "technic_screwdriver.png",
            on_use = function(itemstack, user, pointed_thing)
                    -- Must be pointing to facedir applicable node
                    if pointed_thing.type~="node" then return end
                    local pos=minetest.get_pointed_thing_position(pointed_thing,above)
                    local node=minetest.env:get_node(pos)
                    local node_name=node.name
                        if minetest.registered_nodes[node_name].paramtype2 == "facedir" or minetest.registered_nodes[node_name].paramtype2 == "wallmounted" then
                    if node.param2==nil  then return end
                    -- Get ready to set the param2
                    local n = node.param2
                                        if minetest.registered_nodes[node_name].paramtype2 == "facedir" then
                    n = n+1
                    if n == 4 then n = 0 end
                                        else
                                        n = n+1
                                        if n == 6 then n = 0 end
                                        end
                    -- hacky_swap_node, unforunatly.
                    local meta = minetest.env:get_meta(pos)
                    local meta0 = meta:to_table()
                    node.param2 = n
                    minetest.env:set_node(pos,node)
                    meta = minetest.env:get_meta(pos)
                    meta:from_table(meta0)
                    local item=itemstack:to_table()
                    local item_wear=tonumber((item["wear"]))
                    item_wear=item_wear+819
                    if item_wear>65535 then itemstack:clear() return itemstack end
                    item["wear"]=tostring(item_wear)
                    itemstack:replace(item)
                    return itemstack
                        else
                        return itemstack
                        end
            end,
    })
    minetest.register_craft({
            output = "technic:screwdriver",
            recipe = {
                    {"technic:stainless_steel_ingot"},
                    {"default:stick"}
            }
    })
technic/silver_chest.lua
New file
@@ -0,0 +1,131 @@
minetest.register_craft({
    output = 'technic:silver_chest 1',
    recipe = {
        {'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'},
        {'moreores:silver_ingot','technic:copper_chest','moreores:silver_ingot'},
        {'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:silver_locked_chest 1',
    recipe = {
        {'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'},
        {'moreores:silver_ingot','technic:copper_locked_chest','moreores:silver_ingot'},
        {'moreores:silver_ingot','moreores:silver_ingot','moreores:silver_ingot'},
    }
})
minetest.register_craft({
    output = 'technic:silver_locked_chest 1',
    recipe = {
        {'default:steel_ingot'},
        {'technic:silver_chest'},
    }
})
minetest.register_craftitem("technic:silver_chest", {
    description = "Silver Chest",
    stack_max = 99,
})
minetest.register_craftitem("technic:silver_locked_chest", {
    description = "Silver Locked Chest",
    stack_max = 99,
})
minetest.register_node("technic:silver_chest", {
    description = "Silver Chest",
    tiles = {"technic_silver_chest_top.png", "technic_silver_chest_top.png", "technic_silver_chest_side.png",
        "technic_silver_chest_side.png", "technic_silver_chest_side.png", "technic_silver_chest_front.png"},
    paramtype2 = "facedir",
    groups = chest_groups1,
    tube = tubes_properties,
    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[11,9;]"..
                "list[current_name;main;0,0;11,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Silver Chest")
        local inv = meta:get_inventory()
        inv:set_size("main", 11*4)
    end,
    can_dig = chest_can_dig,
    on_punch = function (pos, node, puncher)
            local meta = minetest.env:get_meta(pos);
                meta:set_string("formspec", "hack:sign_text_input")
    end,
    on_receive_fields = function(pos, formname, fields, sender)
        local meta = minetest.env:get_meta(pos);
              fields.text = fields.text or ""
        meta:set_string("text", fields.text)
        meta:set_string("infotext", '"'..fields.text..'"')
        meta:set_string("formspec",
                "invsize[11,9;]"..
                "list[current_name;main;0,0;11,4;]"..
                "list[current_player;main;0,5;8,4;]")
    end,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
minetest.register_node("technic:silver_locked_chest", {
    description = "Silver Locked Chest",
    tiles = {"technic_silver_chest_top.png", "technic_silver_chest_top.png", "technic_silver_chest_side.png",
        "technic_silver_chest_side.png", "technic_silver_chest_side.png", "technic_silver_chest_locked.png"},
    paramtype2 = "facedir",
    groups = chest_groups2,
    tube = tubes_properties,
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    after_place_node = function(pos, placer)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("owner", placer:get_player_name() or "")
        meta:set_string("infotext", "Silver Locked Chest (owned by "..
            meta:get_string("owner")..")")
    end,
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("formspec",
                "invsize[11,9;]"..
                "list[current_name;main;0,0;11,4;]"..
                "list[current_player;main;0,5;8,4;]")
        meta:set_string("infotext", "Silver Locked Chest")
        meta:set_string("owner", "")
        local inv = meta:get_inventory()
        inv:set_size("main", 11*4)
    end,
    can_dig = chest_can_dig,
    on_punch = function (pos, node, puncher)
            local meta = minetest.env:get_meta(pos);
                meta:set_string("formspec", "hack:sign_text_input")
    end,
    on_receive_fields = function(pos, formname, fields, sender)
        local meta = minetest.env:get_meta(pos);
              fields.text = fields.text or ""
        meta:set_string("text", fields.text)
        meta:set_string("infotext", '"'..fields.text..'"')
        meta:set_string("formspec",
                "invsize[11,9;]"..
                "list[current_name;main;0,0;11,4;]"..
                "list[current_player;main;0,5;8,4;]")
    end,
    allow_metadata_inventory_move = def_allow_metadata_inventory_move,
    allow_metadata_inventory_put = def_allow_metadata_inventory_put,
    allow_metadata_inventory_take = def_allow_metadata_inventory_take,
    on_metadata_inventory_move = def_on_metadata_inventory_move,
    on_metadata_inventory_put = def_on_metadata_inventory_put,
    on_metadata_inventory_take = def_on_metadata_inventory_take
})
technic/solar_panel.lua
New file
@@ -0,0 +1,76 @@
minetest.register_node("technic:solar_panel", {
    tiles = {"technic_solar_panel_top.png", "technic_solar_panel_bottom.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,
    internal_EU_buffer=0;
    internal_EU_buffer_size=1000;
    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_float("internal_EU_buffer", 0)
        meta:set_float("internal_EU_buffer_size", 1000)
        meta:set_string("infotext", "Solar Panel")
        meta:set_float("active", false)
    end,
})
minetest.register_craft({
    output = 'technic:solar_panel 1',
    recipe = {
        {'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer','technic:doped_silicon_wafer'},
        {'technic:doped_silicon_wafer', 'moreores:copper_ingot','technic:doped_silicon_wafer'},
        {'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer','technic:doped_silicon_wafer'},
    }
})
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)
            local internal_EU_buffer=meta:get_float("internal_EU_buffer")
            local internal_EU_buffer_size=meta:get_float("internal_EU_buffer_size")
            local charge_to_give=40+(pos1.y/250*40) -- make solar energy depending on height
            if charge_to_give<0 then charge_to_give=0 end
            if charge_to_give>160 then charge_to_give=160 end
            if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
            charge_to_give=internal_EU_buffer_size-internal_EU_buffer
            end
            internal_EU_buffer=internal_EU_buffer+charge_to_give
            meta:set_float("internal_EU_buffer",internal_EU_buffer)
        else
            meta:set_string("infotext", "Solar Panel is inactive");
            meta:set_float("active",0)
        end
    end,
})
technic/solar_panel_mv.lua
New file
@@ -0,0 +1,76 @@
minetest.register_node("technic:solar_panel_mv", {
    tiles = {"technic_mv_solar_panel_top.png", "technic_mv_solar_panel_bottom.png", "technic_mv_solar_panel_side.png",
        "technic_mv_solar_panel_side.png", "technic_mv_solar_panel_side.png", "technic_mv_solar_panel_side.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
        description="MV Solar Panel",
    active = false,
    technic_mv_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=10000;
    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_mv_power_machine", 1)
        meta:set_float("internal_EU_buffer", 0)
        meta:set_float("internal_EU_buffer_size", 10000)
        meta:set_string("infotext", "MV Solar Panel")
        meta:set_float("active", false)
    end,
})
minetest.register_craft({
    output = 'technic:solar_panel_mv 1',
    recipe = {
        {'technic:solar_panel', 'technic:solar_panel','technic:solar_panel'},
        {'technic:solar_panel', 'technic:mv_transformer','technic:solar_panel'},
        {'', 'technic:mv_cable',''},
    }
})
minetest.register_abm(
    {nodenames = {"technic:solar_panel_mv"},
    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 >= 14 then
            meta:set_string("infotext", "Solar Panel is active ")
            meta:set_float("active",1)
            local internal_EU_buffer=meta:get_float("internal_EU_buffer")
            local internal_EU_buffer_size=meta:get_float("internal_EU_buffer_size")
            local charge_to_give=300+(pos1.y/250*300) -- make solar energy depending on height
            if charge_to_give<0 then charge_to_give=0 end
            if charge_to_give>600 then charge_to_give=600 end
            if internal_EU_buffer+charge_to_give>internal_EU_buffer_size then
            charge_to_give=internal_EU_buffer_size-internal_EU_buffer
            end
            internal_EU_buffer=internal_EU_buffer+charge_to_give
            meta:set_float("internal_EU_buffer",internal_EU_buffer)
        else
            meta:set_string("infotext", "Solar Panel is inactive");
            meta:set_float("active",0)
        end
    end,
})
technic/sonic_screwdriver.lua
New file
@@ -0,0 +1,55 @@
sonic_screwdriver_max_charge=15000
       minetest.register_tool("technic:sonic_screwdriver", {
            description = "Sonic Screwdriver",
            inventory_image = "technic_sonic_screwdriver.png",
            on_use = function(itemstack, user, pointed_thing)
                    -- Must be pointing to facedir applicable node
                    if pointed_thing.type~="node" then return end
                    local pos=minetest.get_pointed_thing_position(pointed_thing,above)
                    local node=minetest.env:get_node(pos)
                    local node_name=node.name
                        if minetest.registered_nodes[node_name].paramtype2 == "facedir" or minetest.registered_nodes[node_name].paramtype2 == "wallmounted" then
                    if node.param2==nil  then return end
                    item=itemstack:to_table()
                        if item["metadata"]=="" or item["metadata"]=="0" then  return end
            local charge=tonumber((item["metadata"]))
                        if charge-100>0 then
                                minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10,})
                           local n = node.param2
                           if minetest.registered_nodes[node_name].paramtype2 == "facedir" then
                           n = n+1
                   if n == 4 then n = 0 end
                           else
                           n = n+1
                           if n == 6 then n = 0 end
                           end
                            -- hacky_swap_node, unforunatly.
                            local meta = minetest.env:get_meta(pos)
                            local meta0 = meta:to_table()
                            node.param2 = n
                            minetest.env:set_node(pos,node)
                            meta = minetest.env:get_meta(pos)
                            meta:from_table(meta0)
                          charge =charge-100;
                          item["metadata"]=tostring(charge)
              set_RE_wear(item,charge,sonic_screwdriver_max_charge)
                          itemstack:replace(item)
                          end
                        return itemstack
                        else
                        return itemstack
                        end
                        end,
    })
    minetest.register_craft({
            output = "technic:sonic_screwdriver",
            recipe = {
            {"technic:diamond"},
                    {"technic:battery"},
                    {"technic:stainless_steel_ingot"}
            }
    })
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/textures/power_meter.png
technic/textures/technic_alloy_furnace_front.png
technic/textures/technic_alloy_furnace_front_active.png
technic/textures/technic_alloy_furnace_side.png
technic/textures/technic_alloy_furnace_top.png
technic/textures/technic_battery.png
technic/textures/technic_battery_box_bottom.png
technic/textures/technic_battery_box_side.png
technic/textures/technic_battery_box_side0.png
technic/textures/technic_battery_box_side8.png
technic/textures/technic_battery_box_side_mv.png
technic/textures/technic_battery_box_top.png
technic/textures/technic_battery_meter_fg.png
technic/textures/technic_battery_reload.png
technic/textures/technic_brass_dust.png
technic/textures/technic_brass_ingot.png
technic/textures/technic_bronze_dust.png
technic/textures/technic_chainsaw.png
technic/textures/technic_chromium_dust.png
technic/textures/technic_chromium_ingot.png
technic/textures/technic_chromium_lump.png
technic/textures/technic_coal_alloy_furnace_bottom.png
technic/textures/technic_coal_alloy_furnace_front.png
technic/textures/technic_coal_alloy_furnace_front_active.png
technic/textures/technic_coal_alloy_furnace_side.png
technic/textures/technic_coal_alloy_furnace_top.png
technic/textures/technic_coal_dust.png
technic/textures/technic_concrete_block.png
technic/textures/technic_constructor_back.png
technic/textures/technic_constructor_front_off.png
technic/textures/technic_constructor_front_on.png
technic/textures/technic_constructor_mk1_bottom_off.png
technic/textures/technic_constructor_mk1_bottom_on.png
technic/textures/technic_constructor_mk1_side1_off.png
technic/textures/technic_constructor_mk1_side1_on.png
technic/textures/technic_constructor_mk1_side2_off.png
technic/textures/technic_constructor_mk1_side2_on.png
technic/textures/technic_constructor_mk1_top_off.png
technic/textures/technic_constructor_mk1_top_on.png
technic/textures/technic_constructor_mk2_bottom_off.png
technic/textures/technic_constructor_mk2_bottom_on.png
technic/textures/technic_constructor_mk2_side1_off.png
technic/textures/technic_constructor_mk2_side1_on.png
technic/textures/technic_constructor_mk2_side2_off.png
technic/textures/technic_constructor_mk2_side2_on.png
technic/textures/technic_constructor_mk2_top_off.png
technic/textures/technic_constructor_mk2_top_on.png
technic/textures/technic_constructor_mk3_bottom_off.png
technic/textures/technic_constructor_mk3_bottom_on.png
technic/textures/technic_constructor_mk3_side1_off.png
technic/textures/technic_constructor_mk3_side1_on.png
technic/textures/technic_constructor_mk3_side2_off.png
technic/textures/technic_constructor_mk3_side2_on.png
technic/textures/technic_constructor_mk3_top_off.png
technic/textures/technic_constructor_mk3_top_on.png
technic/textures/technic_copper_chest_front.png
technic/textures/technic_copper_chest_locked.png
technic/textures/technic_copper_chest_side.png
technic/textures/technic_copper_chest_top.png
technic/textures/technic_copper_coil.png
technic/textures/technic_copper_dust.png
technic/textures/technic_deployer_back.png
technic/textures/technic_deployer_bottom.png
technic/textures/technic_deployer_front_off.png
technic/textures/technic_deployer_front_on.png
technic/textures/technic_deployer_side.png
technic/textures/technic_deployer_side1.png
technic/textures/technic_deployer_side2.png
technic/textures/technic_deployer_top.png
technic/textures/technic_diamond.png
technic/textures/technic_diamond_block.png
technic/textures/technic_diamond_block_blue.png
technic/textures/technic_diamond_block_green.png
technic/textures/technic_diamond_block_red.png
technic/textures/technic_diamond_drill_head.png
technic/textures/technic_doped_silicon_wafer.png
technic/textures/technic_electric_furnace_bottom.png
technic/textures/technic_electric_furnace_front.png
technic/textures/technic_electric_furnace_front_active.png
technic/textures/technic_electric_furnace_side.png
technic/textures/technic_electric_furnace_top.png
technic/textures/technic_fine_copper_wire.png
technic/textures/technic_flashlight.png
technic/textures/technic_generator_front.png
technic/textures/technic_generator_front_active.png
technic/textures/technic_generator_side.png
technic/textures/technic_generator_top.png
technic/textures/technic_geothermal_side.png
technic/textures/technic_geothermal_top.png
technic/textures/technic_geothermal_top_active.png
technic/textures/technic_gold_chest_front.png
technic/textures/technic_gold_chest_front_black.png
technic/textures/technic_gold_chest_front_blue.png
technic/textures/technic_gold_chest_front_brown.png
technic/textures/technic_gold_chest_front_cyan.png
technic/textures/technic_gold_chest_front_dark_green.png
technic/textures/technic_gold_chest_front_dark_grey.png
technic/textures/technic_gold_chest_front_green.png
technic/textures/technic_gold_chest_front_grey.png
technic/textures/technic_gold_chest_front_magenta.png
technic/textures/technic_gold_chest_front_orange.png
technic/textures/technic_gold_chest_front_pink.png
technic/textures/technic_gold_chest_front_red.png
technic/textures/technic_gold_chest_front_violet.png
technic/textures/technic_gold_chest_front_white.png
technic/textures/technic_gold_chest_front_yellow.png
technic/textures/technic_gold_chest_locked.png
technic/textures/technic_gold_chest_locked_black.png
technic/textures/technic_gold_chest_locked_blue.png
technic/textures/technic_gold_chest_locked_brown.png
technic/textures/technic_gold_chest_locked_cyan.png
technic/textures/technic_gold_chest_locked_dark_green.png
technic/textures/technic_gold_chest_locked_dark_grey.png
technic/textures/technic_gold_chest_locked_green.png
technic/textures/technic_gold_chest_locked_grey.png
technic/textures/technic_gold_chest_locked_magenta.png
technic/textures/technic_gold_chest_locked_orange.png
technic/textures/technic_gold_chest_locked_pink.png
technic/textures/technic_gold_chest_locked_red.png
technic/textures/technic_gold_chest_locked_violet.png
technic/textures/technic_gold_chest_locked_white.png
technic/textures/technic_gold_chest_locked_yellow.png
technic/textures/technic_gold_chest_side.png
technic/textures/technic_gold_chest_top.png
technic/textures/technic_gold_dust.png
technic/textures/technic_granite.png
technic/textures/technic_grinder_front.png
technic/textures/technic_grinder_side.png
technic/textures/technic_grinder_top.png
technic/textures/technic_iron_chest_front.png
technic/textures/technic_iron_chest_locked.png
technic/textures/technic_iron_chest_side.png
technic/textures/technic_iron_chest_top.png
technic/textures/technic_iron_dust.png
technic/textures/technic_laser_beam.png
technic/textures/technic_lava_can.png
technic/textures/technic_light.png
technic/textures/technic_lv_cable.png
technic/textures/technic_lv_cable_wield.png
technic/textures/technic_machine_bottom.png
technic/textures/technic_marble.png
technic/textures/technic_marble_bricks.png
technic/textures/technic_mineral_chromium.png
technic/textures/technic_mineral_diamond.png
technic/textures/technic_mineral_uranium.png
technic/textures/technic_mineral_zinc.png
technic/textures/technic_mining_drill.png
technic/textures/technic_mining_laser_mk1.png
technic/textures/technic_mithril_chest_front.png
technic/textures/technic_mithril_chest_locked.png
technic/textures/technic_mithril_chest_side.png
technic/textures/technic_mithril_chest_top.png
technic/textures/technic_mithril_dust.png
technic/textures/technic_motor.png
technic/textures/technic_music_player_bottom.png
technic/textures/technic_music_player_side.png
technic/textures/technic_music_player_top.png
technic/textures/technic_mv_battery_box_bottom.png
technic/textures/technic_mv_battery_box_side0.png
technic/textures/technic_mv_battery_box_top.png
technic/textures/technic_mv_cable.png
technic/textures/technic_mv_cable_wield.png
technic/textures/technic_mv_solar_panel_bottom.png
technic/textures/technic_mv_solar_panel_side.png
technic/textures/technic_mv_solar_panel_top.png
technic/textures/technic_mv_solarpanel_bottom.png
technic/textures/technic_mv_solarpanel_side.png
technic/textures/technic_mv_solarpanel_top.png
technic/textures/technic_mv_transformer.png
technic/textures/technic_nodebreaker_back.png
technic/textures/technic_nodebreaker_bottom.png
technic/textures/technic_nodebreaker_bottom_off.png
technic/textures/technic_nodebreaker_bottom_on.png
technic/textures/technic_nodebreaker_front_off.png
technic/textures/technic_nodebreaker_front_on.png
technic/textures/technic_nodebreaker_side.png
technic/textures/technic_nodebreaker_side1.png
technic/textures/technic_nodebreaker_side1_off.png
technic/textures/technic_nodebreaker_side1_on.png
technic/textures/technic_nodebreaker_side2.png
technic/textures/technic_nodebreaker_side2_off.png
technic/textures/technic_nodebreaker_side2_on.png
technic/textures/technic_nodebreaker_top.png
technic/textures/technic_nodebreaker_top_off.png
technic/textures/technic_nodebreaker_top_on.png
technic/textures/technic_obsidian.png
technic/textures/technic_power_meter.png
technic/textures/technic_power_meter1.png
technic/textures/technic_power_meter2.png
technic/textures/technic_power_meter3.png
technic/textures/technic_power_meter4.png
technic/textures/technic_power_meter5.png
technic/textures/technic_power_meter6.png
technic/textures/technic_power_meter7.png
technic/textures/technic_power_meter8.png
technic/textures/technic_power_meter_bg.png
technic/textures/technic_power_meter_fg.png
technic/textures/technic_raw_latex.png
technic/textures/technic_rebar.png
technic/textures/technic_rubber.png
technic/textures/technic_rubber_leaves.png
technic/textures/technic_rubber_sapling.png
technic/textures/technic_rubber_tree_empty.png
technic/textures/technic_rubber_tree_full.png
technic/textures/technic_screwdriver.png
technic/textures/technic_silicon_wafer.png
technic/textures/technic_silver_chest_front.png
technic/textures/technic_silver_chest_locked.png
technic/textures/technic_silver_chest_side.png
technic/textures/technic_silver_chest_top.png
technic/textures/technic_silver_dust.png
technic/textures/technic_solar_panel_bottom.png
technic/textures/technic_solar_panel_side.png
technic/textures/technic_solar_panel_top.png
technic/textures/technic_sonic_screwdriver.png
technic/textures/technic_stainless_steel_dust.png
technic/textures/technic_stainless_steel_ingot.png
technic/textures/technic_tin_dust.png
technic/textures/technic_tree_tap.png
technic/textures/technic_uranium.png
technic/textures/technic_water_can.png
technic/textures/technic_water_mill_side.png
technic/textures/technic_water_mill_top.png
technic/textures/technic_water_mill_top_active.png
technic/textures/technic_workshop_bottom.png
technic/textures/technic_workshop_side.png
technic/textures/technic_workshop_top.png
technic/textures/technic_zinc_dust.png
technic/textures/technic_zinc_ingot.png
technic/textures/technic_zinc_lump.png
technic/textures/technicx32/technic_alloy_furnace_front.png
technic/textures/technicx32/technic_alloy_furnace_front_active.png
technic/textures/technicx32/technic_alloy_furnace_side.png
technic/textures/technicx32/technic_alloy_furnace_top.png
technic/textures/technicx32/technic_battery.png
technic/textures/technicx32/technic_battery_box_bottom.png
technic/textures/technicx32/technic_battery_box_side0.png
technic/textures/technicx32/technic_battery_box_top.png
technic/textures/technicx32/technic_battery_reload.png
technic/textures/technicx32/technic_brass_dust.png
technic/textures/technicx32/technic_brass_ingot.png
technic/textures/technicx32/technic_bronze_dust.png
technic/textures/technicx32/technic_chainsaw.png
technic/textures/technicx32/technic_chromium_dust.png
technic/textures/technicx32/technic_chromium_ingot.png
technic/textures/technicx32/technic_chromium_lump.png
technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png
technic/textures/technicx32/technic_coal_alloy_furnace_front.png
technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png
technic/textures/technicx32/technic_coal_alloy_furnace_side.png
technic/textures/technicx32/technic_coal_alloy_furnace_top.png
technic/textures/technicx32/technic_coal_dust.png
technic/textures/technicx32/technic_concrete_block.png
technic/textures/technicx32/technic_constructor_back.png
technic/textures/technicx32/technic_constructor_front_off.png
technic/textures/technicx32/technic_constructor_front_on.png
technic/textures/technicx32/technic_constructor_mk1_bottom_off.png
technic/textures/technicx32/technic_constructor_mk1_bottom_on.png
technic/textures/technicx32/technic_constructor_mk1_side1_off.png
technic/textures/technicx32/technic_constructor_mk1_side1_on.png
technic/textures/technicx32/technic_constructor_mk1_side2_off.png
technic/textures/technicx32/technic_constructor_mk1_side2_on.png
technic/textures/technicx32/technic_constructor_mk1_top_off.png
technic/textures/technicx32/technic_constructor_mk1_top_on.png
technic/textures/technicx32/technic_constructor_mk2_bottom_off.png
technic/textures/technicx32/technic_constructor_mk2_bottom_on.png
technic/textures/technicx32/technic_constructor_mk2_side1_off.png
technic/textures/technicx32/technic_constructor_mk2_side1_on.png
technic/textures/technicx32/technic_constructor_mk2_side2_off.png
technic/textures/technicx32/technic_constructor_mk2_side2_on.png
technic/textures/technicx32/technic_constructor_mk2_top_off.png
technic/textures/technicx32/technic_constructor_mk2_top_on.png
technic/textures/technicx32/technic_constructor_mk3_bottom_off.png
technic/textures/technicx32/technic_constructor_mk3_bottom_on.png
technic/textures/technicx32/technic_constructor_mk3_side1_off.png
technic/textures/technicx32/technic_constructor_mk3_side1_on.png
technic/textures/technicx32/technic_constructor_mk3_side2_off.png
technic/textures/technicx32/technic_constructor_mk3_side2_on.png
technic/textures/technicx32/technic_constructor_mk3_top_off.png
technic/textures/technicx32/technic_constructor_mk3_top_on.png
technic/textures/technicx32/technic_copper_chest_front.png
technic/textures/technicx32/technic_copper_chest_locked.png
technic/textures/technicx32/technic_copper_chest_side.png
technic/textures/technicx32/technic_copper_chest_top.png
technic/textures/technicx32/technic_copper_coil.png
technic/textures/technicx32/technic_copper_dust.png
technic/textures/technicx32/technic_deployer_back.png
technic/textures/technicx32/technic_deployer_bottom.png
technic/textures/technicx32/technic_deployer_front_off.png
technic/textures/technicx32/technic_deployer_front_on.png
technic/textures/technicx32/technic_deployer_side.png
technic/textures/technicx32/technic_deployer_side1.png
technic/textures/technicx32/technic_deployer_side2.png
technic/textures/technicx32/technic_deployer_top.png
technic/textures/technicx32/technic_diamond.png
technic/textures/technicx32/technic_diamond_block.png
technic/textures/technicx32/technic_diamond_block_blue.png
technic/textures/technicx32/technic_diamond_block_green.png
technic/textures/technicx32/technic_diamond_block_red.png
technic/textures/technicx32/technic_diamond_drill_head.png
technic/textures/technicx32/technic_doped_silicon_wafer.png
technic/textures/technicx32/technic_electric_furnace_bottom.png
technic/textures/technicx32/technic_electric_furnace_front.png
technic/textures/technicx32/technic_electric_furnace_front_active.png
technic/textures/technicx32/technic_electric_furnace_side.png
technic/textures/technicx32/technic_electric_furnace_top.png
technic/textures/technicx32/technic_fine_copper_wire.png
technic/textures/technicx32/technic_flashlight.png
technic/textures/technicx32/technic_generator_front.png
technic/textures/technicx32/technic_generator_front_active.png
technic/textures/technicx32/technic_generator_side.png
technic/textures/technicx32/technic_generator_top.png
technic/textures/technicx32/technic_geothermal_side.png
technic/textures/technicx32/technic_geothermal_top.png
technic/textures/technicx32/technic_geothermal_top_active.png
technic/textures/technicx32/technic_gold_chest_front.png
technic/textures/technicx32/technic_gold_chest_front_black.png
technic/textures/technicx32/technic_gold_chest_front_blue.png
technic/textures/technicx32/technic_gold_chest_front_brown.png
technic/textures/technicx32/technic_gold_chest_front_cyan.png
technic/textures/technicx32/technic_gold_chest_front_dark_green.png
technic/textures/technicx32/technic_gold_chest_front_dark_grey.png
technic/textures/technicx32/technic_gold_chest_front_green.png
technic/textures/technicx32/technic_gold_chest_front_grey.png
technic/textures/technicx32/technic_gold_chest_front_magenta.png
technic/textures/technicx32/technic_gold_chest_front_orange.png
technic/textures/technicx32/technic_gold_chest_front_pink.png
technic/textures/technicx32/technic_gold_chest_front_red.png
technic/textures/technicx32/technic_gold_chest_front_violet.png
technic/textures/technicx32/technic_gold_chest_front_white.png
technic/textures/technicx32/technic_gold_chest_front_yellow.png
technic/textures/technicx32/technic_gold_chest_locked.png
technic/textures/technicx32/technic_gold_chest_locked_black.png
technic/textures/technicx32/technic_gold_chest_locked_blue.png
technic/textures/technicx32/technic_gold_chest_locked_brown.png
technic/textures/technicx32/technic_gold_chest_locked_cyan.png
technic/textures/technicx32/technic_gold_chest_locked_dark_green.png
technic/textures/technicx32/technic_gold_chest_locked_dark_grey.png
technic/textures/technicx32/technic_gold_chest_locked_green.png
technic/textures/technicx32/technic_gold_chest_locked_grey.png
technic/textures/technicx32/technic_gold_chest_locked_magenta.png
technic/textures/technicx32/technic_gold_chest_locked_orange.png
technic/textures/technicx32/technic_gold_chest_locked_pink.png
technic/textures/technicx32/technic_gold_chest_locked_red.png
technic/textures/technicx32/technic_gold_chest_locked_violet.png
technic/textures/technicx32/technic_gold_chest_locked_white.png
technic/textures/technicx32/technic_gold_chest_locked_yellow.png
technic/textures/technicx32/technic_gold_chest_side.png
technic/textures/technicx32/technic_gold_chest_top.png
technic/textures/technicx32/technic_gold_dust.png
technic/textures/technicx32/technic_granite.png
technic/textures/technicx32/technic_grinder_front.png
technic/textures/technicx32/technic_grinder_side.png
technic/textures/technicx32/technic_grinder_top.png
technic/textures/technicx32/technic_iron_chest_front.png
technic/textures/technicx32/technic_iron_chest_locked.png
technic/textures/technicx32/technic_iron_chest_side.png
technic/textures/technicx32/technic_iron_chest_top.png
technic/textures/technicx32/technic_iron_dust.png
technic/textures/technicx32/technic_laser_beam.png
technic/textures/technicx32/technic_lava_can.png
technic/textures/technicx32/technic_light.png
technic/textures/technicx32/technic_lv_cable.png
technic/textures/technicx32/technic_lv_cable_wield.png
technic/textures/technicx32/technic_machine_bottom.png
technic/textures/technicx32/technic_marble.png
technic/textures/technicx32/technic_marble_bricks.png
technic/textures/technicx32/technic_mineral_chromium.png
technic/textures/technicx32/technic_mineral_diamond.png
technic/textures/technicx32/technic_mineral_uranium.png
technic/textures/technicx32/technic_mineral_zinc.png
technic/textures/technicx32/technic_mining_drill.png
technic/textures/technicx32/technic_mining_laser_mk1.png
technic/textures/technicx32/technic_mithril_chest_front.png
technic/textures/technicx32/technic_mithril_chest_locked.png
technic/textures/technicx32/technic_mithril_chest_side.png
technic/textures/technicx32/technic_mithril_chest_top.png
technic/textures/technicx32/technic_mithril_dust.png
technic/textures/technicx32/technic_motor.png
technic/textures/technicx32/technic_music_player_bottom.png
technic/textures/technicx32/technic_music_player_side.png
technic/textures/technicx32/technic_music_player_top.png
technic/textures/technicx32/technic_mv_battery_box_bottom.png
technic/textures/technicx32/technic_mv_battery_box_side0.png
technic/textures/technicx32/technic_mv_battery_box_top.png
technic/textures/technicx32/technic_mv_cable.png
technic/textures/technicx32/technic_mv_cable_wield.png
technic/textures/technicx32/technic_mv_solar_panel_bottom.png
technic/textures/technicx32/technic_mv_solar_panel_side.png
technic/textures/technicx32/technic_mv_solar_panel_top.png
technic/textures/technicx32/technic_mv_transformer.png
technic/textures/technicx32/technic_nodebreaker_back.png
technic/textures/technicx32/technic_nodebreaker_bottom.png
technic/textures/technicx32/technic_nodebreaker_bottom_off.png
technic/textures/technicx32/technic_nodebreaker_bottom_on.png
technic/textures/technicx32/technic_nodebreaker_front_off.png
technic/textures/technicx32/technic_nodebreaker_front_on.png
technic/textures/technicx32/technic_nodebreaker_side.png
technic/textures/technicx32/technic_nodebreaker_side1.png
technic/textures/technicx32/technic_nodebreaker_side1_off.png
technic/textures/technicx32/technic_nodebreaker_side1_on.png
technic/textures/technicx32/technic_nodebreaker_side2.png
technic/textures/technicx32/technic_nodebreaker_side2_off.png
technic/textures/technicx32/technic_nodebreaker_side2_on.png
technic/textures/technicx32/technic_nodebreaker_top.png
technic/textures/technicx32/technic_nodebreaker_top_off.png
technic/textures/technicx32/technic_nodebreaker_top_on.png
technic/textures/technicx32/technic_power_meter.png
technic/textures/technicx32/technic_power_meter1.png
technic/textures/technicx32/technic_power_meter2.png
technic/textures/technicx32/technic_power_meter3.png
technic/textures/technicx32/technic_power_meter4.png
technic/textures/technicx32/technic_power_meter5.png
technic/textures/technicx32/technic_power_meter6.png
technic/textures/technicx32/technic_power_meter7.png
technic/textures/technicx32/technic_power_meter8.png
technic/textures/technicx32/technic_power_meter_bg.png
technic/textures/technicx32/technic_power_meter_fg.png
technic/textures/technicx32/technic_raw_latex.png
technic/textures/technicx32/technic_rebar.png
technic/textures/technicx32/technic_rubber.png
technic/textures/technicx32/technic_rubber_sapling.png
technic/textures/technicx32/technic_rubber_tree_empty.png
technic/textures/technicx32/technic_rubber_tree_full.png
technic/textures/technicx32/technic_screwdriver.png
technic/textures/technicx32/technic_silicon_wafer.png
technic/textures/technicx32/technic_silver_chest_front.png
technic/textures/technicx32/technic_silver_chest_locked.png
technic/textures/technicx32/technic_silver_chest_side.png
technic/textures/technicx32/technic_silver_chest_top.png
technic/textures/technicx32/technic_silver_dust.png
technic/textures/technicx32/technic_solar_panel_bottom.png
technic/textures/technicx32/technic_solar_panel_side.png
technic/textures/technicx32/technic_solar_panel_top.png
technic/textures/technicx32/technic_sonic_screwdriver.png
technic/textures/technicx32/technic_stainless_steel_dust.png
technic/textures/technicx32/technic_stainless_steel_ingot.png
technic/textures/technicx32/technic_tin_dust.png
technic/textures/technicx32/technic_tree_tap.png
technic/textures/technicx32/technic_uranium.png
technic/textures/technicx32/technic_water_can.png
technic/textures/technicx32/technic_water_mill_side.png
technic/textures/technicx32/technic_water_mill_top.png
technic/textures/technicx32/technic_water_mill_top_active.png
technic/textures/technicx32/technic_workshop_bottom.png
technic/textures/technicx32/technic_workshop_side.png
technic/textures/technicx32/technic_workshop_top.png
technic/textures/technicx32/technic_zinc_dust.png
technic/textures/technicx32/technic_zinc_ingot.png
technic/textures/technicx32/technic_zinc_lump.png
technic/textures/textures_here.txt
New file
@@ -0,0 +1 @@
If you haven't modified the texture_path setting, you can copy textures of your texture packs into here. Folders are currently not supported.
technic/tool_workshop.lua
New file
@@ -0,0 +1,97 @@
minetest.register_alias("tool_workshop", "technic:tool_workshop")
minetest.register_craft({
    output = 'technic:tool_workshop',
    recipe = {
        {'default:wood', 'default:wood', 'default:wood'},
        {'default:wood', 'technic:diamond', 'default:wood'},
        {'default:stone', 'moreores:copper_ingot', 'default:stone'},
    }
})
minetest.register_craftitem("technic:tool_workshop", {
    description = "Tool Workshop",
    stack_max = 99,
})
workshop_formspec =
    "invsize[8,9;]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
    "list[current_name;src;3,1;1,1;]"..
    "label[0,0;Tool Workshop]"..
    "label[1,3;Power level]"..
    "list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:tool_workshop", {
    description = "Tool Workshop",
    tiles = {"technic_workshop_top.png", "technic_machine_bottom.png", "technic_workshop_side.png",
        "technic_workshop_side.png", "technic_workshop_side.png", "technic_workshop_side.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=2000;
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "Tool Workshop")
        meta:set_float("technic_power_machine", 1)
        meta:set_float("internal_EU_buffer", 1)
        meta:set_float("internal_EU_buffer_size", 2000)
        meta:set_string("formspec", workshop_formspec)
        local inv = meta:get_inventory()
        inv:set_size("src", 1)
        end,
    can_dig = function(pos,player)
        local meta = minetest.env:get_meta(pos);
        local inv = meta:get_inventory()
        if not inv:is_empty("src") then
            return false
        end
        return true
    end,
})
minetest.register_abm({
    nodenames = {"technic:tool_workshop"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
    local meta = minetest.env:get_meta(pos)
    local charge= meta:get_float("internal_EU_buffer")
    local max_charge= meta:get_float("internal_EU_buffer_size")
    local load_step=2000
    local load_cost=200
        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:water_can" or src_item["name"]=="technic:lava_can") then
                load_step=0
                load_cost=0
                end
            local load1=tonumber((src_item["wear"]))
            if charge>load_cost then
                if load1>1 then
                    if load1-load_step<0 then load_step=load1 load1=1
                    else load1=load1-load_step end
                    charge=charge-load_cost
                    src_item["wear"]=tostring(load1)
                    inv:set_stack("src", 1, src_item)
                end
            end
        end
    meta:set_float("internal_EU_buffer",charge)
    local load = math.floor((charge/max_charge)*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;]"..
                "label[0,0;Tool Workshop]"..
                "label[1,3;Power level]"..
                "list[current_player;main;0,5;8,4;]")
    end
})
technic/tree_tap.lua
New file
@@ -0,0 +1,49 @@
    minetest.register_tool("technic:treetap", {
            description = "Tree Tap",
            inventory_image = "technic_tree_tap.png",
            on_use = function(itemstack,user,pointed_thing)
                    if pointed_thing.type~="node" then return end
                    if user:get_inventory():room_for_item("main",ItemStack("technic:raw_latex")) then
                            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" 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()
                                    local item_wear=tonumber((item["wear"]))
                                    item_wear=item_wear+819
                                    if item_wear>65535 then itemstack:clear() return itemstack end
                                    item["wear"]=tostring(item_wear)
                                    itemstack:replace(item)
                                    return itemstack
                                    else
                                    return itemstack
                                    end
                           else return end
                    end,
    })
    minetest.register_craft({
            output = "technic:treetap",
            recipe = {
                    {"pipeworks:tube", "default:wood", "default:stick"},
                    {"", "default:stick", "default:stick"}
            },
    })
    minetest.register_craftitem("technic:raw_latex", {
            description = "Raw Latex",
            inventory_image = "technic_raw_latex.png",
    })
    minetest.register_craft({
            type = "cooking",
            output = "technic:rubber",
            recipe = "technic:raw_latex",
    })
    minetest.register_craftitem("technic:rubber", {
            description = "Rubber Fiber",
            inventory_image = "technic_rubber.png",
    })
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/water_mill.lua
New file
@@ -0,0 +1,128 @@
minetest.register_alias("water_mill", "technic:water_mill")
minetest.register_craft({
    output = 'technic:water_mill',
    recipe = {
        {'default:stone', 'default:stone', 'default:stone'},
        {'default:wood', 'technic:diamond', 'default:wood'},
        {'default:stone', 'moreores:copper_ingot', 'default:stone'},
    }
})
minetest.register_craftitem("technic:water_mill", {
    description = "Water Mill",
    stack_max = 99,
})
water_mill_formspec =
    "invsize[8,4;]"..
    "image[1,1;1,2;technic_power_meter_bg.png]"..
    "label[0,0;Water Mill]"..
    "label[1,3;Power level]"..
    "list[current_player;main;0,5;8,4;]"
minetest.register_node("technic:water_mill", {
    description = "Water Mill",
    tiles = {"technic_water_mill_top.png", "technic_machine_bottom.png", "technic_water_mill_side.png",
        "technic_water_mill_side.png", "technic_water_mill_side.png", "technic_water_mill_side.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=5000;
    burn_time=0;
    on_construct = function(pos)
        local meta = minetest.env:get_meta(pos)
        meta:set_string("infotext", "Water Mill")
        meta:set_float("technic_power_machine", 1)
        meta:set_float("internal_EU_buffer", 0)
        meta:set_float("internal_EU_buffer_size", 3000)
        meta:set_string("formspec", water_mill_formspec)
        end,
})
minetest.register_node("technic:water_mill_active", {
    description = "Water Mill",
    tiles = {"technic_water_mill_top_active.png", "technic_machine_bottom.png", "technic_water_mill_side.png",
        "technic_water_mill_side.png", "technic_water_mill_side.png", "technic_water_mill_side.png"},
    paramtype2 = "facedir",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
    legacy_facedir_simple = true,
    sounds = default.node_sound_wood_defaults(),
    drop="technic:water_mill",
    technic_power_machine=1,
    internal_EU_buffer=0;
    internal_EU_buffer_size=0;
})
minetest.register_abm({
    nodenames = {"technic:water_mill","technic:water_mill_active"},
    interval = 1,
    chance = 1,
    action = function(pos, node, active_object_count, active_object_count_wider)
    local meta = minetest.env:get_meta(pos)
    local charge= meta:get_float("internal_EU_buffer")
    local max_charge= meta:get_float("internal_EU_buffer_size")
    local water_nodes = 0
    local lava_nodes = 0
    local production_level=0
    local load_step=0
    pos.x=pos.x+1
    local check=check_node_around_mill (pos)
    if check==1 then water_nodes=water_nodes+1 end
    pos.x=pos.x-2
    check=check_node_around_mill (pos)
    if check==1 then water_nodes=water_nodes+1 end
    pos.x=pos.x+1
    pos.z=pos.z+1
    check=check_node_around_mill (pos)
    if check==1 then water_nodes=water_nodes+1 end
    pos.z=pos.z-2
    check=check_node_around_mill (pos)
    if check==1 then water_nodes=water_nodes+1 end
    pos.z=pos.z+1
    if water_nodes==1 then production_level=25 load_step=30 end
    if water_nodes==2 then production_level=50 load_step=60 end
    if water_nodes==3 then production_level=75 load_step=90 end
    if water_nodes==4 then production_level=100 load_step=120 end
        if production_level>0 then
        if charge+load_step>max_charge then
        load_step=max_charge-charge
        end
        if load_step>0 then
        charge=charge+load_step
        meta:set_float("internal_EU_buffer",charge)
        end
    end
    local load = math.floor((charge/max_charge)*100)
    meta:set_string("formspec",
                "invsize[8,4;]"..
                "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
                        (load)..":technic_power_meter_fg.png]"..
                "label[0,0;Water Mill]"..
                "label[1,3;Power level]"..
                "label[4,0;Production at "..tostring(production_level).."%]"
                )
    if production_level>0 and minetest.env:get_node(pos).name=="technic:water_mill" then
        hacky_swap_node (pos,"technic:water_mill_active")
        return
    end
    if production_level==0 then hacky_swap_node (pos,"technic:water_mill") end
end
})
function check_node_around_mill (pos)
local node=minetest.env:get_node(pos)
if node.name=="default:water_flowing"  then return 1 end
return 0
end
technic/wires.lua
New file
@@ -0,0 +1,401 @@
--LV cable node boxes
minetest.register_alias("lv_cable", "technic:lv_cable")
minetest.register_craft({
    output = 'technic:lv_cable 6',
    recipe = {
        {'moreores:copper_ingot', 'moreores:copper_ingot', 'moreores:copper_ingot'},
    }
})
minetest.register_craftitem("technic:lv_cable", {
    description = "Low Voltage Copper Cable",
    stack_max = 99,
})
minetest.register_node("technic:lv_cable", {
    description = "Low Voltage Copper Cable",
    tiles = {"technic_lv_cable.png"},
    inventory_image = "technic_lv_cable_wield.png",
    wield_image = "technic_lv_cable_wield.png",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
    drop = "technic:lv_cable",
    cablelike=1,
    rules_x1=0,
    rules_x2=0,
    rules_y1=0,
    rules_y2=0,
    rules_z1=0,
    rules_z2=0,
    paramtype = "light",
        drawtype = "nodebox",
    selection_box = {
        type = "fixed",
                fixed = {
        { -0.1 , -0.1 , -0.1 , 0.1 ,  0.1 , 0.1  },
        }},
    node_box = {
        type = "fixed",
                fixed = {
        { -0.1 , -0.1 , -0.1 , 0.1 ,  0.1 , 0.1  },
        }},
    on_construct = function(pos)
    meta=minetest.env:get_meta(pos)
    meta:set_float("cablelike",1)
    meta:set_float("x1",0)
    meta:set_float("x2",0)
    meta:set_float("y1",0)
    meta:set_float("y2",0)
    meta:set_float("z1",0)
    meta:set_float("z2",0)
    check_connections (pos)
    end,
    after_dig_node = function (pos, oldnode, oldmetadata, digger)
    check_connections_on_destroy (pos)
    end,
})
str_y1=        { -0.1 , -0.1 , -0.1 , 0.1 , 0.5, 0.1  }    --0 y+
str_x1=        { -0.1 , -0.1 , -0.1 , 0.5, 0.1 , 0.1  }    --0 x+
str_z1=        { -0.1 , -0.1 ,  0.1 ,  0.1 , 0.1 , 0.5 }   --0 z+
str_z2=        { -0.1 , -0.1, -0.5 ,  0.1 ,  0.1 , 0.1  }  --0 z-
str_y2=        { -0.1 , -0.5, -0.1 ,  0.1 ,  0.1 , 0.1  }  --0 y-
str_x2=        { -0.5 , -0.1, -0.1 ,  0.1 ,  0.1 , 0.1  }  --0 x-
local x1,x2,y1,y2,z1,z2
local count=0
for x1 = 0, 1, 1 do    --x-
for x2 = 0, 1, 1 do    --x+
for y1 = 0, 1, 1 do    --y-
for y2 = 0, 1, 1 do    --y-
for z1 = 0, 1, 1 do    --z-
for z2 = 0, 1, 1 do    --z+
temp_x1={} temp_x2={} temp_y1={} temp_y2={} temp_z1={} temp_z2={}
if x1==1 then     temp_x1=str_x1  end
if x2==1 then     temp_x2=str_x2  end
if y1==1 then     temp_y1=str_y1  end
if y2==1 then     temp_y2=str_y2  end
if z1==1 then     temp_z1=str_z1  end
if z2==1 then     temp_z2=str_z2  end
minetest.register_node("technic:lv_cable"..count, {
    description = "Low Voltage Copper Cable",
    tiles = {"technic_lv_cable.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
    sounds = default.node_sound_wood_defaults(),
    drop = "technic:lv_cable",
    rules_x1=0,
    rules_x2=0,
    rules_y1=0,
    rules_y2=0,
    rules_z1=0,
    rules_z2=0,
    cablelike=1,
    paramtype = "light",
        drawtype = "nodebox",
    selection_box = {
        type = "fixed",
           fixed = {
        temp_x1,temp_x2,temp_y1,temp_y2,temp_z1,temp_z2,
        }},
    node_box = {
        type = "fixed",
           fixed = {
        temp_x1,temp_x2,temp_y1,temp_y2,temp_z1,temp_z2,
        }},
    after_dig_node = function (pos, oldnode, oldmetadata, digger)
    check_connections_on_destroy (pos)
    end,
})
count=count+1 end end end end end end
check_connections = function(pos)
        local pos1={}
        pos1.x=pos.x
        pos1.y=pos.y
        pos1.z=pos.z
        pos1.x=pos1.x+1
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        x2=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:lv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("x2",x2)
        meta=minetest.env:get_meta(pos)
        x1=1
        x2=minetest.env:get_meta(pos):get_float("x2")
        y1=minetest.env:get_meta(pos):get_float("y1")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("x1",x1)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:lv_cable"..rule)
        end
        pos1.x=pos1.x-2
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        x1=1
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:lv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("x1",x1)
        meta=minetest.env:get_meta(pos)
        x2=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        y1=minetest.env:get_meta(pos):get_float("y1")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("x2",x2)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:lv_cable"..rule)
        end
        pos1.x=pos1.x+1
        pos1.y=pos1.y+1
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        y2=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:lv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("y2",y2)
        meta=minetest.env:get_meta(pos)
        y1=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("y1",y1)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:lv_cable"..rule)
        end
        if minetest.env:get_meta(pos1):get_float("technic_power_machine")==1 then
        y1=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:lv_cable"..rule)
        meta=minetest.env:get_meta(pos)
        meta:set_float("y1",y1)
        end
        pos1.y=pos1.y-2
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        y1=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:lv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("y1",y1)
        meta=minetest.env:get_meta(pos)
        y2=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y1=minetest.env:get_meta(pos):get_float("y1")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("y2",y2)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:lv_cable"..rule)
        end
        pos1.y=pos1.y+1
        pos1.z=pos1.z+1
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        z2=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:lv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("z2",z2)
        meta=minetest.env:get_meta(pos)
        z1=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y1=minetest.env:get_meta(pos):get_float("y1")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("z1",z1)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:lv_cable"..rule)
        end
        pos1.z=pos1.z-2
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        z1=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:lv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("z1",z1)
        meta=minetest.env:get_meta(pos)
        z2=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y1=minetest.env:get_meta(pos):get_float("y1")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        meta:set_float("z2",z2)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:lv_cable"..rule)
        end
        pos1.z=pos1.z+1
end
function make_rule_number (x1,x2,y1,y2,z1,z2)
local temp= z2+z1*2+y2*4+y1*8+x2*16+x1*32
return temp
end
check_connections_on_destroy = function(pos)
        local pos1={}
        pos1.x=pos.x
        pos1.y=pos.y
        pos1.z=pos.z
        pos1.x=pos1.x+1
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        x2=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:lv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:lv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("x2",x2)
        end
        pos1.x=pos1.x-2
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        x1=0
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:lv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:lv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("x1",x1)
        end
        pos1.x=pos1.x+1
        pos1.y=pos1.y+1
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        y2=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:lv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:lv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("y2",y2)
        end
        pos1.y=pos1.y-2
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        y1=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:lv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:lv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("y1",y1)
        end
        pos1.y=pos1.y+1
        pos1.z=pos1.z+1
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        z2=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:lv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:lv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("z2",z2)
        end
        pos1.z=pos1.z-2
        if minetest.env:get_meta(pos1):get_float("cablelike")==1 then
        z1=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:lv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:lv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("z1",z1)
        end
        pos1.y=pos1.y+1
end
technic/wires_mv.lua
New file
@@ -0,0 +1,400 @@
--MV cable node boxes
minetest.register_alias("mv_cable", "technic:mv_cable")
minetest.register_craft({
    output = 'technic:mv_cable 3',
    recipe ={
        {'technic:rubber','technic:rubber','technic:rubber'},
        {'technic:lv_cable','technic:lv_cable','technic:lv_cable'},
        {'technic:rubber','technic:rubber','technic:rubber'},
        }
})
minetest.register_craftitem("technic:mv_cable", {
    description = "Medium Voltage Copper Cable",
    stack_max = 99,
})
minetest.register_node("technic:mv_cable", {
    description = "Medium Voltage Copper Cable",
    tiles = {"technic_mv_cable.png"},
    inventory_image = "technic_mv_cable_wield.png",
    wield_image = "technic_mv_cable_wield.png",
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
    sounds = default.node_sound_wood_defaults(),
    drop = "technic:mv_cable",
    mv_cablelike=1,
    rules_x1=0,
    rules_x2=0,
    rules_y1=0,
    rules_y2=0,
    rules_z1=0,
    rules_z2=0,
    paramtype = "light",
        drawtype = "nodebox",
    selection_box = {
        type = "fixed",
                fixed = {
        { -0.1 , -0.1 , -0.1 , 0.1 ,  0.1 , 0.1  },
        }},
    node_box = {
        type = "fixed",
                fixed = {
        { -0.1 , -0.1 , -0.1 , 0.1 ,  0.1 , 0.1  },
        }},
    on_construct = function(pos)
    meta=minetest.env:get_meta(pos)
    meta:set_float("mv_cablelike",1)
    meta:set_float("x1",0)
    meta:set_float("x2",0)
    meta:set_float("y1",0)
    meta:set_float("y2",0)
    meta:set_float("z1",0)
    meta:set_float("z2",0)
    MV_check_connections (pos)
    end,
    after_dig_node = function (pos, oldnode, oldmetadata, digger)
    MV_check_connections_on_destroy (pos)
    end,
})
str_y1=        { -0.1 , -0.1 , -0.1 , 0.1 , 0.5, 0.1  }    --0 y+
str_x1=        { -0.1 , -0.1 , -0.1 , 0.5, 0.1 , 0.1  }    --0 x+
str_z1=        { -0.1 , -0.1 ,  0.1 ,  0.1 , 0.1 , 0.5 }   --0 z+
str_z2=        { -0.1 , -0.1, -0.5 ,  0.1 ,  0.1 , 0.1  }  --0 z-
str_y2=        { -0.1 , -0.5, -0.1 ,  0.1 ,  0.1 , 0.1  }  --0 y-
str_x2=        { -0.5 , -0.1, -0.1 ,  0.1 ,  0.1 , 0.1  }  --0 x-
local x1,x2,y1,y2,z1,z2
local count=0
for x1 = 0, 1, 1 do    --x-
for x2 = 0, 1, 1 do    --x+
for y1 = 0, 1, 1 do    --y-
for y2 = 0, 1, 1 do    --y-
for z1 = 0, 1, 1 do    --z-
for z2 = 0, 1, 1 do    --z+
temp_x1={} temp_x2={} temp_y1={} temp_y2={} temp_z1={} temp_z2={}
if x1==1 then     temp_x1=str_x1  end
if x2==1 then     temp_x2=str_x2  end
if y1==1 then     temp_y1=str_y1  end
if y2==1 then     temp_y2=str_y2  end
if z1==1 then     temp_z1=str_z1  end
if z2==1 then     temp_z2=str_z2  end
minetest.register_node("technic:mv_cable"..count, {
    description = "Medium Voltage Copper Cable",
    tiles = {"technic_mv_cable.png"},
    groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
    sounds = default.node_sound_wood_defaults(),
    drop = "technic:mv_cable",
    rules_x1=0,
    rules_x2=0,
    rules_y1=0,
    rules_y2=0,
    rules_z1=0,
    rules_z2=0,
    cablelike=1,
    paramtype = "light",
        drawtype = "nodebox",
    selection_box = {
        type = "fixed",
           fixed = {
        temp_x1,temp_x2,temp_y1,temp_y2,temp_z1,temp_z2,
        }},
    node_box = {
        type = "fixed",
           fixed = {
        temp_x1,temp_x2,temp_y1,temp_y2,temp_z1,temp_z2,
        }},
    after_dig_node = function (pos, oldnode, oldmetadata, digger)
    MV_check_connections_on_destroy (pos)
    end,
})
count=count+1 end end end end end end
MV_check_connections = function(pos)
        local pos1={}
        pos1.x=pos.x
        pos1.y=pos.y
        pos1.z=pos.z
        pos1.x=pos1.x+1
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        x2=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:mv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("x2",x2)
        meta=minetest.env:get_meta(pos)
        x1=1
        x2=minetest.env:get_meta(pos):get_float("x2")
        y1=minetest.env:get_meta(pos):get_float("y1")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("x1",x1)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:mv_cable"..rule)
        end
        pos1.x=pos1.x-2
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        x1=1
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:mv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("x1",x1)
        meta=minetest.env:get_meta(pos)
        x2=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        y1=minetest.env:get_meta(pos):get_float("y1")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("x2",x2)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:mv_cable"..rule)
        end
        pos1.x=pos1.x+1
        pos1.y=pos1.y+1
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        y2=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:mv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("y2",y2)
        meta=minetest.env:get_meta(pos)
        y1=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("y1",y1)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:mv_cable"..rule)
        end
        if minetest.env:get_meta(pos1):get_float("technic_mv_power_machine")==1 then
        y1=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:mv_cable"..rule)
        meta=minetest.env:get_meta(pos)
        meta:set_float("y1",y1)
        end
        pos1.y=pos1.y-2
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        y1=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:mv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("y1",y1)
        meta=minetest.env:get_meta(pos)
        y2=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y1=minetest.env:get_meta(pos):get_float("y1")
        z1=minetest.env:get_meta(pos):get_float("z1")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("y2",y2)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:mv_cable"..rule)
        end
        pos1.y=pos1.y+1
        pos1.z=pos1.z+1
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        z2=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:mv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("z2",z2)
        meta=minetest.env:get_meta(pos)
        z1=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y1=minetest.env:get_meta(pos):get_float("y1")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z2=minetest.env:get_meta(pos):get_float("z2")
        meta:set_float("z1",z1)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:mv_cable"..rule)
        end
        pos1.z=pos1.z-2
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        z1=1
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos1,"technic:mv_cable"..rule)
        meta=minetest.env:get_meta(pos1)
        meta:set_float("z1",z1)
        meta=minetest.env:get_meta(pos)
        z2=1
        x1=minetest.env:get_meta(pos):get_float("x1")
        x2=minetest.env:get_meta(pos):get_float("x2")
        y1=minetest.env:get_meta(pos):get_float("y1")
        y2=minetest.env:get_meta(pos):get_float("y2")
        z1=minetest.env:get_meta(pos):get_float("z1")
        meta:set_float("z2",z2)
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        hacky_swap_node(pos,"technic:mv_cable"..rule)
        end
        pos1.z=pos1.z+1
end
MV_check_connections_on_destroy = function(pos)
        local pos1={}
        pos1.x=pos.x
        pos1.y=pos.y
        pos1.z=pos.z
        pos1.x=pos1.x+1
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        x2=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:mv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:mv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("x2",x2)
        end
        pos1.x=pos1.x-2
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        x1=0
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:mv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:mv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("x1",x1)
        end
        pos1.x=pos1.x+1
        pos1.y=pos1.y+1
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        y2=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:mv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:mv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("y2",y2)
        end
        pos1.y=pos1.y-2
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        y1=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:mv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:mv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("y1",y1)
        end
        pos1.y=pos1.y+1
        pos1.z=pos1.z+1
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        z2=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z1=minetest.env:get_meta(pos1):get_float("z1")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:mv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:mv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("z2",z2)
        end
        pos1.z=pos1.z-2
        if minetest.env:get_meta(pos1):get_float("mv_cablelike")==1 then
        z1=0
        x1=minetest.env:get_meta(pos1):get_float("x1")
        x2=minetest.env:get_meta(pos1):get_float("x2")
        y1=minetest.env:get_meta(pos1):get_float("y1")
        y2=minetest.env:get_meta(pos1):get_float("y2")
        z2=minetest.env:get_meta(pos1):get_float("z2")
        rule=make_rule_number(x1,x2,y1,y2,z1,z2)
        if rule==0 then hacky_swap_node(pos1,"technic:mv_cable") end
        if rule>0  then    hacky_swap_node(pos1,"technic:mv_cable"..rule) end
        meta=minetest.env:get_meta(pos1)
        meta:set_float("z1",z1)
        end
        pos1.y=pos1.y+1
end