summaryrefslogtreecommitdiff
path: root/technic
diff options
context:
space:
mode:
authorVanessa Ezekowitz <vanessaezekowitz@gmail.com>2016-04-01 20:02:19 -0400
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>2016-04-01 21:09:33 -0400
commitda66780a569712c23ae4f2996cfb4608a9f9d69d (patch)
tree217556029a78bc23ad4564720afc86de97228a04 /technic
parent615b22df4d423aded3613db7716943a2f389b047 (diff)
downloaddreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.gz
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.bz2
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.xz
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.zip
copy all standard Dreambuilder mods in from the old subgame
(exactly as last supplied there, updates to these mods will follow later)
Diffstat (limited to 'technic')
-rw-r--r--technic/.mailmap4
-rw-r--r--technic/README.md23
-rw-r--r--technic/concrete/depends.txt3
-rw-r--r--technic/concrete/init.lua274
-rw-r--r--technic/concrete/locale/de.txt10
-rw-r--r--technic/concrete/locale/template.txt8
-rw-r--r--technic/concrete/locale/tr.txt7
-rw-r--r--technic/concrete/textures/technic_blast_resistant_concrete_block.pngbin0 -> 311 bytes
-rw-r--r--technic/concrete/textures/technic_concrete_block.pngbin0 -> 500 bytes
-rw-r--r--technic/concrete/textures/technic_rebar.pngbin0 -> 813 bytes
-rw-r--r--technic/concrete/textures/x32/technic_concrete_block.pngbin0 -> 2319 bytes
-rw-r--r--technic/concrete/textures/x32/technic_rebar.pngbin0 -> 813 bytes
-rw-r--r--technic/extranodes/depends.txt5
-rw-r--r--technic/extranodes/init.lua103
-rw-r--r--technic/extranodes/locale/de.txt9
-rw-r--r--technic/extranodes/locale/template.txt7
-rw-r--r--technic/extranodes/locale/tr.txt6
-rw-r--r--technic/manual.md1488
-rw-r--r--technic/modpack.txt1
-rw-r--r--technic/technic/README.md27
-rw-r--r--technic/technic/config.lua18
-rw-r--r--technic/technic/crafts.lua193
-rw-r--r--technic/technic/depends.txt8
-rw-r--r--technic/technic/helpers.lua67
-rw-r--r--technic/technic/init.lua54
-rw-r--r--technic/technic/items.lua221
-rw-r--r--technic/technic/legacy.lua38
-rw-r--r--technic/technic/locale/de.txt204
-rw-r--r--technic/technic/locale/es.txt197
-rw-r--r--technic/technic/locale/it.txt201
-rw-r--r--technic/technic/locale/template.txt211
-rw-r--r--technic/technic/machines/HV/battery_box.lua21
-rw-r--r--technic/technic/machines/HV/cables.lua12
-rw-r--r--technic/technic/machines/HV/forcefield.lua261
-rw-r--r--technic/technic/machines/HV/generator.lua13
-rw-r--r--technic/technic/machines/HV/init.lua18
-rw-r--r--technic/technic/machines/HV/nuclear_reactor.lua723
-rw-r--r--technic/technic/machines/HV/quarry.lua251
-rw-r--r--technic/technic/machines/HV/solar_array.lua14
-rw-r--r--technic/technic/machines/LV/alloy_furnace.lua14
-rw-r--r--technic/technic/machines/LV/battery_box.lua19
-rw-r--r--technic/technic/machines/LV/cables.lua14
-rw-r--r--technic/technic/machines/LV/cnc.lua237
-rw-r--r--technic/technic/machines/LV/cnc_api.lua369
-rw-r--r--technic/technic/machines/LV/cnc_nodes.lua91
-rw-r--r--technic/technic/machines/LV/compressor.lua13
-rw-r--r--technic/technic/machines/LV/electric_furnace.lua16
-rw-r--r--technic/technic/machines/LV/extractor.lua13
-rw-r--r--technic/technic/machines/LV/generator.lua18
-rw-r--r--technic/technic/machines/LV/geothermal.lua111
-rw-r--r--technic/technic/machines/LV/grinder.lua13
-rw-r--r--technic/technic/machines/LV/init.lua29
-rw-r--r--technic/technic/machines/LV/music_player.lua130
-rw-r--r--technic/technic/machines/LV/solar_array.lua18
-rw-r--r--technic/technic/machines/LV/solar_panel.lua67
-rw-r--r--technic/technic/machines/LV/water_mill.lua102
-rw-r--r--technic/technic/machines/MV/alloy_furnace.lua14
-rw-r--r--technic/technic/machines/MV/battery_box.lua22
-rw-r--r--technic/technic/machines/MV/cables.lua14
-rw-r--r--technic/technic/machines/MV/centrifuge.lua16
-rw-r--r--technic/technic/machines/MV/compressor.lua12
-rw-r--r--technic/technic/machines/MV/electric_furnace.lua18
-rw-r--r--technic/technic/machines/MV/extractor.lua12
-rw-r--r--technic/technic/machines/MV/generator.lua13
-rw-r--r--technic/technic/machines/MV/grinder.lua13
-rw-r--r--technic/technic/machines/MV/init.lua32
-rw-r--r--technic/technic/machines/MV/lighting.lua590
-rw-r--r--technic/technic/machines/MV/power_radiator.lua220
-rw-r--r--technic/technic/machines/MV/solar_array.lua14
-rw-r--r--technic/technic/machines/MV/tool_workshop.lua117
-rw-r--r--technic/technic/machines/MV/wind_mill.lua87
-rw-r--r--technic/technic/machines/init.lua14
-rw-r--r--technic/technic/machines/other/anchor.lua109
-rw-r--r--technic/technic/machines/other/coal_alloy_furnace.lua177
-rw-r--r--technic/technic/machines/other/coal_furnace.lua5
-rw-r--r--technic/technic/machines/other/constructor.lua189
-rw-r--r--technic/technic/machines/other/frames.lua928
-rw-r--r--technic/technic/machines/other/init.lua15
-rw-r--r--technic/technic/machines/other/injector.lua118
-rw-r--r--technic/technic/machines/register/alloy_furnace.lua10
-rw-r--r--technic/technic/machines/register/alloy_recipes.lua35
-rw-r--r--technic/technic/machines/register/battery_box.lua291
-rw-r--r--technic/technic/machines/register/cables.lua177
-rw-r--r--technic/technic/machines/register/centrifuge.lua8
-rw-r--r--technic/technic/machines/register/centrifuge_recipes.lua38
-rw-r--r--technic/technic/machines/register/common.lua214
-rw-r--r--technic/technic/machines/register/compressor.lua9
-rw-r--r--technic/technic/machines/register/compressor_recipes.lua34
-rw-r--r--technic/technic/machines/register/electric_furnace.lua9
-rw-r--r--technic/technic/machines/register/extractor.lua9
-rw-r--r--technic/technic/machines/register/extractor_recipes.lua59
-rw-r--r--technic/technic/machines/register/generator.lua173
-rw-r--r--technic/technic/machines/register/grinder.lua9
-rw-r--r--technic/technic/machines/register/grinder_recipes.lua161
-rw-r--r--technic/technic/machines/register/grindings.lua62
-rw-r--r--technic/technic/machines/register/init.lua33
-rw-r--r--technic/technic/machines/register/machine_base.lua197
-rw-r--r--technic/technic/machines/register/recipes.lua107
-rw-r--r--technic/technic/machines/register/solar_array.lua65
-rw-r--r--technic/technic/machines/supply_converter.lua80
-rw-r--r--technic/technic/machines/switching_station.lua404
-rw-r--r--technic/technic/models/technic_cylinder.obj238
-rw-r--r--technic/technic/models/technic_cylinder_horizontal.obj238
-rw-r--r--technic/technic/models/technic_innercorner.obj33
-rw-r--r--technic/technic/models/technic_innercorner_upsdown.obj33
-rw-r--r--technic/technic/models/technic_oblate_spheroid.obj300
-rw-r--r--technic/technic/models/technic_one_curved_edge.obj132
-rw-r--r--technic/technic/models/technic_outercorner.obj23
-rw-r--r--technic/technic/models/technic_outercorner_upsdown.obj23
-rw-r--r--technic/technic/models/technic_pyramid.obj24
-rw-r--r--technic/technic/models/technic_pyramid_spike.obj24
-rw-r--r--technic/technic/models/technic_slope.obj24
-rw-r--r--technic/technic/models/technic_slope_horizontal.obj24
-rw-r--r--technic/technic/models/technic_slope_upsdown.obj24
-rw-r--r--technic/technic/models/technic_sphere.obj1927
-rw-r--r--technic/technic/models/technic_two_curved_edge.obj207
-rw-r--r--technic/technic/register.lua58
-rw-r--r--technic/technic/sounds/chainsaw.oggbin0 -> 38174 bytes
-rw-r--r--technic/technic/sounds/item_drop_pickup.1.oggbin0 -> 9981 bytes
-rw-r--r--technic/technic/sounds/item_drop_pickup.2.oggbin0 -> 10477 bytes
-rw-r--r--technic/technic/sounds/item_drop_pickup.3.oggbin0 -> 9586 bytes
-rw-r--r--technic/technic/sounds/item_drop_pickup.4.oggbin0 -> 9696 bytes
-rw-r--r--technic/technic/sounds/mining_drill.oggbin0 -> 14499 bytes
-rw-r--r--technic/technic/sounds/technic_hv_nuclear_reactor_siren_clear.oggbin0 -> 31184 bytes
-rw-r--r--technic/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.oggbin0 -> 13059 bytes
-rw-r--r--technic/technic/sounds/technic_laser_mk1.0.oggbin0 -> 13465 bytes
-rw-r--r--technic/technic/sounds/technic_laser_mk1.1.oggbin0 -> 10281 bytes
-rw-r--r--technic/technic/sounds/technic_laser_mk2.0.oggbin0 -> 16766 bytes
-rw-r--r--technic/technic/sounds/technic_laser_mk2.1.oggbin0 -> 17725 bytes
-rw-r--r--technic/technic/sounds/technic_laser_mk2.2.oggbin0 -> 14627 bytes
-rw-r--r--technic/technic/sounds/technic_laser_mk3.1.oggbin0 -> 12162 bytes
-rw-r--r--technic/technic/sounds/technic_laser_mk3.2.oggbin0 -> 12040 bytes
-rw-r--r--technic/technic/sounds/technic_prospector_hit.oggbin0 -> 4698 bytes
-rw-r--r--technic/technic/sounds/technic_prospector_miss.oggbin0 -> 4481 bytes
-rw-r--r--technic/technic/sounds/technic_sonic_screwdriver.oggbin0 -> 29827 bytes
-rw-r--r--technic/technic/sounds/vacuumcleaner.oggbin0 -> 62768 bytes
-rw-r--r--technic/technic/textures/hires/technic_hv_nuclear_reactor_core_128.pngbin0 -> 26143 bytes
-rw-r--r--technic/technic/textures/hires/technic_hv_nuclear_reactor_core_16.pngbin0 -> 896 bytes
-rw-r--r--technic/technic/textures/hires/technic_hv_nuclear_reactor_core_256.pngbin0 -> 84243 bytes
-rw-r--r--technic/technic/textures/hires/technic_hv_nuclear_reactor_core_32.pngbin0 -> 2545 bytes
-rw-r--r--technic/technic/textures/hires/technic_hv_nuclear_reactor_core_512.pngbin0 -> 254444 bytes
-rw-r--r--technic/technic/textures/hires/technic_hv_nuclear_reactor_core_64.pngbin0 -> 8114 bytes
-rw-r--r--technic/technic/textures/power_meter.pngbin0 -> 463 bytes
-rw-r--r--technic/technic/textures/technic_acacia_grindings.pngbin0 -> 207 bytes
-rw-r--r--technic/technic/textures/technic_admin_anchor.pngbin0 -> 873 bytes
-rw-r--r--technic/technic/textures/technic_akalin_dust.pngbin0 -> 240 bytes
-rw-r--r--technic/technic/textures/technic_alatro_dust.pngbin0 -> 241 bytes
-rw-r--r--technic/technic/textures/technic_arol_dust.pngbin0 -> 227 bytes
-rw-r--r--technic/technic/textures/technic_battery.pngbin0 -> 247 bytes
-rw-r--r--technic/technic/textures/technic_battery_box_side.pngbin0 -> 576 bytes
-rw-r--r--technic/technic/textures/technic_battery_box_side8.pngbin0 -> 639 bytes
-rw-r--r--technic/technic/textures/technic_battery_box_side_mv.pngbin0 -> 587 bytes
-rw-r--r--technic/technic/textures/technic_battery_meter_fg.pngbin0 -> 260 bytes
-rw-r--r--technic/technic/textures/technic_battery_reload.pngbin0 -> 287 bytes
-rw-r--r--technic/technic/textures/technic_bronze_dust.pngbin0 -> 461 bytes
-rw-r--r--technic/technic/textures/technic_bucket_corium.pngbin0 -> 256 bytes
-rw-r--r--technic/technic/textures/technic_carbon_cloth.pngbin0 -> 169 bytes
-rw-r--r--technic/technic/textures/technic_carbon_plate.pngbin0 -> 162 bytes
-rw-r--r--technic/technic/textures/technic_carbon_steel_dust.pngbin0 -> 416 bytes
-rw-r--r--technic/technic/textures/technic_cast_iron_dust.pngbin0 -> 420 bytes
-rw-r--r--technic/technic/textures/technic_chainsaw.pngbin0 -> 529 bytes
-rw-r--r--technic/technic/textures/technic_chernobylite_block.pngbin0 -> 666 bytes
-rw-r--r--technic/technic/textures/technic_chromium_dust.pngbin0 -> 443 bytes
-rw-r--r--technic/technic/textures/technic_cnc_bottom.pngbin0 -> 2006 bytes
-rw-r--r--technic/technic/textures/technic_cnc_cylinder.pngbin0 -> 6047 bytes
-rw-r--r--technic/technic/textures/technic_cnc_cylinder_horizontal.pngbin0 -> 7130 bytes
-rw-r--r--technic/technic/textures/technic_cnc_element_cross.pngbin0 -> 4592 bytes
-rw-r--r--technic/technic/textures/technic_cnc_element_edge.pngbin0 -> 3898 bytes
-rw-r--r--technic/technic/textures/technic_cnc_element_end.pngbin0 -> 3563 bytes
-rw-r--r--technic/technic/textures/technic_cnc_element_straight.pngbin0 -> 4027 bytes
-rw-r--r--technic/technic/textures/technic_cnc_element_t.pngbin0 -> 4369 bytes
-rw-r--r--technic/technic/textures/technic_cnc_front.pngbin0 -> 2000 bytes
-rw-r--r--technic/technic/textures/technic_cnc_front_active.pngbin0 -> 2216 bytes
-rw-r--r--technic/technic/textures/technic_cnc_full.pngbin0 -> 997 bytes
-rw-r--r--technic/technic/textures/technic_cnc_half.pngbin0 -> 1564 bytes
-rw-r--r--technic/technic/textures/technic_cnc_milling_background.pngbin0 -> 78748 bytes
-rw-r--r--technic/technic/textures/technic_cnc_oblate_spheroid.pngbin0 -> 8915 bytes
-rw-r--r--technic/technic/textures/technic_cnc_onecurvededge.pngbin0 -> 8170 bytes
-rw-r--r--technic/technic/textures/technic_cnc_pyramid.pngbin0 -> 4790 bytes
-rw-r--r--technic/technic/textures/technic_cnc_side.pngbin0 -> 1922 bytes
-rw-r--r--technic/technic/textures/technic_cnc_slope.pngbin0 -> 6081 bytes
-rw-r--r--technic/technic/textures/technic_cnc_slope_edge.pngbin0 -> 5900 bytes
-rw-r--r--technic/technic/textures/technic_cnc_slope_edge_upsdwn.pngbin0 -> 4831 bytes
-rw-r--r--technic/technic/textures/technic_cnc_slope_inner_edge.pngbin0 -> 7412 bytes
-rw-r--r--technic/technic/textures/technic_cnc_slope_inner_edge_upsdwn.pngbin0 -> 7404 bytes
-rw-r--r--technic/technic/textures/technic_cnc_slope_lying.pngbin0 -> 6815 bytes
-rw-r--r--technic/technic/textures/technic_cnc_slope_upsdwn.pngbin0 -> 5814 bytes
-rw-r--r--technic/technic/textures/technic_cnc_sphere.pngbin0 -> 5777 bytes
-rw-r--r--technic/technic/textures/technic_cnc_spike.pngbin0 -> 6392 bytes
-rw-r--r--technic/technic/textures/technic_cnc_stick.pngbin0 -> 2305 bytes
-rw-r--r--technic/technic/textures/technic_cnc_top.pngbin0 -> 2137 bytes
-rw-r--r--technic/technic/textures/technic_cnc_top_active.pngbin0 -> 2214 bytes
-rw-r--r--technic/technic/textures/technic_cnc_twocurvededge.pngbin0 -> 7119 bytes
-rw-r--r--technic/technic/textures/technic_coal_alloy_furnace_bottom.pngbin0 -> 677 bytes
-rw-r--r--technic/technic/textures/technic_coal_alloy_furnace_front.pngbin0 -> 681 bytes
-rw-r--r--technic/technic/textures/technic_coal_alloy_furnace_front_active.pngbin0 -> 697 bytes
-rw-r--r--technic/technic/textures/technic_coal_alloy_furnace_side.pngbin0 -> 596 bytes
-rw-r--r--technic/technic/textures/technic_coal_alloy_furnace_top.pngbin0 -> 596 bytes
-rw-r--r--technic/technic/textures/technic_coal_dust.pngbin0 -> 433 bytes
-rw-r--r--technic/technic/textures/technic_common_tree_grindings.pngbin0 -> 226 bytes
-rw-r--r--technic/technic/textures/technic_composite_plate.pngbin0 -> 165 bytes
-rw-r--r--technic/technic/textures/technic_constructor_back.pngbin0 -> 638 bytes
-rw-r--r--technic/technic/textures/technic_constructor_front_off.pngbin0 -> 635 bytes
-rw-r--r--technic/technic/textures/technic_constructor_front_on.pngbin0 -> 690 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk1_bottom_off.pngbin0 -> 638 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk1_bottom_on.pngbin0 -> 664 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk1_side1_off.pngbin0 -> 671 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk1_side1_on.pngbin0 -> 687 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk1_side2_off.pngbin0 -> 654 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk1_side2_on.pngbin0 -> 671 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk1_top_off.pngbin0 -> 626 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk1_top_on.pngbin0 -> 644 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk2_bottom_off.pngbin0 -> 665 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk2_bottom_on.pngbin0 -> 694 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk2_side1_off.pngbin0 -> 701 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk2_side1_on.pngbin0 -> 719 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk2_side2_off.pngbin0 -> 683 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk2_side2_on.pngbin0 -> 708 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk2_top_off.pngbin0 -> 654 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk2_top_on.pngbin0 -> 685 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk3_bottom_off.pngbin0 -> 700 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk3_bottom_on.pngbin0 -> 721 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk3_side1_off.pngbin0 -> 727 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk3_side1_on.pngbin0 -> 762 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk3_side2_off.pngbin0 -> 715 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk3_side2_on.pngbin0 -> 753 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk3_top_off.pngbin0 -> 687 bytes
-rw-r--r--technic/technic/textures/technic_constructor_mk3_top_on.pngbin0 -> 725 bytes
-rw-r--r--technic/technic/textures/technic_control_logic_unit.pngbin0 -> 652 bytes
-rw-r--r--technic/technic/textures/technic_copper_coil.pngbin0 -> 2447 bytes
-rw-r--r--technic/technic/textures/technic_copper_dust.pngbin0 -> 466 bytes
-rw-r--r--technic/technic/textures/technic_copper_plate.pngbin0 -> 174 bytes
-rw-r--r--technic/technic/textures/technic_corium_flowing_animated.pngbin0 -> 3278 bytes
-rw-r--r--technic/technic/textures/technic_corium_source_animated.pngbin0 -> 2954 bytes
-rw-r--r--technic/technic/textures/technic_deployer_back.pngbin0 -> 757 bytes
-rw-r--r--technic/technic/textures/technic_deployer_bottom.pngbin0 -> 835 bytes
-rw-r--r--technic/technic/textures/technic_deployer_front_off.pngbin0 -> 800 bytes
-rw-r--r--technic/technic/textures/technic_deployer_front_on.pngbin0 -> 719 bytes
-rw-r--r--technic/technic/textures/technic_deployer_side.pngbin0 -> 908 bytes
-rw-r--r--technic/technic/textures/technic_deployer_side1.pngbin0 -> 908 bytes
-rw-r--r--technic/technic/textures/technic_deployer_side2.pngbin0 -> 910 bytes
-rw-r--r--technic/technic/textures/technic_deployer_top.pngbin0 -> 842 bytes
-rw-r--r--technic/technic/textures/technic_diamond_block_blue.pngbin0 -> 651 bytes
-rw-r--r--technic/technic/textures/technic_diamond_block_green.pngbin0 -> 636 bytes
-rw-r--r--technic/technic/textures/technic_diamond_block_red.pngbin0 -> 651 bytes
-rw-r--r--technic/technic/textures/technic_diamond_drill_head.pngbin0 -> 978 bytes
-rw-r--r--technic/technic/textures/technic_doped_silicon_wafer.pngbin0 -> 331 bytes
-rw-r--r--technic/technic/textures/technic_fine_copper_wire.pngbin0 -> 501 bytes
-rw-r--r--technic/technic/textures/technic_fine_gold_wire.pngbin0 -> 474 bytes
-rw-r--r--technic/technic/textures/technic_fine_silver_wire.pngbin0 -> 546 bytes
-rw-r--r--technic/technic/textures/technic_flashlight.pngbin0 -> 679 bytes
-rw-r--r--technic/technic/textures/technic_forcefield_animated.pngbin0 -> 3274 bytes
-rw-r--r--technic/technic/textures/technic_forcefield_emitter_off.pngbin0 -> 204 bytes
-rw-r--r--technic/technic/textures/technic_forcefield_emitter_on.pngbin0 -> 204 bytes
-rw-r--r--technic/technic/textures/technic_frame.pngbin0 -> 32199 bytes
-rw-r--r--technic/technic/textures/technic_geothermal_side.pngbin0 -> 809 bytes
-rw-r--r--technic/technic/textures/technic_geothermal_top.pngbin0 -> 828 bytes
-rw-r--r--technic/technic/textures/technic_geothermal_top_active.pngbin0 -> 819 bytes
-rw-r--r--technic/technic/textures/technic_gold_dust.pngbin0 -> 468 bytes
-rw-r--r--technic/technic/textures/technic_graphite.pngbin0 -> 140 bytes
-rw-r--r--technic/technic/textures/technic_grinder_front.pngbin0 -> 777 bytes
-rw-r--r--technic/technic/textures/technic_grinder_side.pngbin0 -> 692 bytes
-rw-r--r--technic/technic/textures/technic_grinder_top.pngbin0 -> 465 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_cube_white_sides.pngbin0 -> 255 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.pngbin0 -> 258 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_cube_white_tb.pngbin0 -> 261 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.pngbin0 -> 350 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.pngbin0 -> 353 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.pngbin0 -> 352 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_thick_white_sides.pngbin0 -> 264 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.pngbin0 -> 265 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.pngbin0 -> 475 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.pngbin0 -> 478 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_thin_white_sides.pngbin0 -> 225 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.pngbin0 -> 232 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.pngbin0 -> 335 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.pngbin0 -> 355 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_white_tb.pngbin0 -> 330 bytes
-rw-r--r--technic/technic/textures/technic_homedecor_glowlight_yellow_tb.pngbin0 -> 633 bytes
-rw-r--r--technic/technic/textures/technic_hv_battery_box_bottom.pngbin0 -> 653 bytes
-rw-r--r--technic/technic/textures/technic_hv_battery_box_side.pngbin0 -> 777 bytes
-rw-r--r--technic/technic/textures/technic_hv_battery_box_top.pngbin0 -> 792 bytes
-rw-r--r--technic/technic/textures/technic_hv_cable.pngbin0 -> 1705 bytes
-rw-r--r--technic/technic/textures/technic_hv_cable_wield.pngbin0 -> 601 bytes
-rw-r--r--technic/technic/textures/technic_hv_down_converter_bottom.pngbin0 -> 653 bytes
-rw-r--r--technic/technic/textures/technic_hv_down_converter_side.pngbin0 -> 609 bytes
-rw-r--r--technic/technic/textures/technic_hv_down_converter_top.pngbin0 -> 653 bytes
-rw-r--r--technic/technic/textures/technic_hv_generator_front.pngbin0 -> 450 bytes
-rw-r--r--technic/technic/textures/technic_hv_generator_front_active.pngbin0 -> 469 bytes
-rw-r--r--technic/technic/textures/technic_hv_generator_side.pngbin0 -> 357 bytes
-rw-r--r--technic/technic/textures/technic_hv_generator_top.pngbin0 -> 384 bytes
-rw-r--r--technic/technic/textures/technic_hv_grinder_bottom.pngbin0 -> 862 bytes
-rw-r--r--technic/technic/textures/technic_hv_grinder_front.pngbin0 -> 716 bytes
-rw-r--r--technic/technic/textures/technic_hv_grinder_front_active.pngbin0 -> 733 bytes
-rw-r--r--technic/technic/textures/technic_hv_grinder_side.pngbin0 -> 753 bytes
-rw-r--r--technic/technic/textures/technic_hv_grinder_side_tube.pngbin0 -> 791 bytes
-rw-r--r--technic/technic/textures/technic_hv_grinder_top.pngbin0 -> 616 bytes
-rw-r--r--technic/technic/textures/technic_hv_nuclear_reactor_core.pngbin0 -> 896 bytes
-rw-r--r--technic/technic/textures/technic_hv_solar_array_bottom.pngbin0 -> 574 bytes
-rw-r--r--technic/technic/textures/technic_hv_solar_array_side.pngbin0 -> 709 bytes
-rw-r--r--technic/technic/textures/technic_hv_solar_array_top.pngbin0 -> 777 bytes
-rw-r--r--technic/technic/textures/technic_hv_transformer.pngbin0 -> 1801 bytes
-rw-r--r--technic/technic/textures/technic_injector_bottom.pngbin0 -> 2667 bytes
-rw-r--r--technic/technic/textures/technic_injector_side.pngbin0 -> 2541 bytes
-rw-r--r--technic/technic/textures/technic_injector_top.pngbin0 -> 2633 bytes
-rw-r--r--technic/technic/textures/technic_kalite_dust.pngbin0 -> 191 bytes
-rw-r--r--technic/technic/textures/technic_laser_beam_mk1.pngbin0 -> 279 bytes
-rw-r--r--technic/technic/textures/technic_laser_beam_mk2.pngbin0 -> 638 bytes
-rw-r--r--technic/technic/textures/technic_laser_beam_mk3.pngbin0 -> 547 bytes
-rw-r--r--technic/technic/textures/technic_lava_can.pngbin0 -> 445 bytes
-rw-r--r--technic/technic/textures/technic_light.pngbin0 -> 246 bytes
-rw-r--r--technic/technic/textures/technic_lv_alloy_furnace_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_lv_alloy_furnace_front.pngbin0 -> 508 bytes
-rw-r--r--technic/technic/textures/technic_lv_alloy_furnace_front_active.pngbin0 -> 543 bytes
-rw-r--r--technic/technic/textures/technic_lv_alloy_furnace_side.pngbin0 -> 313 bytes
-rw-r--r--technic/technic/textures/technic_lv_alloy_furnace_top.pngbin0 -> 397 bytes
-rw-r--r--technic/technic/textures/technic_lv_battery_box_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_lv_battery_box_side.pngbin0 -> 594 bytes
-rw-r--r--technic/technic/textures/technic_lv_battery_box_top.pngbin0 -> 337 bytes
-rw-r--r--technic/technic/textures/technic_lv_cable.pngbin0 -> 504 bytes
-rw-r--r--technic/technic/textures/technic_lv_cable_wield.pngbin0 -> 655 bytes
-rw-r--r--technic/technic/textures/technic_lv_compressor_back.pngbin0 -> 2893 bytes
-rw-r--r--technic/technic/textures/technic_lv_compressor_bottom.pngbin0 -> 2865 bytes
-rw-r--r--technic/technic/textures/technic_lv_compressor_front.pngbin0 -> 2714 bytes
-rw-r--r--technic/technic/textures/technic_lv_compressor_front_active.pngbin0 -> 2743 bytes
-rw-r--r--technic/technic/textures/technic_lv_compressor_side.pngbin0 -> 2893 bytes
-rw-r--r--technic/technic/textures/technic_lv_compressor_top.pngbin0 -> 2940 bytes
-rw-r--r--technic/technic/textures/technic_lv_electric_furnace_bottom.pngbin0 -> 423 bytes
-rw-r--r--technic/technic/textures/technic_lv_electric_furnace_front.pngbin0 -> 443 bytes
-rw-r--r--technic/technic/textures/technic_lv_electric_furnace_front_active.pngbin0 -> 448 bytes
-rw-r--r--technic/technic/textures/technic_lv_electric_furnace_side.pngbin0 -> 399 bytes
-rw-r--r--technic/technic/textures/technic_lv_electric_furnace_top.pngbin0 -> 393 bytes
-rw-r--r--technic/technic/textures/technic_lv_extractor_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_lv_extractor_front.pngbin0 -> 745 bytes
-rw-r--r--technic/technic/textures/technic_lv_extractor_front_active.pngbin0 -> 770 bytes
-rw-r--r--technic/technic/textures/technic_lv_extractor_side.pngbin0 -> 683 bytes
-rw-r--r--technic/technic/textures/technic_lv_extractor_top.pngbin0 -> 544 bytes
-rw-r--r--technic/technic/textures/technic_lv_generator_front.pngbin0 -> 430 bytes
-rw-r--r--technic/technic/textures/technic_lv_generator_front_active.pngbin0 -> 454 bytes
-rw-r--r--technic/technic/textures/technic_lv_generator_side.pngbin0 -> 341 bytes
-rw-r--r--technic/technic/textures/technic_lv_generator_top.pngbin0 -> 388 bytes
-rw-r--r--technic/technic/textures/technic_lv_grinder_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_lv_grinder_front.pngbin0 -> 745 bytes
-rw-r--r--technic/technic/textures/technic_lv_grinder_front_active.pngbin0 -> 770 bytes
-rw-r--r--technic/technic/textures/technic_lv_grinder_side.pngbin0 -> 683 bytes
-rw-r--r--technic/technic/textures/technic_lv_grinder_top.pngbin0 -> 544 bytes
-rw-r--r--technic/technic/textures/technic_lv_solar_array_bottom.pngbin0 -> 579 bytes
-rw-r--r--technic/technic/textures/technic_lv_solar_array_side.pngbin0 -> 465 bytes
-rw-r--r--technic/technic/textures/technic_lv_solar_array_top.pngbin0 -> 743 bytes
-rw-r--r--technic/technic/textures/technic_lv_transformer.pngbin0 -> 1821 bytes
-rw-r--r--technic/technic/textures/technic_machine_bottom.pngbin0 -> 572 bytes
-rw-r--r--technic/technic/textures/technic_machine_casing.pngbin0 -> 673 bytes
-rw-r--r--technic/technic/textures/technic_mining_drill.pngbin0 -> 2099 bytes
-rw-r--r--technic/technic/textures/technic_mining_drill_mk2.pngbin0 -> 1901 bytes
-rw-r--r--technic/technic/textures/technic_mining_drill_mk3.pngbin0 -> 1900 bytes
-rw-r--r--technic/technic/textures/technic_mining_laser_mk1.pngbin0 -> 216 bytes
-rw-r--r--technic/technic/textures/technic_mining_laser_mk2.pngbin0 -> 244 bytes
-rw-r--r--technic/technic/textures/technic_mining_laser_mk3.pngbin0 -> 312 bytes
-rw-r--r--technic/technic/textures/technic_mithril_dust.pngbin0 -> 467 bytes
-rw-r--r--technic/technic/textures/technic_mixed_metal_ingot.pngbin0 -> 426 bytes
-rw-r--r--technic/technic/textures/technic_motor.pngbin0 -> 2517 bytes
-rw-r--r--technic/technic/textures/technic_music_player_bottom.pngbin0 -> 744 bytes
-rw-r--r--technic/technic/textures/technic_music_player_side.pngbin0 -> 788 bytes
-rw-r--r--technic/technic/textures/technic_music_player_top.pngbin0 -> 916 bytes
-rw-r--r--technic/technic/textures/technic_mv_alloy_furnace_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_mv_alloy_furnace_front.pngbin0 -> 2670 bytes
-rw-r--r--technic/technic/textures/technic_mv_alloy_furnace_front_active.pngbin0 -> 2673 bytes
-rw-r--r--technic/technic/textures/technic_mv_alloy_furnace_side.pngbin0 -> 2503 bytes
-rw-r--r--technic/technic/textures/technic_mv_alloy_furnace_side_tube.pngbin0 -> 403 bytes
-rw-r--r--technic/technic/textures/technic_mv_alloy_furnace_top.pngbin0 -> 1929 bytes
-rw-r--r--technic/technic/textures/technic_mv_battery_box_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_mv_battery_box_side.pngbin0 -> 587 bytes
-rw-r--r--technic/technic/textures/technic_mv_battery_box_top.pngbin0 -> 337 bytes
-rw-r--r--technic/technic/textures/technic_mv_cable.pngbin0 -> 416 bytes
-rw-r--r--technic/technic/textures/technic_mv_cable_wield.pngbin0 -> 531 bytes
-rw-r--r--technic/technic/textures/technic_mv_centrifuge_bottom.pngbin0 -> 674 bytes
-rw-r--r--technic/technic/textures/technic_mv_centrifuge_front.pngbin0 -> 686 bytes
-rw-r--r--technic/technic/textures/technic_mv_centrifuge_front_active.pngbin0 -> 686 bytes
-rw-r--r--technic/technic/textures/technic_mv_centrifuge_side.pngbin0 -> 636 bytes
-rw-r--r--technic/technic/textures/technic_mv_centrifuge_top.pngbin0 -> 814 bytes
-rw-r--r--technic/technic/textures/technic_mv_compressor_back.pngbin0 -> 2893 bytes
-rw-r--r--technic/technic/textures/technic_mv_compressor_bottom.pngbin0 -> 2865 bytes
-rw-r--r--technic/technic/textures/technic_mv_compressor_front.pngbin0 -> 2714 bytes
-rw-r--r--technic/technic/textures/technic_mv_compressor_front_active.pngbin0 -> 2743 bytes
-rw-r--r--technic/technic/textures/technic_mv_compressor_side.pngbin0 -> 2893 bytes
-rw-r--r--technic/technic/textures/technic_mv_compressor_top.pngbin0 -> 2940 bytes
-rw-r--r--technic/technic/textures/technic_mv_down_converter_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_mv_down_converter_side.pngbin0 -> 670 bytes
-rw-r--r--technic/technic/textures/technic_mv_down_converter_top.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_mv_electric_furnace_bottom.pngbin0 -> 427 bytes
-rw-r--r--technic/technic/textures/technic_mv_electric_furnace_front.pngbin0 -> 535 bytes
-rw-r--r--technic/technic/textures/technic_mv_electric_furnace_front_active.pngbin0 -> 541 bytes
-rw-r--r--technic/technic/textures/technic_mv_electric_furnace_side.pngbin0 -> 421 bytes
-rw-r--r--technic/technic/textures/technic_mv_electric_furnace_side_tube.pngbin0 -> 2449 bytes
-rw-r--r--technic/technic/textures/technic_mv_electric_furnace_top.pngbin0 -> 1772 bytes
-rw-r--r--technic/technic/textures/technic_mv_extractor_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_mv_extractor_front.pngbin0 -> 749 bytes
-rw-r--r--technic/technic/textures/technic_mv_extractor_front_active.pngbin0 -> 778 bytes
-rw-r--r--technic/technic/textures/technic_mv_extractor_side.pngbin0 -> 726 bytes
-rw-r--r--technic/technic/textures/technic_mv_extractor_top.pngbin0 -> 542 bytes
-rw-r--r--technic/technic/textures/technic_mv_generator_front.pngbin0 -> 425 bytes
-rw-r--r--technic/technic/textures/technic_mv_generator_front_active.pngbin0 -> 440 bytes
-rw-r--r--technic/technic/textures/technic_mv_generator_side.pngbin0 -> 317 bytes
-rw-r--r--technic/technic/textures/technic_mv_generator_top.pngbin0 -> 322 bytes
-rw-r--r--technic/technic/textures/technic_mv_grinder_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_mv_grinder_front.pngbin0 -> 749 bytes
-rw-r--r--technic/technic/textures/technic_mv_grinder_front_active.pngbin0 -> 778 bytes
-rw-r--r--technic/technic/textures/technic_mv_grinder_side.pngbin0 -> 726 bytes
-rw-r--r--technic/technic/textures/technic_mv_grinder_side_tube.pngbin0 -> 739 bytes
-rw-r--r--technic/technic/textures/technic_mv_grinder_top.pngbin0 -> 542 bytes
-rw-r--r--technic/technic/textures/technic_mv_solar_array_bottom.pngbin0 -> 574 bytes
-rw-r--r--technic/technic/textures/technic_mv_solar_array_side.pngbin0 -> 628 bytes
-rw-r--r--technic/technic/textures/technic_mv_solar_array_top.pngbin0 -> 728 bytes
-rw-r--r--technic/technic/textures/technic_mv_transformer.pngbin0 -> 1748 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_back.pngbin0 -> 632 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_bottom.pngbin0 -> 38757 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_bottom_off.pngbin0 -> 556 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_bottom_on.pngbin0 -> 549 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_front_off.pngbin0 -> 653 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_front_on.pngbin0 -> 659 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_side.pngbin0 -> 38136 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_side1.pngbin0 -> 38291 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_side1_off.pngbin0 -> 616 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_side1_on.pngbin0 -> 610 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_side2.pngbin0 -> 38195 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_side2_off.pngbin0 -> 606 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_side2_on.pngbin0 -> 598 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_top.pngbin0 -> 38904 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_top_off.pngbin0 -> 556 bytes
-rw-r--r--technic/technic/textures/technic_nodebreaker_top_on.pngbin0 -> 558 bytes
-rw-r--r--technic/technic/textures/technic_power_meter.pngbin0 -> 209 bytes
-rw-r--r--technic/technic/textures/technic_power_meter0.pngbin0 -> 103 bytes
-rw-r--r--technic/technic/textures/technic_power_meter1.pngbin0 -> 193 bytes
-rw-r--r--technic/technic/textures/technic_power_meter2.pngbin0 -> 232 bytes
-rw-r--r--technic/technic/textures/technic_power_meter3.pngbin0 -> 255 bytes
-rw-r--r--technic/technic/textures/technic_power_meter4.pngbin0 -> 268 bytes
-rw-r--r--technic/technic/textures/technic_power_meter5.pngbin0 -> 275 bytes
-rw-r--r--technic/technic/textures/technic_power_meter6.pngbin0 -> 281 bytes
-rw-r--r--technic/technic/textures/technic_power_meter7.pngbin0 -> 298 bytes
-rw-r--r--technic/technic/textures/technic_power_meter8.pngbin0 -> 314 bytes
-rw-r--r--technic/technic/textures/technic_power_meter_bg.pngbin0 -> 278 bytes
-rw-r--r--technic/technic/textures/technic_power_meter_fg.pngbin0 -> 465 bytes
-rw-r--r--technic/technic/textures/technic_prospector.pngbin0 -> 367 bytes
-rw-r--r--technic/technic/textures/technic_raw_latex.pngbin0 -> 484 bytes
-rw-r--r--technic/technic/textures/technic_rubber.pngbin0 -> 587 bytes
-rw-r--r--technic/technic/textures/technic_rubber_leaves.pngbin0 -> 444 bytes
-rw-r--r--technic/technic/textures/technic_rubber_sapling.pngbin0 -> 333 bytes
-rw-r--r--technic/technic/textures/technic_rubber_tree_empty.pngbin0 -> 835 bytes
-rw-r--r--technic/technic/textures/technic_rubber_tree_full.pngbin0 -> 808 bytes
-rw-r--r--technic/technic/textures/technic_rubber_tree_grindings.pngbin0 -> 252 bytes
-rw-r--r--technic/technic/textures/technic_sawdust.pngbin0 -> 229 bytes
-rw-r--r--technic/technic/textures/technic_screwdriver.pngbin0 -> 1001 bytes
-rw-r--r--technic/technic/textures/technic_silicon_wafer.pngbin0 -> 913 bytes
-rw-r--r--technic/technic/textures/technic_silver_dust.pngbin0 -> 420 bytes
-rw-r--r--technic/technic/textures/technic_solar_panel_bottom.pngbin0 -> 579 bytes
-rw-r--r--technic/technic/textures/technic_solar_panel_side.pngbin0 -> 465 bytes
-rw-r--r--technic/technic/textures/technic_solar_panel_top.pngbin0 -> 569 bytes
-rw-r--r--technic/technic/textures/technic_sonic_screwdriver.pngbin0 -> 240 bytes
-rw-r--r--technic/technic/textures/technic_stainless_steel_dust.pngbin0 -> 445 bytes
-rw-r--r--technic/technic/textures/technic_stainless_steel_ingot.pngbin0 -> 310 bytes
-rw-r--r--technic/technic/textures/technic_supply_converter_bottom.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_supply_converter_side.pngbin0 -> 670 bytes
-rw-r--r--technic/technic/textures/technic_supply_converter_top.pngbin0 -> 738 bytes
-rw-r--r--technic/technic/textures/technic_talinite_dust.pngbin0 -> 226 bytes
-rw-r--r--technic/technic/textures/technic_tin_dust.pngbin0 -> 241 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode1.pngbin0 -> 361 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode2.pngbin0 -> 571 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode3.pngbin0 -> 622 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode4.pngbin0 -> 455 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode5.pngbin0 -> 535 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode6.pngbin0 -> 633 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode7.pngbin0 -> 481 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode8.pngbin0 -> 692 bytes
-rw-r--r--technic/technic/textures/technic_tool_mode9.pngbin0 -> 623 bytes
-rw-r--r--technic/technic/textures/technic_tree_tap.pngbin0 -> 1045 bytes
-rw-r--r--technic/technic/textures/technic_uranium_dust.pngbin0 -> 229 bytes
-rw-r--r--technic/technic/textures/technic_uranium_fuel.pngbin0 -> 158 bytes
-rw-r--r--technic/technic/textures/technic_vacuum.pngbin0 -> 705 bytes
-rw-r--r--technic/technic/textures/technic_water_can.pngbin0 -> 443 bytes
-rw-r--r--technic/technic/textures/technic_water_mill_side.pngbin0 -> 907 bytes
-rw-r--r--technic/technic/textures/technic_water_mill_top.pngbin0 -> 828 bytes
-rw-r--r--technic/technic/textures/technic_water_mill_top_active.pngbin0 -> 819 bytes
-rw-r--r--technic/technic/textures/technic_workshop_bottom.pngbin0 -> 744 bytes
-rw-r--r--technic/technic/textures/technic_workshop_side.pngbin0 -> 589 bytes
-rw-r--r--technic/technic/textures/technic_workshop_top.pngbin0 -> 555 bytes
-rw-r--r--technic/technic/textures/technic_wrought_iron_dust.pngbin0 -> 448 bytes
-rw-r--r--technic/technic/textures/technic_zinc_dust.pngbin0 -> 246 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_akalin_dust.pngbin0 -> 1156 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_alatro_dust.pngbin0 -> 1134 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_alloy_furnace_front.pngbin0 -> 2756 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_alloy_furnace_front_active.pngbin0 -> 2757 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_alloy_furnace_side.pngbin0 -> 2667 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_alloy_furnace_top.pngbin0 -> 2431 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_arol_dust.pngbin0 -> 1101 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_battery.pngbin0 -> 247 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_battery_box_bottom.pngbin0 -> 2046 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_battery_box_side0.pngbin0 -> 2313 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_battery_box_top.pngbin0 -> 2390 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_battery_reload.pngbin0 -> 8201 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_brass_dust.pngbin0 -> 1297 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_bronze_dust.pngbin0 -> 1304 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_carbon_steel_dust.pngbin0 -> 1228 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_cast_iron_dust.pngbin0 -> 1225 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_chainsaw.pngbin0 -> 17656 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_chromium_dust.pngbin0 -> 1162 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.pngbin0 -> 2957 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_coal_alloy_furnace_front.pngbin0 -> 2802 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.pngbin0 -> 2953 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_coal_alloy_furnace_side.pngbin0 -> 2667 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_coal_alloy_furnace_top.pngbin0 -> 2431 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_coal_dust.pngbin0 -> 1077 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_back.pngbin0 -> 2094 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_front_off.pngbin0 -> 2677 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_front_on.pngbin0 -> 2627 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk1_bottom_off.pngbin0 -> 2272 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk1_bottom_on.pngbin0 -> 2308 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk1_side1_off.pngbin0 -> 2327 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk1_side1_on.pngbin0 -> 2342 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk1_side2_off.pngbin0 -> 2326 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk1_side2_on.pngbin0 -> 2338 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk1_top_off.pngbin0 -> 2292 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk1_top_on.pngbin0 -> 2319 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk2_bottom_off.pngbin0 -> 2281 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk2_bottom_on.pngbin0 -> 2316 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk2_side1_off.pngbin0 -> 2339 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk2_side1_on.pngbin0 -> 2355 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk2_side2_off.pngbin0 -> 2338 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk2_side2_on.pngbin0 -> 2354 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk2_top_off.pngbin0 -> 2307 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk2_top_on.pngbin0 -> 2329 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk3_bottom_off.pngbin0 -> 2286 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk3_bottom_on.pngbin0 -> 2318 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk3_side1_off.pngbin0 -> 2378 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk3_side1_on.pngbin0 -> 2402 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk3_side2_off.pngbin0 -> 2313 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk3_side2_on.pngbin0 -> 2338 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk3_top_off.pngbin0 -> 2313 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_constructor_mk3_top_on.pngbin0 -> 2338 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_control_logic_unit.pngbin0 -> 1494 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_copper_coil.pngbin0 -> 2447 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_copper_dust.pngbin0 -> 1252 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_deployer_back.pngbin0 -> 37128 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_deployer_bottom.pngbin0 -> 38757 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_deployer_front_off.pngbin0 -> 29441 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_deployer_front_on.pngbin0 -> 23351 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_deployer_side.pngbin0 -> 38136 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_deployer_side1.pngbin0 -> 38291 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_deployer_side2.pngbin0 -> 38195 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_deployer_top.pngbin0 -> 38904 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_diamond_block_blue.pngbin0 -> 3011 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_diamond_block_green.pngbin0 -> 3033 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_diamond_block_red.pngbin0 -> 2927 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_diamond_drill_head.pngbin0 -> 978 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_doped_silicon_wafer.pngbin0 -> 867 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_electric_furnace_bottom.pngbin0 -> 2876 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_electric_furnace_front.pngbin0 -> 2912 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_electric_furnace_front_active.pngbin0 -> 2912 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_electric_furnace_side.pngbin0 -> 2917 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_electric_furnace_top.pngbin0 -> 2957 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_fine_copper_wire.pngbin0 -> 1814 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_fine_gold_wire.pngbin0 -> 1864 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_fine_silver_wire.pngbin0 -> 2187 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_flashlight.pngbin0 -> 1901 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_generator_front.pngbin0 -> 430 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_generator_front_active.pngbin0 -> 454 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_generator_side.pngbin0 -> 341 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_generator_top.pngbin0 -> 388 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_geothermal_side.pngbin0 -> 809 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_geothermal_top.pngbin0 -> 828 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_geothermal_top_active.pngbin0 -> 819 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_gold_dust.pngbin0 -> 1285 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_grinder_front.pngbin0 -> 777 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_grinder_side.pngbin0 -> 692 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_grinder_top.pngbin0 -> 465 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_grinder_bottom.pngbin0 -> 2957 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_grinder_front.pngbin0 -> 2295 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_grinder_front_active.pngbin0 -> 2337 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_grinder_side.pngbin0 -> 2497 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_grinder_side_tube.pngbin0 -> 2580 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_grinder_top.pngbin0 -> 1933 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_nuclear_reactor_core.pngbin0 -> 2545 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_solar_array_bottom.pngbin0 -> 2019 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_solar_array_side.pngbin0 -> 1772 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_solar_array_top.pngbin0 -> 2855 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_hv_transformer.pngbin0 -> 1789 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_injector_bottom.pngbin0 -> 2667 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_injector_side.pngbin0 -> 2541 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_injector_top.pngbin0 -> 2633 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_kalite_dust.pngbin0 -> 809 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_laser_beam.pngbin0 -> 119 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lava_can.pngbin0 -> 1045 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_light.pngbin0 -> 246 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_grinder_bottom.pngbin0 -> 2957 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_grinder_front.pngbin0 -> 2389 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_grinder_front_active.pngbin0 -> 2416 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_grinder_side.pngbin0 -> 2687 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_grinder_top.pngbin0 -> 2439 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_solar_array_bottom.pngbin0 -> 2019 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_solar_array_side.pngbin0 -> 1772 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_solar_array_top.pngbin0 -> 2728 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_lv_transformer.pngbin0 -> 1809 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_machine_bottom.pngbin0 -> 2876 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mining_drill.pngbin0 -> 2099 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mining_laser_mk1.pngbin0 -> 358 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mithril_dust.pngbin0 -> 1289 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_motor.pngbin0 -> 2517 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_music_player_bottom.pngbin0 -> 744 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_music_player_side.pngbin0 -> 788 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_music_player_top.pngbin0 -> 916 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.pngbin0 -> 2957 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_alloy_furnace_front.pngbin0 -> 2670 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.pngbin0 -> 2673 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_alloy_furnace_side.pngbin0 -> 2503 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.pngbin0 -> 2559 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_alloy_furnace_top.pngbin0 -> 1929 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_battery_box_bottom.pngbin0 -> 2019 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_battery_box_side0.pngbin0 -> 2309 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_battery_box_top.pngbin0 -> 2390 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_cable_wield.pngbin0 -> 2996 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_electric_furnace_bottom.pngbin0 -> 2876 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_electric_furnace_front.pngbin0 -> 2599 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_electric_furnace_front_active.pngbin0 -> 2601 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_electric_furnace_side.pngbin0 -> 2414 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.pngbin0 -> 2449 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_electric_furnace_top.pngbin0 -> 1772 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_grinder_bottom.pngbin0 -> 2957 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_grinder_front.pngbin0 -> 2328 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_grinder_front_active.pngbin0 -> 2361 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_grinder_side.pngbin0 -> 2515 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_grinder_side_tube.pngbin0 -> 2613 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_grinder_top.pngbin0 -> 1981 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_solar_array_bottom.pngbin0 -> 2019 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_solar_array_side.pngbin0 -> 1772 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_solar_array_top.pngbin0 -> 2784 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_mv_transformer.pngbin0 -> 1748 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_back.pngbin0 -> 2803 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_bottom.pngbin0 -> 2900 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_bottom_off.pngbin0 -> 3066 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_bottom_on.pngbin0 -> 3070 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_front_off.pngbin0 -> 2788 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_front_on.pngbin0 -> 2856 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_side.pngbin0 -> 2900 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_side1.pngbin0 -> 2894 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_side1_off.pngbin0 -> 3071 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_side1_on.pngbin0 -> 3073 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_side2.pngbin0 -> 2886 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_side2_off.pngbin0 -> 3062 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_side2_on.pngbin0 -> 3069 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_top.pngbin0 -> 2908 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_top_off.pngbin0 -> 3053 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_nodebreaker_top_on.pngbin0 -> 3055 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter.pngbin0 -> 209 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter1.pngbin0 -> 271 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter2.pngbin0 -> 349 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter3.pngbin0 -> 395 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter4.pngbin0 -> 434 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter5.pngbin0 -> 452 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter6.pngbin0 -> 509 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter7.pngbin0 -> 576 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter8.pngbin0 -> 655 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter_bg.pngbin0 -> 278 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_power_meter_fg.pngbin0 -> 465 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_raw_latex.pngbin0 -> 1625 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_rubber.pngbin0 -> 587 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_rubber_sapling.pngbin0 -> 333 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_rubber_tree_empty.pngbin0 -> 835 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_rubber_tree_full.pngbin0 -> 808 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_screwdriver.pngbin0 -> 1001 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_silicon_wafer.pngbin0 -> 913 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_silver_dust.pngbin0 -> 1295 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_solar_panel_bottom.pngbin0 -> 2046 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_solar_panel_side.pngbin0 -> 465 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_solar_panel_top.pngbin0 -> 569 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_sonic_screwdriver.pngbin0 -> 2064 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_stainless_steel_dust.pngbin0 -> 1145 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_talinite_dust.pngbin0 -> 1088 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_tin_dust.pngbin0 -> 1261 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_tree_tap.pngbin0 -> 1045 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_uranium_dust.pngbin0 -> 1112 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_water_can.pngbin0 -> 1041 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_water_mill_side.pngbin0 -> 907 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_water_mill_top.pngbin0 -> 828 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_water_mill_top_active.pngbin0 -> 819 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_workshop_bottom.pngbin0 -> 744 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_workshop_side.pngbin0 -> 589 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_workshop_top.pngbin0 -> 555 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_wrought_iron_dust.pngbin0 -> 1202 bytes
-rw-r--r--technic/technic/textures/technicx32/technic_zinc_dust.pngbin0 -> 1150 bytes
-rw-r--r--technic/technic/tools/cans.lua114
-rw-r--r--technic/technic/tools/chainsaw.lua366
-rw-r--r--technic/technic/tools/flashlight.lua123
-rw-r--r--technic/technic/tools/init.lua23
-rw-r--r--technic/technic/tools/mining_drill.lua419
-rw-r--r--technic/technic/tools/mining_lasers.lua178
-rw-r--r--technic/technic/tools/prospector.lua128
-rw-r--r--technic/technic/tools/sonic_screwdriver.lua98
-rw-r--r--technic/technic/tools/tree_tap.lua75
-rw-r--r--technic/technic/tools/vacuum.lua61
-rw-r--r--technic/technic_chests/README.md24
-rw-r--r--technic/technic_chests/common.lua71
-rw-r--r--technic/technic_chests/copper_chest.lua46
-rw-r--r--technic/technic_chests/depends.txt4
-rw-r--r--technic/technic_chests/gold_chest.lua57
-rw-r--r--technic/technic_chests/init.lua18
-rw-r--r--technic/technic_chests/iron_chest.lua53
-rw-r--r--technic/technic_chests/locale/de.txt41
-rw-r--r--technic/technic_chests/locale/template.txt39
-rw-r--r--technic/technic_chests/locale/tr.txt41
-rw-r--r--technic/technic_chests/mithril_chest.lua48
-rw-r--r--technic/technic_chests/register.lua303
-rw-r--r--technic/technic_chests/silver_chest.lua48
-rw-r--r--technic/technic_chests/textures/technic_checkmark_icon.pngbin0 -> 233 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_form_bg.pngbin0 -> 6404 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_black.pngbin0 -> 248 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_blue.pngbin0 -> 257 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_brown.pngbin0 -> 288 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_cyan.pngbin0 -> 259 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_dark_green.pngbin0 -> 269 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_dark_grey.pngbin0 -> 292 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_green.pngbin0 -> 278 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_grey.pngbin0 -> 299 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_magenta.pngbin0 -> 302 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_orange.pngbin0 -> 302 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_pink.pngbin0 -> 304 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_red.pngbin0 -> 262 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_violet.pngbin0 -> 287 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_white.pngbin0 -> 253 bytes
-rw-r--r--technic/technic_chests/textures/technic_chest_overlay_yellow.pngbin0 -> 274 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton0.pngbin0 -> 147 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton1.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton10.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton11.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton12.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton13.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton14.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton15.pngbin0 -> 3562 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton2.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton3.pngbin0 -> 140 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton4.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton5.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton6.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton7.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton8.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_colorbutton9.pngbin0 -> 148 bytes
-rw-r--r--technic/technic_chests/textures/technic_copper_chest_front.pngbin0 -> 607 bytes
-rw-r--r--technic/technic_chests/textures/technic_copper_chest_inventory.pngbin0 -> 7661 bytes
-rw-r--r--technic/technic_chests/textures/technic_copper_chest_lock_overlay.pngbin0 -> 160 bytes
-rw-r--r--technic/technic_chests/textures/technic_copper_chest_side.pngbin0 -> 570 bytes
-rw-r--r--technic/technic_chests/textures/technic_copper_chest_top.pngbin0 -> 557 bytes
-rw-r--r--technic/technic_chests/textures/technic_form_bg.pngbin0 -> 6404 bytes
-rw-r--r--technic/technic_chests/textures/technic_gold_chest_front.pngbin0 -> 687 bytes
-rw-r--r--technic/technic_chests/textures/technic_gold_chest_inventory.pngbin0 -> 9893 bytes
-rw-r--r--technic/technic_chests/textures/technic_gold_chest_lock_overlay.pngbin0 -> 204 bytes
-rw-r--r--technic/technic_chests/textures/technic_gold_chest_side.pngbin0 -> 743 bytes
-rw-r--r--technic/technic_chests/textures/technic_gold_chest_top.pngbin0 -> 729 bytes
-rw-r--r--technic/technic_chests/textures/technic_iron_chest_front.pngbin0 -> 750 bytes
-rw-r--r--technic/technic_chests/textures/technic_iron_chest_inventory.pngbin0 -> 7037 bytes
-rw-r--r--technic/technic_chests/textures/technic_iron_chest_lock_overlay.pngbin0 -> 153 bytes
-rw-r--r--technic/technic_chests/textures/technic_iron_chest_side.pngbin0 -> 746 bytes
-rw-r--r--technic/technic_chests/textures/technic_iron_chest_top.pngbin0 -> 860 bytes
-rw-r--r--technic/technic_chests/textures/technic_main_inventory.pngbin0 -> 7646 bytes
-rw-r--r--technic/technic_chests/textures/technic_mithril_chest_front.pngbin0 -> 770 bytes
-rw-r--r--technic/technic_chests/textures/technic_mithril_chest_inventory.pngbin0 -> 9893 bytes
-rw-r--r--technic/technic_chests/textures/technic_mithril_chest_lock_overlay.pngbin0 -> 155 bytes
-rw-r--r--technic/technic_chests/textures/technic_mithril_chest_side.pngbin0 -> 756 bytes
-rw-r--r--technic/technic_chests/textures/technic_mithril_chest_top.pngbin0 -> 775 bytes
-rw-r--r--technic/technic_chests/textures/technic_pencil_icon.pngbin0 -> 294 bytes
-rw-r--r--technic/technic_chests/textures/technic_silver_chest_front.pngbin0 -> 851 bytes
-rw-r--r--technic/technic_chests/textures/technic_silver_chest_inventory.pngbin0 -> 9163 bytes
-rw-r--r--technic/technic_chests/textures/technic_silver_chest_lock_overlay.pngbin0 -> 192 bytes
-rw-r--r--technic/technic_chests/textures/technic_silver_chest_side.pngbin0 -> 810 bytes
-rw-r--r--technic/technic_chests/textures/technic_silver_chest_top.pngbin0 -> 798 bytes
-rw-r--r--technic/technic_chests/textures/technic_wooden_chest_inventory.pngbin0 -> 5496 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_copper_chest_front.pngbin0 -> 2614 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_copper_chest_side.pngbin0 -> 2568 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_copper_chest_top.pngbin0 -> 2521 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_gold_chest_front.pngbin0 -> 2653 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_gold_chest_side.pngbin0 -> 2617 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_gold_chest_top.pngbin0 -> 2558 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_iron_chest_front.pngbin0 -> 2515 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_iron_chest_side.pngbin0 -> 2478 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_iron_chest_top.pngbin0 -> 2432 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_mithril_chest_front.pngbin0 -> 2656 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_mithril_chest_side.pngbin0 -> 2616 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_mithril_chest_top.pngbin0 -> 2558 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_silver_chest_front.pngbin0 -> 2241 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_silver_chest_side.pngbin0 -> 2146 bytes
-rw-r--r--technic/technic_chests/textures/x32/technic_silver_chest_top.pngbin0 -> 2226 bytes
-rw-r--r--technic/technic_chests/wooden_chest.lua51
-rw-r--r--technic/technic_worldgen/config.lua15
-rw-r--r--technic/technic_worldgen/crafts.lua198
-rw-r--r--technic/technic_worldgen/depends.txt3
-rw-r--r--technic/technic_worldgen/init.lua26
-rw-r--r--technic/technic_worldgen/locale/de.txt39
-rw-r--r--technic/technic_worldgen/locale/template.txt37
-rw-r--r--technic/technic_worldgen/locale/tr.txt38
-rw-r--r--technic/technic_worldgen/mg.lua90
-rw-r--r--technic/technic_worldgen/nodes.lua196
-rw-r--r--technic/technic_worldgen/oregen.lua191
-rw-r--r--technic/technic_worldgen/rubber.lua100
-rw-r--r--technic/technic_worldgen/textures/technic_brass_block.pngbin0 -> 649 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_brass_dust.pngbin0 -> 464 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_brass_ingot.pngbin0 -> 377 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_carbon_steel_block.pngbin0 -> 606 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_carbon_steel_ingot.pngbin0 -> 354 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_cast_iron_block.pngbin0 -> 606 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_cast_iron_ingot.pngbin0 -> 353 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_chromium_block.pngbin0 -> 611 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_chromium_ingot.pngbin0 -> 337 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_chromium_lump.pngbin0 -> 313 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_granite.pngbin0 -> 947 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_lead_block.pngbin0 -> 340 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_lead_dust.pngbin0 -> 232 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_lead_ingot.pngbin0 -> 248 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_lead_lump.pngbin0 -> 228 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_marble.pngbin0 -> 807 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_marble_bricks.pngbin0 -> 959 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_mineral_chromium.pngbin0 -> 887 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_mineral_lead.pngbin0 -> 290 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_mineral_sulfur.pngbin0 -> 237 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_mineral_uranium.pngbin0 -> 912 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_mineral_zinc.pngbin0 -> 891 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_rubber.pngbin0 -> 587 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_rubber_leaves.pngbin0 -> 444 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_rubber_sapling.pngbin0 -> 333 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_rubber_tree_empty.pngbin0 -> 835 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_rubber_tree_full.pngbin0 -> 808 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_rubber_tree_grindings.pngbin0 -> 252 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_stainless_steel_block.pngbin0 -> 589 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_sulfur_dust.pngbin0 -> 220 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_sulfur_lump.pngbin0 -> 172 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_uranium_block.pngbin0 -> 649 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_uranium_ingot.pngbin0 -> 300 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_uranium_lump.pngbin0 -> 352 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_wrought_iron_block.pngbin0 -> 572 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_wrought_iron_ingot.pngbin0 -> 334 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_zinc_block.pngbin0 -> 681 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_zinc_ingot.pngbin0 -> 341 bytes
-rw-r--r--technic/technic_worldgen/textures/technic_zinc_lump.pngbin0 -> 308 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_brass_ingot.pngbin0 -> 456 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_chromium_ingot.pngbin0 -> 242 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_chromium_lump.pngbin0 -> 213 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_concrete_block.pngbin0 -> 2319 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_granite.pngbin0 -> 947 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_marble.pngbin0 -> 807 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_marble_bricks.pngbin0 -> 959 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_mineral_chromium.pngbin0 -> 887 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_mineral_uranium.pngbin0 -> 912 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_mineral_zinc.pngbin0 -> 891 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_rebar.pngbin0 -> 813 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_stainless_steel_ingot.pngbin0 -> 230 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_uranium.pngbin0 -> 213 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_zinc_ingot.pngbin0 -> 242 bytes
-rw-r--r--technic/technic_worldgen/textures/x32/technic_zinc_lump.pngbin0 -> 214 bytes
-rw-r--r--technic/wrench/depends.txt6
-rw-r--r--technic/wrench/init.lua162
-rw-r--r--technic/wrench/locale/de.txt7
-rw-r--r--technic/wrench/locale/template.txt5
-rw-r--r--technic/wrench/locale/tr.txt5
-rw-r--r--technic/wrench/support.lua73
-rw-r--r--technic/wrench/technic.lua343
-rw-r--r--technic/wrench/textures/technic_wrench.pngbin0 -> 249 bytes
862 files changed, 18202 insertions, 0 deletions
diff --git a/technic/.mailmap b/technic/.mailmap
new file mode 100644
index 0000000..cf45bc3
--- /dev/null
+++ b/technic/.mailmap
@@ -0,0 +1,4 @@
+RealBadAngel <maciej.kasatkin@o2.pl> <mk@realbadangel.pl>
+Vanessa Ezekowitz <vanessaezekowitz@gmail.com>
+Vanessa Ezekowitz <vanessaezekowitz@gmail.com> <vanessa@rainbird.(none)>
+kaeza <kaeza@users.sf.net> Diego Martínez <kaeza@users.sf.net>
diff --git a/technic/README.md b/technic/README.md
new file mode 100644
index 0000000..406deab
--- /dev/null
+++ b/technic/README.md
@@ -0,0 +1,23 @@
+Technic
+=======
+
+Credits for contributing to the project (in alphabetical order):
+ * kpoppel
+ * Nekogloop
+ * Nore/Ekdohibs
+ * ShadowNinja
+ * VanessaE
+ * And many others...
+
+FAQ
+---
+
+1. My technic circuit doesn't work. No power is distrubuted.
+ * A: Make sure you have a switching station connected.
+
+License
+-------
+
+Unless otherwise stated, all components of this modpack are licensed under the
+LGPL, V2 or later. See also the individual mod folders for their
+secondary/alternate licenses, if any.
diff --git a/technic/concrete/depends.txt b/technic/concrete/depends.txt
new file mode 100644
index 0000000..c48fe0d
--- /dev/null
+++ b/technic/concrete/depends.txt
@@ -0,0 +1,3 @@
+default
+intllib?
+
diff --git a/technic/concrete/init.lua b/technic/concrete/init.lua
new file mode 100644
index 0000000..d1fa1aa
--- /dev/null
+++ b/technic/concrete/init.lua
@@ -0,0 +1,274 @@
+--Minetest 0.4.7 mod: concrete
+--(c) 2013 by RealBadAngel <mk@realbadangel.pl>
+
+local technic = rawget(_G, "technic") or {}
+technic.concrete_posts = {}
+
+-- Boilerplate to support localized strings if intllib mod is installed.
+local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
+
+minetest.register_alias("technic:concrete_post", "technic:concrete_post0")
+minetest.register_alias("technic:concrete_post32", "technic:concrete_post12")
+minetest.register_alias("technic:concrete_post33", "technic:concrete_post3")
+minetest.register_alias("technic:concrete_post34", "technic:concrete_post28")
+minetest.register_alias("technic:concrete_post35", "technic:concrete_post19")
+
+local steel_ingot
+if minetest.get_modpath("technic_worldgen") then
+ steel_ingot = "technic:carbon_steel_ingot"
+else
+ steel_ingot = "default:steel_ingot"
+end
+
+minetest.register_craft({
+ output = 'technic:rebar 6',
+ recipe = {
+ {'','', steel_ingot},
+ {'',steel_ingot,''},
+ {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_platform 6',
+ recipe = {
+ {'technic:concrete','technic:concrete_post0','technic:concrete'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:concrete_post0 12',
+ recipe = {
+ {'default:stone','technic:rebar','default:stone'},
+ {'default:stone','technic:rebar','default:stone'},
+ {'default:stone','technic:rebar','default:stone'},
+}
+})
+
+minetest.register_craft({
+ output = 'technic:blast_resistant_concrete 5',
+ recipe = {
+ {'technic:concrete','technic:composite_plate','technic:concrete'},
+ {'technic:composite_plate','technic:concrete','technic:composite_plate'},
+ {'technic:concrete','technic:composite_plate','technic:concrete'},
+ }
+})
+
+local box_platform = {-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}
+local box_center = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}
+local box_x1 = {0, -0.3, -0.1, 0.5, 0.3, 0.1}
+local box_z1 = {-0.1, -0.3, 0, 0.1, 0.3, 0.5}
+local box_x2 = {0, -0.3, -0.1, -0.5, 0.3, 0.1}
+local box_z2 = {-0.1, -0.3, 0, 0.1, 0.3, -0.5}
+
+minetest.register_craftitem(":technic:rebar", {
+ description = S("Rebar"),
+ inventory_image = "technic_rebar.png",
+})
+
+minetest.register_node(":technic:concrete", {
+ description = S("Concrete Block"),
+ tiles = {"technic_concrete_block.png",},
+ groups = {cracky=1, level=2, concrete=1},
+ sounds = default.node_sound_stone_defaults(),
+ after_place_node = function(pos, placer, itemstack)
+ technic.update_posts(pos, false)
+ end,
+ after_dig_node = function (pos, oldnode, oldmetadata, digger)
+ technic.update_posts(pos, false)
+ end,
+})
+
+minetest.register_node(":technic:blast_resistant_concrete", {
+ description = S("Blast-resistant Concrete Block"),
+ tiles = {"technic_blast_resistant_concrete_block.png",},
+ groups={cracky=1, level=3, concrete=1},
+ sounds = default.node_sound_stone_defaults(),
+ after_place_node = function(pos, player, itemstack)
+ technic.update_posts(pos, false)
+ end,
+ after_dig_node = function (pos, oldnode, oldmetadata, digger)
+ technic.update_posts(pos, false)
+ end,
+})
+
+minetest.register_node(":technic:concrete_post_platform", {
+ description = S("Concrete Post Platform"),
+ tiles = {"technic_concrete_block.png",},
+ groups={cracky=1, level=2},
+ sounds = default.node_sound_stone_defaults(),
+ paramtype = "light",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {box_platform}
+ },
+ on_place = function (itemstack, placer, pointed_thing)
+ local node = minetest.get_node(pointed_thing.under)
+ if not technic.concrete_posts[node.name] then
+ return minetest.item_place_node(itemstack, placer, pointed_thing)
+ end
+ local links = technic.concrete_posts[node.name]
+ if links[6] ~= 0 then -- The post already has a platform
+ return minetest.item_place_node(itemstack, placer, pointed_thing)
+ end
+ local id = technic.get_post_id({links[1], links[2], links[3], links[4], links[5], 1})
+ minetest.set_node(pointed_thing.under, {name="technic:concrete_post"..id})
+ itemstack:take_item()
+ placer:set_wielded_item(itemstack)
+ return itemstack
+ end,
+})
+
+local function gen_post_nodebox(x1, x2, z1, z2, y, platform)
+ local box
+ local xx = x1 + x2
+ local zz = z1 + z2
+ if ((xx == 2 and zz == 0) or (xx == 0 and zz == 2)) and y == 0 then
+ box = {}
+ else
+ box = {box_center}
+ end
+ if x1 ~= 0 then
+ table.insert(box, box_x1)
+ end
+ if x2 ~= 0 then
+ table.insert(box, box_x2)
+ end
+ if z1 ~= 0 then
+ table.insert(box, box_z1)
+ end
+ if z2 ~= 0 then
+ table.insert(box, box_z2)
+ end
+ if platform ~= 0 then
+ table.insert(box, box_platform)
+ end
+ return box
+end
+
+local function dig_post_with_platform(pos, oldnode, oldmetadata)
+ oldnode.name = "technic:concrete_post0"
+ minetest.set_node(pos, oldnode)
+ technic.update_posts(pos, true)
+end
+
+function technic.posts_should_connect(pos)
+ local node = minetest.get_node(pos)
+ if technic.concrete_posts[node.name] then
+ return "post"
+ elseif minetest.get_item_group(node.name, "concrete") ~= 0 then
+ return "block"
+ end
+end
+
+function technic.get_post_id(links)
+ return (links[1] * 1) + (links[2] * 2)
+ + (links[3] * 4) + (links[4] * 8)
+ + (links[5] * 16) + (links[6] * 32)
+end
+
+function technic.update_posts(pos, set, secondrun)
+ local node = minetest.get_node(pos)
+ local link_positions = {
+ {x=pos.x+1, y=pos.y, z=pos.z},
+ {x=pos.x-1, y=pos.y, z=pos.z},
+ {x=pos.x, y=pos.y, z=pos.z+1},
+ {x=pos.x, y=pos.y, z=pos.z-1},
+ {x=pos.x, y=pos.y-1, z=pos.z},
+ {x=pos.x, y=pos.y+1, z=pos.z},
+ }
+
+ local links = {0, 0, 0, 0, 0, 0}
+
+ for i, link_pos in pairs(link_positions) do
+ local connecttype = technic.posts_should_connect(link_pos)
+ if connecttype then
+ links[i] = 1
+ -- Have posts next to us update theirselves,
+ -- but only once. (We don't want to start an
+ -- infinite loop of updates)
+ if not secondrun and connecttype == "post" then
+ technic.update_posts(link_pos, true, true)
+ end
+ end
+ end
+
+ if links[5] == 1 or links[6] == 1 then
+ links[5] = 1
+ links[6] = 0
+ end
+
+ -- We don't want to set ourselves if we have been removed or we are
+ -- updating a concrete node
+ if set then
+ -- Preserve platform
+ local oldlinks = technic.concrete_posts[node.name]
+ if oldlinks then
+ links[6] = oldlinks[6]
+ end
+ minetest.set_node(pos, {name="technic:concrete_post"
+ ..technic.get_post_id(links)})
+ end
+end
+
+for x1 = 0, 1 do
+for x2 = 0, 1 do
+for z1 = 0, 1 do
+for z2 = 0, 1 do
+for y = 0, 1 do
+for platform = 0, 1 do
+ local links = {x1, x2, z1, z2, y, platform}
+ local id = technic.get_post_id(links)
+ technic.concrete_posts["technic:concrete_post"..id] = links
+
+ local groups = {cracky=1, level=2, concrete_post=1}
+ if id ~= 0 then
+ groups.not_in_creative_inventory = 1
+ end
+
+ local drop = "technic:concrete_post0"
+ local after_dig_node = function(pos, oldnode, oldmetadata, digger)
+ technic.update_posts(pos, false)
+ end
+ if platform ~= 0 then
+ drop = "technic:concrete_post_platform"
+ after_dig_node = function(pos, oldnode, oldmetadata, digger)
+ dig_post_with_platform(pos, oldnode, oldmetadata)
+ end
+ end
+
+ minetest.register_node(":technic:concrete_post"..id, {
+ description = S("Concrete Post"),
+ tiles = {"technic_concrete_block.png"},
+ groups = groups,
+ sounds = default.node_sound_stone_defaults(),
+ drop = drop,
+ paramtype = "light",
+ sunlight_propagates = true,
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = gen_post_nodebox(x1, x2, z1, z2, y, platform),
+ },
+ after_place_node = function(pos, placer, itemstack)
+ technic.update_posts(pos, true)
+ end,
+ after_dig_node = after_dig_node,
+ })
+end
+end
+end
+end
+end
+end
+
diff --git a/technic/concrete/locale/de.txt b/technic/concrete/locale/de.txt
new file mode 100644
index 0000000..83fdc19
--- /dev/null
+++ b/technic/concrete/locale/de.txt
@@ -0,0 +1,10 @@
+# German Translation for technic_concrete
+# Deutsche Übersetzung von technic_concrete
+# by Xanthin
+
+Rebar = Bewehrungsstab
+Concrete Block = Betonblock
+Blast-resistant Concrete Block = Explosionsbestaendiger Betonblock
+Concrete Post Platform = Betonpfostenplattform
+Concrete Post = Betonpfosten
+
diff --git a/technic/concrete/locale/template.txt b/technic/concrete/locale/template.txt
new file mode 100644
index 0000000..451adaf
--- /dev/null
+++ b/technic/concrete/locale/template.txt
@@ -0,0 +1,8 @@
+# technic_concrete translation template
+
+Rebar =
+Concrete Block =
+Blast-resistant Concrete Block =
+Concrete Post Platform =
+Concrete Post =
+
diff --git a/technic/concrete/locale/tr.txt b/technic/concrete/locale/tr.txt
new file mode 100644
index 0000000..179d29b
--- /dev/null
+++ b/technic/concrete/locale/tr.txt
@@ -0,0 +1,7 @@
+# turkish translation by mahmutelmas06
+
+Rebar = Beton demiri
+Concrete Block = Beton blok
+Blast-resistant Concrete Block = Patlamaya dayanıklı beton blok
+Concrete Post Platform = Beton direk platformu
+Concrete Post = Beton direk
diff --git a/technic/concrete/textures/technic_blast_resistant_concrete_block.png b/technic/concrete/textures/technic_blast_resistant_concrete_block.png
new file mode 100644
index 0000000..b7d8588
--- /dev/null
+++ b/technic/concrete/textures/technic_blast_resistant_concrete_block.png
Binary files differ
diff --git a/technic/concrete/textures/technic_concrete_block.png b/technic/concrete/textures/technic_concrete_block.png
new file mode 100644
index 0000000..cd94594
--- /dev/null
+++ b/technic/concrete/textures/technic_concrete_block.png
Binary files differ
diff --git a/technic/concrete/textures/technic_rebar.png b/technic/concrete/textures/technic_rebar.png
new file mode 100644
index 0000000..16d1fc5
--- /dev/null
+++ b/technic/concrete/textures/technic_rebar.png
Binary files differ
diff --git a/technic/concrete/textures/x32/technic_concrete_block.png b/technic/concrete/textures/x32/technic_concrete_block.png
new file mode 100644
index 0000000..91364f3
--- /dev/null
+++ b/technic/concrete/textures/x32/technic_concrete_block.png
Binary files differ
diff --git a/technic/concrete/textures/x32/technic_rebar.png b/technic/concrete/textures/x32/technic_rebar.png
new file mode 100644
index 0000000..16d1fc5
--- /dev/null
+++ b/technic/concrete/textures/x32/technic_rebar.png
Binary files differ
diff --git a/technic/extranodes/depends.txt b/technic/extranodes/depends.txt
new file mode 100644
index 0000000..6335bfd
--- /dev/null
+++ b/technic/extranodes/depends.txt
@@ -0,0 +1,5 @@
+default
+technic_worldgen
+concrete
+intllib?
+moreblocks?
diff --git a/technic/extranodes/init.lua b/technic/extranodes/init.lua
new file mode 100644
index 0000000..22a1d9f
--- /dev/null
+++ b/technic/extranodes/init.lua
@@ -0,0 +1,103 @@
+-- Minetest 0.4.6 mod: extranodes
+-- namespace: technic
+-- Boilerplate to support localized strings if intllib mod is installed.
+local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
+
+if minetest.get_modpath("moreblocks") then
+
+ -- register stairsplus/circular_saw nodes
+ -- we skip blast resistant concrete and uranium intentionally
+ -- chrome seems to be too hard of a metal to be actually sawable
+
+ stairsplus:register_all("technic", "marble", "technic:marble", {
+ description=S("Marble"),
+ groups={cracky=3, not_in_creative_inventory=1},
+ tiles={"technic_marble.png"},
+ })
+
+ stairsplus:register_all("technic", "marble_bricks", "technic:marble_bricks", {
+ description=S("Marble Bricks"),
+ groups={cracky=3, not_in_creative_inventory=1},
+ tiles={"technic_marble_bricks.png"},
+ })
+
+ stairsplus:register_all("technic", "granite", "technic:granite", {
+ description=S("Granite"),
+ groups={cracky=1, not_in_creative_inventory=1},
+ tiles={"technic_granite.png"},
+ })
+
+ stairsplus:register_all("technic", "concrete", "technic:concrete", {
+ description=S("Concrete"),
+ groups={cracky=3, not_in_creative_inventory=1},
+ tiles={"technic_concrete_block.png"},
+ })
+
+ stairsplus:register_all("technic", "zinc_block", "technic:zinc_block", {
+ description=S("Zinc Block"),
+ groups={cracky=1, not_in_creative_inventory=1},
+ tiles={"technic_zinc_block.png"},
+ })
+
+ stairsplus:register_all("technic", "cast_iron_block", "technic:cast_iron_block", {
+ description=S("Cast Iron Block"),
+ groups={cracky=1, not_in_creative_inventory=1},
+ tiles={"technic_cast_iron_block.png"},
+ })
+
+ stairsplus:register_all("technic", "carbon_steel_block", "technic:carbon_steel_block", {
+ description=S("Carbon Steel Block"),
+ groups={cracky=1, not_in_creative_inventory=1},
+ tiles={"technic_carbon_steel_block.png"},
+ })
+
+ stairsplus:register_all("technic", "stainless_steel_block", "technic:stainless_steel_block", {
+ description=S("Stainless Steel Block"),
+ groups={cracky=1, not_in_creative_inventory=1},
+ tiles={"technic_stainless_steel_block.png"},
+ })
+
+ stairsplus:register_all("technic", "brass_block", "technic:brass_block", {
+ description=S("Brass Block"),
+ groups={cracky=1, not_in_creative_inventory=1},
+ tiles={"technic_brass_block.png"},
+ })
+
+ function register_technic_stairs_alias(modname, origname, newmod, newname)
+ minetest.register_alias(modname .. ":slab_" .. origname, newmod..":slab_" .. newname)
+ minetest.register_alias(modname .. ":slab_" .. origname .. "_inverted", newmod..":slab_" .. newname .. "_inverted")
+ minetest.register_alias(modname .. ":slab_" .. origname .. "_wall", newmod..":slab_" .. newname .. "_wall")
+ minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter", newmod..":slab_" .. newname .. "_quarter")
+ minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter_inverted", newmod..":slab_" .. newname .. "_quarter_inverted")
+ minetest.register_alias(modname .. ":slab_" .. origname .. "_quarter_wall", newmod..":slab_" .. newname .. "_quarter_wall")
+ minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter", newmod..":slab_" .. newname .. "_three_quarter")
+ minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter_inverted", newmod..":slab_" .. newname .. "_three_quarter_inverted")
+ minetest.register_alias(modname .. ":slab_" .. origname .. "_three_quarter_wall", newmod..":slab_" .. newname .. "_three_quarter_wall")
+ minetest.register_alias(modname .. ":stair_" .. origname, newmod..":stair_" .. newname)
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_inverted", newmod..":stair_" .. newname .. "_inverted")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_wall", newmod..":stair_" .. newname .. "_wall")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half", newmod..":stair_" .. newname .. "_wall_half")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half_inverted", newmod..":stair_" .. newname .. "_wall_half_inverted")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_half", newmod..":stair_" .. newname .. "_half")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_half_inverted", newmod..":stair_" .. newname .. "_half_inverted")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_right_half", newmod..":stair_" .. newname .. "_right_half")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_right_half_inverted", newmod..":stair_" .. newname .. "_right_half_inverted")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half", newmod..":stair_" .. newname .. "_wall_half")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_wall_half_inverted", newmod..":stair_" .. newname .. "_wall_half_inverted")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_inner", newmod..":stair_" .. newname .. "_inner")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_inner_inverted", newmod..":stair_" .. newname .. "_inner_inverted")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_outer", newmod..":stair_" .. newname .. "_outer")
+ minetest.register_alias(modname .. ":stair_" .. origname .. "_outer_inverted", newmod..":stair_" .. newname .. "_outer_inverted")
+ minetest.register_alias(modname .. ":panel_" .. origname .. "_bottom", newmod..":panel_" .. newname .. "_bottom")
+ minetest.register_alias(modname .. ":panel_" .. origname .. "_top", newmod..":panel_" .. newname .. "_top")
+ minetest.register_alias(modname .. ":panel_" .. origname .. "_vertical", newmod..":panel_" .. newname .. "_vertical")
+ minetest.register_alias(modname .. ":micro_" .. origname .. "_bottom", newmod..":micro_" .. newname .. "_bottom")
+ minetest.register_alias(modname .. ":micro_" .. origname .. "_top", newmod..":micro_" .. newname .. "_top")
+ end
+
+ register_technic_stairs_alias("stairsplus", "concrete", "technic", "concrete")
+ register_technic_stairs_alias("stairsplus", "marble", "technic", "marble")
+ register_technic_stairs_alias("stairsplus", "granite", "technic", "granite")
+ register_technic_stairs_alias("stairsplus", "marble_bricks", "technic", "marble_bricks")
+
+end
diff --git a/technic/extranodes/locale/de.txt b/technic/extranodes/locale/de.txt
new file mode 100644
index 0000000..f3c017e
--- /dev/null
+++ b/technic/extranodes/locale/de.txt
@@ -0,0 +1,9 @@
+# German Translation for technic_extranodes
+# Deutsche Übersetzung von technic_extranodes
+# by Xanthin
+
+Marble = Marmor
+Marble Bricks = Marmorziegel
+Granite = Granit
+Concrete = Beton
+
diff --git a/technic/extranodes/locale/template.txt b/technic/extranodes/locale/template.txt
new file mode 100644
index 0000000..2ffe498
--- /dev/null
+++ b/technic/extranodes/locale/template.txt
@@ -0,0 +1,7 @@
+# technic_extranodes translation template
+
+Marble =
+Marble Bricks =
+Granite =
+Concrete =
+
diff --git a/technic/extranodes/locale/tr.txt b/technic/extranodes/locale/tr.txt
new file mode 100644
index 0000000..90d8154
--- /dev/null
+++ b/technic/extranodes/locale/tr.txt
@@ -0,0 +1,6 @@
+# turkish translation by mahmutelmas06
+
+Marble = Mermer
+Marble Bricks = Mermer tuğla
+Granite = Granit
+Concrete = Beton
diff --git a/technic/manual.md b/technic/manual.md
new file mode 100644
index 0000000..9031792
--- /dev/null
+++ b/technic/manual.md
@@ -0,0 +1,1488 @@
+Minetest technic modpack user manual
+====================================
+
+The technic modpack extends the Minetest game with many new elements,
+mainly constructable machines and tools. It is a large modpack, and
+tends to dominate gameplay when it is used. This manual describes how
+to use the technic modpack, mainly from a player's perspective.
+
+The technic modpack depends on some other modpacks:
+
+* the basic Minetest game
+* mesecons, which supports the construction of logic systems based on
+ signalling elements
+* pipeworks, which supports the automation of item transport
+* moreores, which provides some additional ore types
+
+This manual doesn't explain how to use these other modpacks, which ought
+to (but actually don't) have their own manuals.
+
+Recipes for constructable items in technic are generally not guessable,
+and are also not specifically documented here. You should use a
+craft guide mod to look up the recipes in-game. For the best possible
+guidance, use the unified\_inventory mod, with which technic registers
+its specialised recipe types.
+
+substances
+----------
+
+### ore ###
+
+The technic mod makes extensive use of not just the default ores but also
+some that are added by mods. You will need to mine for all the ore types
+in the course of the game. Each ore type is found at a specific range of
+elevations, and while the ranges mostly overlap, some have non-overlapping
+ranges, so you will ultimately need to mine at more than one elevation
+to find all the ores. Also, because one of the best elevations to mine
+at is very deep, you will be unable to mine there early in the game.
+
+Elevation is measured in meters, relative to a reference plane that
+is not quite sea level. (The standard sea level is at an elevation
+of about +1.4.) Positive elevations are above the reference plane and
+negative elevations below. Because elevations are always described this
+way round, greater numbers when higher, we avoid the word "depth".
+
+The ores that matter in technic are coal, iron, copper, tin, zinc,
+chromium, uranium, silver, gold, mithril, mese, and diamond.
+
+Coal is part of the basic Minetest game. It is found from elevation
++64 downwards, so is available right on the surface at the start of
+the game, but it is far less abundant above elevation 0 than below.
+It is initially used as a fuel, driving important machines in the early
+part of the game. It becomes less important as a fuel once most of your
+machines are electrically powered, but burning fuel remains a way to
+generate electrical power. Coal is also used, usually in dust form, as
+an ingredient in alloying recipes, wherever elemental carbon is required.
+
+Iron is part of the basic Minetest game. It is found from elevation
++2 downwards, and its abundance increases in stages as one descends,
+reaching its maximum from elevation -64 downwards. It is a common metal,
+used frequently as a structural component. In technic, unlike the basic
+game, iron is used in multiple forms, mainly alloys based on iron and
+including carbon (coal).
+
+Copper is part of the basic Minetest game (having migrated there from
+moreores). It is found from elevation -16 downwards, but is more abundant
+from elevation -64 downwards. It is a common metal, used either on its
+own for its electrical conductivity, or as the base component of alloys.
+Although common, it is very heavily used, and most of the time it will
+be the material that most limits your activity.
+
+Tin is supplied by the moreores mod. It is found from elevation +8
+downwards, with no elevation-dependent variations in abundance beyond
+that point. It is a common metal. Its main use in pure form is as a
+component of electrical batteries. Apart from that its main purpose is
+as the secondary ingredient in bronze (the base being copper), but bronze
+is itself little used. Its abundance is well in excess of its usage,
+so you will usually have a surplus of it.
+
+Zinc is supplied by technic. It is found from elevation +2 downwards,
+with no elevation-dependent variations in abundance beyond that point.
+It is a common metal. Its main use is as the secondary ingredient
+in brass (the base being copper), but brass is itself little used.
+Its abundance is well in excess of its usage, so you will usually have
+a surplus of it.
+
+Chromium is supplied by technic. It is found from elevation -100
+downwards, with no elevation-dependent variations in abundance beyond
+that point. It is a moderately common metal. Its main use is as the
+secondary ingredient in stainless steel (the base being iron).
+
+Uranium is supplied by technic. It is found only from elevation -80 down
+to -300; using it therefore requires one to mine above elevation -300 even
+though deeper mining is otherwise more productive. It is a moderately
+common metal, useful only for reasons related to radioactivity: it forms
+the fuel for nuclear reactors, and is also one of the best radiation
+shielding materials available. It is not difficult to find enough uranium
+ore to satisfy these uses. Beware that the ore is slightly radioactive:
+it will slightly harm you if you stand as close as possible to it.
+It is safe when more than a meter away or when mined.
+
+Silver is supplied by the moreores mod. It is found from elevation -2
+downwards, with no elevation-dependent variations in abundance beyond
+that point. It is a semi-precious metal. It is little used, being most
+notably used in electrical items due to its conductivity, being the best
+conductor of all the pure elements.
+
+Gold is part of the basic Minetest game (having migrated there from
+moreores). It is found from elevation -64 downwards, but is more
+abundant from elevation -256 downwards. It is a precious metal. It is
+little used, being most notably used in electrical items due to its
+combination of good conductivity (third best of all the pure elements)
+and corrosion resistance.
+
+Mithril is supplied by the moreores mod. It is found from elevation
+-512 downwards, the deepest ceiling of any minable substance, with
+no elevation-dependent variations in abundance beyond that point.
+It is a rare precious metal, and unlike all the other metals described
+here it is entirely fictional, being derived from J. R. R. Tolkien's
+Middle-Earth setting. It is little used.
+
+Mese is part of the basic Minetest game. It is found from elevation
+-64 downwards. The ore is more abundant from elevation -256 downwards,
+and from elevation -1024 downwards there are also occasional blocks of
+solid mese (each yielding as much mese as nine blocks of ore). It is a
+precious gemstone, and unlike diamond it is entirely fictional. It is
+used in many recipes, though mainly not in large quantities, wherever
+some magical quality needs to be imparted.
+
+Diamond is part of the basic Minetest game (having migrated there from
+technic). It is found from elevation -128 downwards, but is more abundant
+from elevation -256 downwards. It is a precious gemstone. It is used
+moderately, mainly for reasons connected to its extreme hardness.
+
+### rock ###
+
+In addition to the ores, there are multiple kinds of rock that need to be
+mined in their own right, rather than for minerals. The rock types that
+matter in technic are standard stone, desert stone, marble, and granite.
+
+Standard stone is part of the basic Minetest game. It is extremely
+common. As in the basic game, when dug it yields cobblestone, which can
+be cooked to turn it back into standard stone. Cobblestone is used in
+recipes only for some relatively primitive machines. Standard stone is
+used in a couple of machine recipes. These rock types gain additional
+significance with technic because the grinder can be used to turn them
+into dirt and sand. This, especially when combined with an automated
+cobblestone generator, can be an easier way to acquire sand than
+collecting it where it occurs naturally.
+
+Desert stone is part of the basic Minetest game. It is found specifically
+in desert biomes, and only from elevation +2 upwards. Although it is
+easily accessible, therefore, its quantity is ultimately quite limited.
+It is used in a few recipes.
+
+Marble is supplied by technic. It is found in dense clusters from
+elevation -50 downwards. It has mainly decorative use, but also appears
+in one machine recipe.
+
+Granite is supplied by technic. It is found in dense clusters from
+elevation -150 downwards. It is much harder to dig than standard stone,
+so impedes mining when it is encountered. It has mainly decorative use,
+but also appears in a couple of machine recipes.
+
+### rubber ###
+
+Rubber is a biologically-derived material that has industrial uses due
+to its electrical resistivity and its impermeability. In technic, it
+is used in a few recipes, and it must be acquired by tapping rubber trees.
+
+If you have the moretrees mod installed, the rubber trees you need
+are those defined by that mod. If not, technic supplies a copy of the
+moretrees rubber tree.
+
+Extracting rubber requires a specific tool, a tree tap. Using the tree
+tap (by left-clicking) on a rubber tree trunk block extracts a lump of
+raw latex from the trunk. Each trunk block can be repeatedly tapped for
+latex, at intervals of several minutes; its appearance changes to show
+whether it is currently ripe for tapping. Each tree has several trunk
+blocks, so several latex lumps can be extracted from a tree in one visit.
+
+Raw latex isn't used directly. It must be vulcanized to produce finished
+rubber. This can be performed by alloying the latex with coal dust.
+
+### metal ###
+
+Many of the substances important in technic are metals, and there is
+a common pattern in how metals are handled. Generally, each metal can
+exist in five forms: ore, lump, dust, ingot, and block. With a couple of
+tricky exceptions in mods outside technic, metals are only *used* in dust,
+ingot, and block forms. Metals can be readily converted between these
+three forms, but can't be converted from them back to ore or lump forms.
+
+As in the basic Minetest game, a "lump" of metal is acquired directly by
+digging ore, and will then be processed into some other form for use.
+A lump is thus more akin to ore than to refined metal. (In real life,
+metal ore rarely yields lumps ("nuggets") of pure metal directly.
+More often the desired metal is chemically bound into the rock as an
+oxide or some other compound, and the ore must be chemically processed
+to yield pure metal.)
+
+Not all metals occur directly as ore. Generally, elemental metals (those
+consisting of a single chemical element) occur as ore, and alloys (those
+consisting of a mixture of multiple elements) do not. In fact, if the
+fictional mithril is taken to be elemental, this pattern is currently
+followed perfectly. (It is not clear in the Middle-Earth setting whether
+mithril is elemental or an alloy.) This might change in the future:
+in real life some alloys do occur as ore, and some elemental metals
+rarely occur naturally outside such alloys. Metals that do not occur
+as ore also lack the "lump" form.
+
+The basic Minetest game offers a single way to refine metals: cook a lump
+in a furnace to produce an ingot. With technic this refinement method
+still exists, but is rarely used outside the early part of the game,
+because technic offers a more efficient method once some machines have
+been built. The grinder, available only in electrically-powered forms,
+can grind a metal lump into two piles of metal dust. Each dust pile
+can then be cooked into an ingot, yielding two ingots from one lump.
+This doubling of material value means that you should only cook a lump
+directly when you have no choice, mainly early in the game when you
+haven't yet built a grinder.
+
+An ingot can also be ground back to (one pile of) dust. Thus it is always
+possible to convert metal between ingot and dust forms, at the expense
+of some energy consumption. Nine ingots of a metal can be crafted into
+a block, which can be used for building. The block can also be crafted
+back to nine ingots. Thus it is possible to freely convert metal between
+ingot and block forms, which is convenient to store the metal compactly.
+Every metal has dust, ingot, and block forms.
+
+Alloying recipes in which a metal is the base ingredient, to produce a
+metal alloy, always come in two forms, using the metal either as dust
+or as an ingot. If the secondary ingredient is also a metal, it must
+be supplied in the same form as the base ingredient. The output alloy
+is also returned in the same form. For example, brass can be produced
+by alloying two copper ingots with one zinc ingot to make three brass
+ingots, or by alloying two piles of copper dust with one pile of zinc
+dust to make three piles of brass dust. The two ways of alloying produce
+equivalent results.
+
+### iron and its alloys ###
+
+Iron forms several important alloys. In real-life history, iron was the
+second metal to be used as the base component of deliberately-constructed
+alloys (the first was copper), and it was the first metal whose working
+required processes of any metallurgical sophistication. The game
+mechanics around iron broadly imitate the historical progression of
+processes around it, rather than the less-varied modern processes.
+
+The two-component alloying system of iron with carbon is of huge
+importance, both in the game and in real life. The basic Minetest game
+doesn't distinguish between these pure iron and these alloys at all,
+but technic introduces a distinction based on the carbon content, and
+renames some items of the basic game accordingly.
+
+The iron/carbon spectrum is represented in the game by three metal
+substances: wrought iron, carbon steel, and cast iron. Wrought iron
+has low carbon content (less than 0.25%), resists shattering, and
+is easily welded, but is relatively soft and susceptible to rusting.
+In real-life history it was used for rails, gates, chains, wire, pipes,
+fasteners, and other purposes. Cast iron has high carbon content
+(2.1% to 4%), is especially hard, and resists corrosion, but is
+relatively brittle, and difficult to work. Historically it was used
+to build large structures such as bridges, and for cannons, cookware,
+and engine cylinders. Carbon steel has medium carbon content (0.25%
+to 2.1%), and intermediate properties: moderately hard and also tough,
+somewhat resistant to corrosion. In real life it is now used for most
+of the purposes previously satisfied by wrought iron and many of those
+of cast iron, but has historically been especially important for its
+use in swords, armor, skyscrapers, large bridges, and machines.
+
+In real-life history, the first form of iron to be refined was
+wrought iron, which is nearly pure iron, having low carbon content.
+It was produced from ore by a low-temperature furnace process (the
+"bloomery") in which the ore/iron remains solid and impurities (slag)
+are progressively removed by hammering ("working", hence "wrought").
+This began in the middle East, around 1800 BCE.
+
+Historically, the next forms of iron to be refined were those of high
+carbon content. This was the result of the development of a more
+sophisticated kind of furnace, the blast furnace, capable of reaching
+higher temperatures. The real advantage of the blast furnace is that it
+melts the metal, allowing it to be cast straight into a shape supplied by
+a mould, rather than having to be gradually beaten into the desired shape.
+A side effect of the blast furnace is that carbon from the furnace's fuel
+is unavoidably incorporated into the metal. Normally iron is processed
+twice through the blast furnace: once producing "pig iron", which has
+very high carbon content and lots of impurities but lower melting point,
+casting it into rough ingots, then remelting the pig iron and casting it
+into the final moulds. The result is called "cast iron". Pig iron was
+first produced in China around 1200 BCE, and cast iron later in the 5th
+century BCE. Incidentally, the Chinese did not have the bloomery process,
+so this was their first iron refining process, and, unlike the rest of
+the world, their first wrought iron was made from pig iron rather than
+directly from ore.
+
+Carbon steel, with intermediate carbon content, was developed much later,
+in Europe in the 17th century CE. It required a more sophisticated
+process, because the blast furnace made it extremely difficult to achieve
+a controlled carbon content. Tweaks of the blast furnace would sometimes
+produce an intermediate carbon content by luck, but the first processes to
+reliably produce steel were based on removing almost all the carbon from
+pig iron and then explicitly mixing a controlled amount of carbon back in.
+
+In the game, the bloomery process is represented by ordinary cooking
+or grinding of an iron lump. The lump represents unprocessed ore,
+and is identified only as "iron", not specifically as wrought iron.
+This standard refining process produces dust or an ingot which is
+specifically identified as wrought iron. Thus the standard refining
+process produces the (nearly) pure metal.
+
+Cast iron is trickier. You might expect from the real-life notes above
+that cooking an iron lump (representing ore) would produce pig iron that
+can then be cooked again to produce cast iron. This is kind of the case,
+but not exactly, because as already noted cooking an iron lump produces
+wrought iron. The game doesn't distinguish between low-temperature
+and high-temperature cooking processes: the same furnace is used not
+just to cast all kinds of metal but also to cook food. So there is no
+distinction between cooking processes to produce distinct wrought iron
+and pig iron. But repeated cooking *is* available as a game mechanic,
+and is indeed used to produce cast iron: re-cooking a wrought iron ingot
+produces a cast iron ingot. So pig iron isn't represented in the game as
+a distinct item; instead wrought iron stands in for pig iron in addition
+to its realistic uses as wrought iron.
+
+Carbon steel is produced by a more regular in-game process: alloying
+wrought iron with coal dust (which is essentially carbon). This bears
+a fair resemblance to the historical development of carbon steel.
+This alloying recipe is relatively time-consuming for the amount of
+material processed, when compared against other alloying recipes, and
+carbon steel is heavily used, so it is wise to alloy it in advance,
+when you're not waiting for it.
+
+There are additional recipes that permit all three of these types of iron
+to be converted into each other. Alloying carbon steel again with coal
+dust produces cast iron, with its higher carbon content. Cooking carbon
+steel or cast iron produces wrought iron, in an abbreviated form of the
+bloomery process.
+
+There's one more iron alloy in the game: stainless steel. It is managed
+in a completely regular manner, created by alloying carbon steel with
+chromium.
+
+### uranium enrichment ###
+
+When uranium is to be used to fuel a nuclear reactor, it is not
+sufficient to merely isolate and refine uranium metal. It is necessary
+to control its isotopic composition, because the different isotopes
+behave differently in nuclear processes.
+
+The main isotopes of interest are U-235 and U-238. U-235 is good at
+sustaining a nuclear chain reaction, because when a U-235 nucleus is
+bombarded with a neutron it will usually fission (split) into fragments.
+It is therefore described as "fissile". U-238, on the other hand,
+is not fissile: if bombarded with a neutron it will usually capture it,
+becoming U-239, which is very unstable and quickly decays into semi-stable
+(and fissile) plutonium-239.
+
+Inconveniently, the fissile U-235 makes up only about 0.7% of natural
+uranium, almost all of the other 99.3% being U-238. Natural uranium
+therefore doesn't make a great nuclear fuel. (In real life there are
+a small number of reactor types that can use it, but technic doesn't
+have such a reactor.) Better nuclear fuel needs to contain a higher
+proportion of U-235.
+
+Achieving a higher U-235 content isn't as simple as separating the U-235
+from the U-238 and just using the required amount of U-235. Because
+U-235 and U-238 are both uranium, and therefore chemically identical,
+they cannot be chemically separated, in the way that different elements
+are separated from each other when refining metal. They do differ
+in atomic mass, so they can be separated by centrifuging, but because
+their atomic masses are very close, centrifuging doesn't separate them
+very well. They cannot be separated completely, but it is possible to
+produce uranium that has the isotopes mixed in different proportions.
+Uranium with a significantly larger fissile U-235 fraction than natural
+uranium is called "enriched", and that with a significantly lower fissile
+fraction is called "depleted".
+
+A single pass through a centrifuge produces two output streams, one with
+a fractionally higher fissile proportion than the input, and one with a
+fractionally lower fissile proportion. To alter the fissile proportion
+by a significant amount, these output streams must be centrifuged again,
+repeatedly. The usual arrangement is a "cascade", a linear arrangement
+of many centrifuges. Each centrifuge takes as input uranium with some
+specific fissile proportion, and passes its two output streams to the
+two adjacent centrifuges. Natural uranium is input somewhere in the
+middle of the cascade, and the two ends of the cascade produce properly
+enriched and depleted uranium.
+
+Fuel for technic's nuclear reactor consists of enriched uranium of which
+3.5% is fissile. (This is a typical value for a real-life light water
+reactor, a common type for power generation.) To enrich uranium in the
+game, it must first be in dust form: the centrifuge will not operate
+on ingots. (In real life uranium enrichment is done with the uranium
+in the form of a gas.) It is best to grind uranium lumps directly to
+dust, rather than cook them to ingots first, because this yields twice
+as much metal dust. When uranium is in refined form (dust, ingot, or
+block), the name of the inventory item indicates its fissile proportion.
+Uranium of any available fissile proportion can be put through all the
+usual processes for metal.
+
+A single centrifuge operation takes two uranium dust piles, and produces
+as output one dust pile with a fissile proportion 0.1% higher and one with
+a fissile proportion 0.1% lower. Uranium can be enriched up to the 3.5%
+required for nuclear fuel, and depleted down to 0.0%. Thus a cascade
+covering the full range of fissile fractions requires 34 cascade stages.
+(In real life, enriching to 3.5% uses thousands of cascade stages.
+Also, centrifuging is less effective when the input isotope ratio
+is more skewed, so the steps in fissile proportion are smaller for
+relatively depleted uranium. Zero fissile content is only asymptotically
+approachable, and natural uranium relatively cheap, so uranium is normally
+only depleted to around 0.3%. On the other hand, much higher enrichment
+than 3.5% isn't much more difficult than enriching that far.)
+
+Although centrifuges can be used manually, it is not feasible to perform
+uranium enrichment by hand. It is a practical necessity to set up
+an automated cascade, using pneumatic tubes to transfer uranium dust
+piles between centrifuges. Because both outputs from a centrifuge are
+ejected into the same tube, sorting tubes are needed to send the outputs
+in different directions along the cascade. It is possible to send items
+into the centrifuges through the same tubes that take the outputs, so the
+simplest version of the cascade structure has a line of 34 centrifuges
+linked by a line of 34 sorting tube segments.
+
+Assuming that the cascade depletes uranium all the way to 0.0%,
+producing one unit of 3.5%-fissile uranium requires the input of five
+units of 0.7%-fissile (natural) uranium, takes 490 centrifuge operations,
+and produces four units of 0.0%-fissile (fully depleted) uranium as a
+byproduct. It is possible to reduce the number of required centrifuge
+operations by using more natural uranium input and outputting only
+partially depleted uranium, but (unlike in real life) this isn't usually
+an economical approach. The 490 operations are not spread equally over
+the cascade stages: the busiest stage is the one taking 0.7%-fissile
+uranium, which performs 28 of the 490 operations. The least busy is the
+one taking 3.4%-fissile uranium, which performs 1 of the 490 operations.
+
+A centrifuge cascade will consume quite a lot of energy. It is
+worth putting a battery upgrade in each centrifuge. (Only one can be
+accommodated, because a control logic unit upgrade is also required for
+tube operation.) An MV centrifuge, the only type presently available,
+draws 7 kEU/s in this state, and takes 5 s for each uranium centrifuging
+operation. It thus takes 35 kEU per operation, and the cascade requires
+17.15 MEU to produce each unit of enriched uranium. It takes five units
+of enriched uranium to make each fuel rod, and six rods to fuel a reactor,
+so the enrichment cascade requires 514.5 MEU to process a full set of
+reactor fuel. This is about 0.85% of the 6.048 GEU that the reactor
+will generate from that fuel.
+
+If there is enough power available, and enough natural uranium input,
+to keep the cascade running continuously, and exactly one centrifuge
+at each stage, then the overall speed of the cascade is determined by
+the busiest stage, the 0.7% stage. It can perform its 28 operations
+towards the enrichment of a single uranium unit in 140 s, so that is
+the overall cycle time of the cascade. It thus takes 70 min to enrich
+a full set of reactor fuel. While the cascade is running at this full
+speed, its average power consumption is 122.5 kEU/s. The instantaneous
+power consumption varies from second to second over the 140 s cycle,
+and the maximum possible instantaneous power consumption (with all 34
+centrifuges active simultaneously) is 238 kEU/s. It is recommended to
+have some battery boxes to smooth out these variations.
+
+If the power supplied to the centrifuge cascade averages less than
+122.5 kEU/s, then the cascade can't run continuously. (Also, if the
+power supply is intermittent, such as solar, then continuous operation
+requires more battery boxes to smooth out the supply variations, even if
+the average power is high enough.) Because it's automated and doesn't
+require continuous player attention, having the cascade run at less
+than full speed shouldn't be a major problem. The enrichment work will
+consume the same energy overall regardless of how quickly it's performed,
+and the speed will vary in direct proportion to the average power supply
+(minus any supply lost because battery boxes filled completely).
+
+If there is insufficient power to run both the centrifuge cascade at
+full speed and whatever other machines require power, all machines on
+the same power network as the centrifuge will be forced to run at the
+same fractional speed. This can be inconvenient, especially if use
+of the other machines is less automated than the centrifuge cascade.
+It can be avoided by putting the centrifuge cascade on a separate power
+network from other machines, and limiting the proportion of the generated
+power that goes to it.
+
+If there is sufficient power and it is desired to enrich uranium faster
+than a single cascade can, the process can be speeded up more economically
+than by building an entire second cascade. Because the stages of the
+cascade do different proportions of the work, it is possible to add a
+second and subsequent centrifuges to only the busiest stages, and have
+the less busy stages still keep up with only a single centrifuge each.
+
+Another possible approach to uranium enrichment is to have no fixed
+assignment of fissile proportions to centrifuges, dynamically putting
+whatever uranium is available into whichever centrifuges are available.
+Theoretically all of the centrifuges can be kept almost totally busy all
+the time, making more efficient use of capital resources, and the number
+of centrifuges used can be as little (down to one) or as large as desired.
+The difficult part is that it is not sufficient to put each uranium dust
+pile individually into whatever centrifuge is available: they must be
+input in matched pairs. Any odd dust pile in a centrifuge will not be
+processed and will prevent that centrifuge from accepting any other input.
+
+### concrete ###
+
+Concrete is a synthetic building material. The technic modpack implements
+it in the game.
+
+Two forms of concrete are available as building blocks: ordinary
+"concrete" and more advanced "blast-resistant concrete". Despite its
+name, the latter has no special resistance to explosions or to any other
+means of destruction.
+
+Concrete can also be used to make fences. They act just like wooden
+fences, but aren't flammable. Confusingly, the item that corresponds
+to a wooden "fence" is called "concrete post". Posts placed adjacently
+will implicitly create fence between them. Fencing also appears between
+a post and adjacent concrete block.
+
+industrial processes
+--------------------
+
+### alloying ###
+
+In technic, alloying is a way of combining items to create other items,
+distinct from standard crafting. Alloying always uses inputs of exactly
+two distinct types, and produces a single output. Like cooking, which
+takes a single input, it is performed using a powered machine, known
+generically as an "alloy furnace". An alloy furnace always has two
+input slots, and it doesn't matter which way round the two ingredients
+are placed in the slots. Many alloying recipes require one or both
+slots to contain a stack of more than one of the ingredient item: the
+quantity required of each ingredient is part of the recipe.
+
+As with the furnaces used for cooking, there are multiple kinds of alloy
+furnace, powered in different ways. The most-used alloy furnaces are
+electrically powered. There is also an alloy furnace that is powered
+by directly burning fuel, just like the basic cooking furnace. Building
+almost any electrical machine, including the electrically-powered alloy
+furnaces, requires a machine casing component, one ingredient of which
+is brass, an alloy. It is therefore necessary to use the fuel-fired
+alloy furnace in the early part of the game, on the way to building
+electrical machinery.
+
+Alloying recipes are mainly concerned with metals. These recipes
+combine a base metal with some other element, most often another metal,
+to produce a new metal. This is discussed in the section on metal.
+There are also a few alloying recipes in which the base ingredient is
+non-metallic, such as the recipe for the silicon wafer.
+
+### grinding, extracting, and compressing ###
+
+Grinding, extracting, and compressing are three distinct, but very
+similar, ways of converting one item into another. They are all quite
+similar to the cooking found in the basic Minetest game. Each uses
+an input consisting of a single item type, and produces a single
+output. They are all performed using powered machines, respectively
+known generically as a "grinder", "extractor", and "compressor".
+Some compressing recipes require the input to be a stack of more than
+one of the input item: the quantity required is part of the recipe.
+Grinding and extracting recipes never require such a stacked input.
+
+There are multiple kinds of grinder, extractor, and compressor. Unlike
+cooking furnaces and alloy furnaces, there are none that directly burn
+fuel; they are all electrically powered.
+
+Grinding recipes always produce some kind of dust, loosely speaking,
+as output. The most important grinding recipes are concerned with metals:
+every metal lump or ingot can be ground into metal dust. Coal can also
+be ground into dust, and burning the dust as fuel produces much more
+energy than burning the original coal lump. There are a few other
+grinding recipes that make block types from the basic Minetest game
+more interconvertible: standard stone can be ground to standard sand,
+desert stone to desert sand, cobblestone to gravel, and gravel to dirt.
+
+Extracting is a miscellaneous category, used for a small group
+of processes that just don't fit nicely anywhere else. (Its name is
+notably vaguer than those of the other kinds of processing.) It is used
+for recipes that produce dye, mainly from flowers. (However, for those
+recipes using flowers, the basic Minetest game provides parallel crafting
+recipes that are easier to use and produce more dye, and those recipes
+are not suppressed by technic.) Its main use is to generate rubber from
+raw latex, which it does three times as efficiently as merely cooking
+the latex. Extracting was also formerly used for uranium enrichment for
+use as nuclear fuel, but this use has been superseded by a new enrichment
+system using the centrifuge.
+
+Compressing recipes are mainly used to produce a few relatively advanced
+artificial item types, such as the copper and carbon plates used in
+advanced machine recipes. There are also a couple of compressing recipes
+making natural block types more interconvertible.
+
+### centrifuging ###
+
+Centrifuging is another way of using a machine to convert items.
+Centrifuging takes an input of a single item type, and produces outputs
+of two distinct types. The input may be required to be a stack of
+more than one of the input item: the quantity required is part of
+the recipe. Centrifuging is only performed by a single machine type,
+the MV (electrically-powered) centrifuge.
+
+Currently, centrifuging recipes don't appear in the unified\_inventory
+craft guide, because unified\_inventory can't yet handle recipes with
+multiple outputs.
+
+Generally, centrifuging separates the input item into constituent
+substances, but it can only work when the input is reasonably fluid,
+and in marginal cases it is quite destructive to item structure.
+(In real life, centrifuges require their input to be mainly fluid, that
+is either liquid or gas. Few items in the game are described as liquid
+or gas, so the concept of the centrifuge is stretched a bit to apply to
+finely-divided solids.)
+
+The main use of centrifuging is in uranium enrichment, where it
+separates the isotopes of uranium dust that otherwise appears uniform.
+Enrichment is a necessary process before uranium can be used as nuclear
+fuel, and the radioactivity of uranium blocks is also affected by its
+isotopic composition.
+
+A secondary use of centrifuging is to separate the components of
+metal alloys. This can only be done using the dust form of the alloy.
+It recovers both components of binary metal/metal alloys. It can't
+recover the carbon from steel or cast iron.
+
+chests
+------
+
+The technic mod replaces the basic Minetest game's single type of
+chest with a range of chests that have different sizes and features.
+The chest types are identified by the materials from which they are made;
+the better chests are made from more exotic materials. The chest types
+form a linear sequence, each being (with one exception noted below)
+strictly more powerful than the preceding one. The sequence begins with
+the wooden chest from the basic game, and each later chest type is built
+by upgrading a chest of the preceding type. The chest types are:
+
+1. wooden chest: 8&times;4 (32) slots
+2. iron chest: 9&times;5 (45) slots
+3. copper chest: 12&times;5 (60) slots
+4. silver chest: 12&times;6 (72) slots
+5. gold chest: 15&times;6 (90) slots
+6. mithril chest: 15&times;6 (90) slots
+
+The iron and later chests have the ability to sort their contents,
+when commanded by a button in their interaction forms. Item types are
+sorted in the same order used in the unified\_inventory craft guide.
+The copper and later chests also have an auto-sorting facility that can
+be enabled from the interaction form. An auto-sorting chest automatically
+sorts its contents whenever a player closes the chest. The contents will
+then usually be in a sorted state when the chest is opened, but may not
+be if pneumatic tubes have operated on the chest while it was closed,
+or if two players have the chest open simultaneously.
+
+The silver and gold chests, but not the mithril chest, have a built-in
+sign-like capability. They can be given a textual label, which will
+be visible when hovering over the chest. The gold chest, but again not
+the mithril chest, can be further labelled with a colored patch that is
+visible from a moderate distance.
+
+The mithril chest is currently an exception to the upgrading system.
+It has only as many inventory slots as the preceding (gold) type, and has
+fewer of the features. It has no feature that other chests don't have:
+it is strictly weaker than the gold chest. It is planned that in the
+future it will acquire some unique features, but for now the only reason
+to use it is aesthetic.
+
+The size of the largest chests is dictated by the maximum size
+of interaction form that the game engine can successfully display.
+If in the future the engine becomes capable of handling larger forms,
+by scaling them to fit the screen, the sequence of chest sizes will
+likely be revised.
+
+As with the chest of the basic Minetest game, each chest type comes
+in both locked and unlocked flavors. All of the chests work with the
+pneumatic tubes of the pipeworks mod.
+
+radioactivity
+-------------
+
+The technic mod adds radioactivity to the game, as a hazard that can
+harm player characters. Certain substances in the game are radioactive,
+and when placed as blocks in the game world will damage nearby players.
+Conversely, some substances attenuate radiation, and so can be used
+for shielding. The radioactivity system is based on reality, but is
+not an attempt at serious simulation: like the rest of the game, it has
+many simplifications and deliberate deviations from reality in the name
+of game balance.
+
+In real life radiological hazards can be roughly divided into three
+categories based on the time scale over which they act: prompt radiation
+damage (such as radiation burns) that takes effect immediately; radiation
+poisoning that becomes visible in hours and lasts weeks; and cumulative
+effects such as increased cancer risk that operate over decades.
+The game's version of radioactivity causes only prompt damage, not
+any delayed effects. Damage comes in the abstracted form of removing
+the player's hit points, and is immediately visible to the player.
+As with all other kinds of damage in the game, the player can restore
+the hit points by eating food items. High-nutrition foods, such as the
+pie baskets supplied by the bushes\_classic mod, are a useful tool in
+dealing with radiological hazards.
+
+Only a small range of items in the game are radioactive. From the technic
+mod, the only radioactive items are uranium ore, refined uranium blocks,
+nuclear reactor cores (when operating), and the materials released when
+a nuclear reactor melts down. Other mods can plug into the technic
+system to make their own block types radioactive. Radioactive items
+are harmless when held in inventories. They only cause radiation damage
+when placed as blocks in the game world.
+
+The rate at which damage is caused by a radioactive block depends on the
+distance between the source and the player. Distance matters because the
+damaging radiation is emitted equally in all directions by the source,
+so with distance it spreads out, so less of it will strike a target
+of any specific size. The amount of radiation absorbed by a target
+thus varies in proportion to the inverse square of the distance from
+the source. The game imitates this aspect of real-life radioactivity,
+but with some simplifications. While in real life the inverse square law
+is only really valid for sources and targets that are small relative to
+the distance between them, in the game it is applied even when the source
+and target are large and close together. Specifically, the distance is
+measured from the center of the radioactive block to the abdomen of the
+player character. For extremely close encounters, such as where the
+player swims in a radioactive liquid, there is an enforced lower limit
+on the effective distance.
+
+Different types of radioactive block emit different amounts of radiation.
+The least radioactive of the radioactive block types is uranium ore,
+which causes 0.25 HP/s damage to a player 1 m away. A block of refined
+but unenriched uranium, as an example, is nine times as radioactive,
+and so will cause 2.25 HP/s damage to a player 1 m away. By the inverse
+square law, the damage caused by that uranium block reduces by a factor
+of four at twice the distance, that is to 0.5625 HP/s at a distance of 2
+m, or by a factor of nine at three times the distance, that is to 0.25
+HP/s at a distance of 3 m. Other radioactive block types are far more
+radioactive than these: the most radioactive of all, the result of a
+nuclear reactor melting down, is 1024 times as radioactive as uranium ore.
+
+Uranium blocks are radioactive to varying degrees depending on their
+isotopic composition. An isotope being fissile, and thus good as
+reactor fuel, is essentially uncorrelated with it being radioactive.
+The fissile U-235 is about six times as radioactive than the non-fissile
+U-238 that makes up the bulk of natural uranium, so one might expect that
+enriching from 0.7% fissile to 3.5% fissile (or depleting to 0.0%) would
+only change the radioactivity of uranium by a few percent. But actually
+the radioactivity of enriched uranium is dominated by the non-fissile
+U-234, which makes up only about 50 parts per million of natural uranium
+but is about 19000 times more radioactive than U-238. The radioactivity
+of natural uranium comes just about half from U-238 and half from U-234,
+and the uranium gets enriched in U-234 along with the U-235. This makes
+3.5%-fissile uranium about three times as radioactive as natural uranium,
+and 0.0%-fissile uranium about half as radioactive as natural uranium.
+
+Radiation is attenuated by the shielding effect of material along the
+path between the radioactive block and the player. In general, only
+blocks of homogeneous material contribute to the shielding effect: for
+example, a block of solid metal has a shielding effect, but a machine
+does not, even though the machine's ingredients include a metal case.
+The shielding effect of each block type is based on the real-life
+resistance of the material to ionising radiation, but for game balance
+the effectiveness of shielding is scaled down from real life, more so
+for stronger shield materials than for weaker ones. Also, whereas in
+real life materials have different shielding effects against different
+types of radiation, the game only has one type of damaging radiation,
+and so only one set of shielding values.
+
+Almost any solid or liquid homogeneous material has some shielding value.
+At the low end of the scale, 5 meters of wooden planks nearly halves
+radiation, though in that case the planks probably contribute more
+to safety by forcing the player to stay 5 m further away from the
+source than by actual attenuation. Dirt halves radiation in 2.4 m,
+and stone in 1.7 m. When a shield must be deliberately constructed,
+the preferred materials are metals, the denser the better. Iron and
+steel halve radiation in 1.1 m, copper in 1.0 m, and silver in 0.95 m.
+Lead would halve in 0.69 m if it were in the game, but it's not, which
+poses a bit of a problem due to the drawbacks of the three materials in
+the game that are better shielding than silver. Gold halves radiation
+in 0.53 m (factor of 3.7 per meter), but is a bit scarce to use for
+this purpose. Uranium halves radiation in 0.31 m (factor of 9.4 per
+meter), but is itself radioactive. The very best shielding in the game
+is nyancat material (nyancats and their rainbow blocks), which halves
+radiation in 0.22 m (factor of 24 per meter), but is extremely scarce.
+
+If the theoretical radiation damage from a particular source is
+sufficiently small, due to distance and shielding, then no damage at all
+will actually occur. This means that for any particular radiation source
+and shielding arrangement there is a safe distance to which a player can
+approach without harm. The safe distance is where the radiation damage
+would theoretically be 0.25 HP/s. This damage threshold is applied
+separately for each radiation source, so to be safe in a multi-source
+situation it is only necessary to be safe from each source individually.
+
+The best way to use uranium as shielding is in a two-layer structure,
+of uranium and some non-radioactive material. The uranium layer should
+be nearer to the primary radiation source and the non-radioactive layer
+nearer to the player. The uranium provides a great deal of shielding
+against the primary source, and the other material shields against
+the uranium layer. Due to the damage threshold mechanism, a meter of
+dirt is sufficient to shield fully against a layer of fully-depleted
+(0.0%-fissile) uranium. Obviously this is only worthwhile when the
+primary radiation source is more radioactive than a uranium block.
+
+When constructing permanent radiation shielding, it is necessary to
+pay attention to the geometry of the structure, and particularly to any
+holes that have to be made in the shielding, for example to accommodate
+power cables. Any hole that is aligned with the radiation source makes a
+"shine path" through which a player may be irradiated when also aligned.
+Shine paths can be avoided by using bent paths for cables, passing
+through unaligned holes in multiple shield layers. If the desired
+shielding effect depends on multiple layers, a hole in one layer still
+produces a partial shine path, along which the shielding is reduced,
+so the positioning of holes in each layer must still be considered.
+Tricky shine paths can also be addressed by just keeping players out of
+the dangerous area.
+
+electrical power
+----------------
+
+Most machines in technic are electrically powered. To operate them it is
+necessary to construct an electrical power network. The network links
+together power generators and power-consuming machines, connecting them
+using power cables.
+
+There are three tiers of electrical networking: low voltage (LV),
+medium voltage (MV), and high voltage (HV). Each network must operate
+at a single voltage, and most electrical items are specific to a single
+voltage. Generally, the machines of higher tiers are more powerful,
+but consume more energy and are more expensive to build, than machines
+of lower tiers. It is normal to build networks of all three tiers,
+in ascending order as one progresses through the game, but it is not
+strictly necessary to do this. Building HV equipment requires some parts
+that can only be manufactured using electrical machines, either LV or MV,
+so it is not possible to build an HV network first, but it is possible
+to skip either LV or MV on the way to HV.
+
+Each voltage has its own cable type, with distinctive insulation. Cable
+segments connect to each other and to compatible machines automatically.
+Incompatible electrical items don't connect. All non-cable electrical
+items must be connected via cable: they don't connect directly to each
+other. Most electrical items can connect to cables in any direction,
+but there are a couple of important exceptions noted below.
+
+To be useful, an electrical network must connect at least one power
+generator to at least one power-consuming machine. In addition to these
+items, the network must have a "switching station" in order to operate:
+no energy will flow without one. Unlike most electrical items, the
+switching station is not voltage-specific: the same item will manage
+a network of any tier. However, also unlike most electrical items,
+it is picky about the direction in which it is connected to the cable:
+the cable must be directly below the switching station.
+
+Hovering over a network's switching station will show the aggregate energy
+supply and demand, which is useful for troubleshooting. Electrical energy
+is measured in "EU", and power (energy flow) in EU per second (EU/s).
+Energy is shifted around a network instantaneously once per second.
+
+In a simple network with only generators and consumers, if total
+demand exceeds total supply then no energy will flow, the machines
+will do nothing, and the generators' output will be lost. To handle
+this situation, it is recommended to add a battery box to the network.
+A battery box will store generated energy, and when enough has been
+stored to run the consumers for one second it will deliver it to the
+consumers, letting them run part-time. It also stores spare energy
+when supply exceeds demand, to let consumers run full-time when their
+demand occasionally peaks above the supply. More battery boxes can
+be added to cope with larger periods of mismatched supply and demand,
+such as those resulting from using solar generators (which only produce
+energy in the daytime).
+
+When there are electrical networks of multiple tiers, it can be appealing
+to generate energy on one tier and transfer it to another. The most
+direct way to do this is with the "supply converter", which can be
+directly wired into two networks. It is another tier-independent item,
+and also particular about the direction of cable connections: it must
+have the cable of one network directly above, and the cable of another
+network directly below. The supply converter demands 10000 EU/s from
+the network above, and when this network gives it power it supplies 9000
+EU/s to the network below. Thus it is only 90% efficient, unlike most of
+the electrical system which is 100% efficient in moving energy around.
+To transfer more than 10000 EU/s between networks, connect multiple
+supply converters in parallel.
+
+powered machines
+----------------
+
+### powered machine tiers ###
+
+Each powered machine takes its power in some specific form, being
+either fuel-fired (burning fuel directly) or electrically powered at
+some specific voltage. There is a general progression through the
+game from using fuel-fired machines to electrical machines, and to
+higher electrical voltages. The most important kinds of machine come
+in multiple variants that are powered in different ways, so the earlier
+ones can be superseded. However, some machines are only available for
+a specific power tier, so the tier can't be entirely superseded.
+
+### powered machine upgrades ###
+
+Some machines have inventory slots that are used to upgrade them in
+some way. Generally, machines of MV and HV tiers have two upgrade slots,
+and machines of lower tiers (fuel-fired and LV) do not. Any item can
+be placed in an upgrade slot, but only specific items will have any
+upgrading effect. It is possible to have multiple upgrades of the same
+type, but this can't be achieved by stacking more than one upgrade item
+in one slot: it is necessary to put the same kind of item in more than one
+upgrade slot. The ability to upgrade machines is therefore very limited.
+Two kinds of upgrade are currently possible: an energy upgrade and a
+tube upgrade.
+
+An energy upgrade consists of a battery item, the same kind of battery
+that serves as a mobile energy store. The effect of an energy upgrade
+is to improve in some way the machine's use of electrical energy, most
+often by making it use less energy. The upgrade effect has no relation
+to energy stored in the battery: the battery's charge level is irrelevant
+and will not be affected.
+
+A tube upgrade consists of a control logic unit item. The effect of a
+tube upgrade is to make the machine able, or more able, to eject items
+it has finished with into pneumatic tubes. The machines that can take
+this kind of upgrade are in any case capable of accepting inputs from
+pneumatic tubes. These upgrades are essential in using powered machines
+as components in larger automated systems.
+
+### tubes with powered machines ###
+
+Generally, powered machines of MV and HV tiers can work with pneumatic
+tubes, and those of lower tiers cannot. (As an exception, the fuel-fired
+furnace from the basic Minetest game can accept inputs through tubes,
+but can't output into tubes.)
+
+If a machine can accept inputs through tubes at all, then this
+is a capability of the basic machine, not requiring any upgrade.
+Most item-processing machines take only one kind of input, and in that
+case they will accept that input from any direction. This doesn't match
+how tubes visually connect to the machines: generally tubes will visually
+connect to any face except the front, but an item passing through a tube
+in front of the machine will actually be accepted into the machine.
+
+A minority of machines take more than one kind of input, and in that
+case the input slot into which an arriving item goes is determined by the
+direction from which it arrives. In this case the machine may be picky
+about the direction of arriving items, associating each input type with
+a single face of the machine and not accepting inputs at all through the
+remaining faces. Again, the visual connection of tubes doesn't match:
+generally tubes will still visually connect to any face except the front,
+thus connecting to faces that neither accept inputs nor emit outputs.
+
+Machines do not accept items from tubes into non-input inventory slots:
+the output slots or upgrade slots. Output slots are normally filled
+only by the processing operation of the machine, and upgrade slots must
+be filled manually.
+
+Powered machines generally do not eject outputs into tubes without
+an upgrade. One tube upgrade will make them eject outputs at a slow
+rate; a second tube upgrade will increase the rate. Whether the slower
+rate is adequate depends on how it compares to the rate at which the
+machine produces outputs, and on how the machine is being used as part
+of a larger construct. The machine always ejects its outputs through a
+particular face, usually a side. Due to a bug, the side through which
+outputs are ejected is not consistent: when the machine is rotated one
+way, the direction of ejection is rotated the other way. This will
+probably be fixed some day, but because a straightforward fix would
+break half the machines already in use, the fix may be tied to some
+larger change such as free selection of the direction of ejection.
+
+### battery boxes ###
+
+The primary purpose of battery boxes is to temporarily store electrical
+energy to let an electrical network cope with mismatched supply and
+demand. They have a secondary purpose of charging and discharging
+powered tools. They are thus a mixture of electrical infrastructure,
+powered machine, and generator.
+
+MV and HV battery boxes have upgrade slots. Energy upgrades increase
+the capacity of a battery box, each by 10% of the un-upgraded capacity.
+This increase is far in excess of the capacity of the battery that forms
+the upgrade.
+
+For charging and discharging of power tools, rather than having input and
+output slots, each battery box has a charging slot and a discharging slot.
+A fully charged/discharged item stays in its slot. The rates at which a
+battery box can charge and discharge increase with voltage, so it can
+be worth building a battery box of higher tier before one has other
+infrastructure of that tier, just to get access to faster charging.
+
+MV and HV battery boxes work with pneumatic tubes. An item can be input
+to the charging slot through the bottom of the battery box, or to the
+discharging slot through the top. Items are not accepted through the
+front, back, or sides. With a tube upgrade, fully charged/discharged
+tools (as appropriate for their slot) will be ejected through a side.
+
+### processing machines ###
+
+The furnace, alloy furnace, grinder, extractor, compressor, and centrifuge
+have much in common. Each implements some industrial process that
+transforms items into other items, and they manner in which they present
+these processes as powered machines is essentially identical.
+
+Most of the processing machines operate on inputs of only a single type
+at a time, and correspondingly have only a single input slot. The alloy
+furnace is an exception: it operates on inputs of two distinct types at
+once, and correspondingly has two input slots. It doesn't matter which
+way round the alloy furnace's inputs are placed in the two slots.
+
+The processing machines are mostly available in variants for multiple
+tiers. The furnace and alloy furnace are each available in fuel-fired,
+LV, and MV forms. The grinder, extractor, and compressor are each
+available in LV and MV forms. The centrifuge is the only single-tier
+processing machine, being only available in MV form. The higher-tier
+machines process items faster than the lower-tier ones, but also have
+higher power consumption, usually taking more energy overall to perform
+the same amount of processing. The MV machines have upgrade slots,
+and energy upgrades reduce their energy consumption.
+
+The MV machines can work with pneumatic tubes. They accept inputs via
+tubes from any direction. For most of the machines, having only a single
+input slot, this is perfectly simple behavior. The alloy furnace is more
+complex: it will put an arriving item in either input slot, preferring to
+stack it with existing items of the same type. It doesn't matter which
+slot each of the alloy furnace's inputs is in, so it doesn't matter that
+there's no direct control ovar that, but there is a risk that supplying
+a lot of one item type through tubes will result in both slots containing
+the same type of item, leaving no room for the second input.
+
+The MV machines can be given a tube upgrade to make them automatically
+eject output items into pneumatic tubes. The items are always ejected
+through a side, though which side it is depends on the machine's
+orientation, due to a bug. Output items are always ejected singly.
+For some machines, such as the grinder, the ejection rate with a
+single tube upgrade doesn't keep up with the rate at which items can
+be processed. A second tube upgrade increases the ejection rate.
+
+The LV and fuel-fired machines do not work with pneumatic tubes, except
+that the fuel-fired furnace (actually part of the basic Minetest game)
+can accept inputs from tubes. Items arriving through the bottom of
+the furnace go into the fuel slot, and items arriving from all other
+directions go into the input slot.
+
+### music player ###
+
+The music player is an LV powered machine that plays audio recordings.
+It offers a selection of up to nine tracks. The technic modpack doesn't
+include specific music tracks for this purpose; they have to be installed
+separately.
+
+The music player gives the impression that the music is being played in
+the Minetest world. The music only plays as long as the music player
+is in place and is receiving electrical power, and the choice of music
+is controlled by interaction with the machine. The sound also appears
+to emanate specifically from the music player: the ability to hear it
+depends on the player's distance from the music player. However, the
+game engine doesn't currently support any other positional cues for
+sound, such as attenuation, panning, or HRTF. The impression of the
+sound being located in the Minetest world is also compromised by the
+subjective nature of track choice: the specific music that is played to
+a player depends on what media the player has installed.
+
+### CNC machine ###
+
+The CNC machine is an LV powered machine that cuts building blocks into a
+variety of sub-block shapes that are not covered by the crafting recipes
+of the stairs mod and its variants. Most of the target shapes are not
+rectilinear, involving diagonal or curved surfaces.
+
+Only certain kinds of building material can be processed in the CNC
+machine.
+
+### tool workshop ###
+
+The tool workshop is an MV powered machine that repairs mechanically-worn
+tools, such as pickaxes and the other ordinary digging tools. It has
+a single slot for a tool to be repaired, and gradually repairs the
+tool while it is powered. For any single tool, equal amounts of tool
+wear, resulting from equal amounts of tool use, take equal amounts of
+repair effort. Also, all repairable tools currently take equal effort
+to repair equal percentages of wear. The amount of tool use enabled by
+equal amounts of repair therefore depends on the tool type.
+
+The mechanical wear that the tool workshop repairs is always indicated in
+inventory displays by a colored bar overlaid on the tool image. The bar
+can be seen to fill and change color as the tool workshop operates,
+eventually disappearing when the repair is complete. However, not every
+item that shows such a wear bar is using it to show mechanical wear.
+A wear bar can also be used to indicate charging of a power tool with
+stored electrical energy, or filling of a container, or potentially for
+all sorts of other uses. The tool workshop won't affect items that use
+wear bars to indicate anything other than mechanical wear.
+
+The tool workshop has upgrade slots. Energy upgrades reduce its power
+consumption.
+
+It can work with pneumatic tubes. Tools to be repaired are accepted
+via tubes from any direction. With a tube upgrade, the tool workshop
+will also eject fully-repaired tools via one side, the choice of side
+depending on the machine's orientation, as for processing machines. It is
+safe to put into the tool workshop a tool that is already fully repaired:
+assuming the presence of a tube upgrade, the tool will be quickly ejected.
+Furthermore, any item of unrepairable type will also be ejected as if
+fully repaired. (Due to a historical limitation of the basic Minetest
+game, it is impossible for the tool workshop to distinguish between a
+fully-repaired tool and any item type that never displays a wear bar.)
+
+### quarry ###
+
+The quarry is an HV powered machine that automatically digs out a
+large area. The region that it digs out is a cuboid with a square
+horizontal cross section, located immediately behind the quarry machine.
+The quarry's action is slow and energy-intensive, but requires little
+player effort.
+
+The size of the quarry's horizontal cross section is configurable through
+the machine's interaction form. A setting referred to as "radius"
+is an integer number of meters which can vary from 2 to 8 inclusive.
+The horizontal cross section is a square with side length of twice the
+radius plus one meter, thus varying from 5 to 17 inclusive. Vertically,
+the quarry always digs from 3 m above the machine to 100 m below it,
+inclusive, a total vertical height of 104 m.
+
+Whatever the quarry digs up is ejected through the top of the machine,
+as if from a pneumatic tube. Normally a tube should be placed there
+to convey the material into a sorting system, processing machines, or
+at least chests. A chest may be placed directly above the machine to
+capture the output without sorting, but is liable to overflow.
+
+If the quarry encounters something that cannot be dug, such as a liquid,
+a locked chest, or a protected area, it will skip past that and attempt
+to continue digging. However, anything remaining in the quarry area
+after the machine has attempted to dig there will prevent the machine
+from digging anything directly below it, all the way to the bottom
+of the quarry. An undiggable block therefore casts a shadow of undug
+blocks below it. If liquid is encountered, it is quite likely to flow
+across the entire cross section of the quarry, preventing all digging.
+The depth at which the quarry is currently attempting to dig is reported
+in its interaction form, and can be manually reset to the top of the
+quarry, which is useful to do if an undiggable obstruction has been
+manually removed.
+
+The quarry consumes 10 kEU per block dug, which is quite a lot of energy.
+With most of what is dug being mere stone, it is usually not economically
+favorable to power a quarry from anything other than solar power.
+In particular, one cannot expect to power a quarry by burning the coal
+that it digs up.
+
+Given sufficient power, the quarry digs at a rate of one block per second.
+This is rather tedious to wait for. Unfortunately, leaving the quarry
+unattended normally means that the Minetest server won't keep the machine
+running: it needs a player nearby. This can be resolved by using a world
+anchor. The digging is still quite slow, and independently of whether a
+world anchor is used the digging can be speeded up by placing multiple
+quarry machines with overlapping digging areas. Four can be placed to
+dig identical areas, one on each side of the square cross section.
+
+### forcefield emitter ###
+
+The forcefield emitter is an HV powered machine that generates a
+forcefield remeniscent of those seen in many science-fiction stories.
+
+The emitter can be configured to generate a forcefield of either
+spherical or cubical shape, in either case centered on the emitter.
+The size of the forcefield is configured using a radius parameter that
+is an integer number of meters which can vary from 5 to 20 inclusive.
+For a spherical forcefield this is simply the radius of the forcefield;
+for a cubical forcefield it is the distance from the emitter to the
+center of each square face.
+
+The power drawn by the emitter is proportional to the surface area of
+the forcefield being generated. A spherical forcefield is therefore the
+cheapest way to enclose a specified volume of space with a forcefield,
+if the shape of the space doesn't matter. A cubical forcefield is less
+efficient at enclosing volume, but is cheaper than the larger spherical
+forcefield that would be required if it is necessary to enclose a
+cubical space.
+
+The emitter is normally controlled merely through its interaction form,
+which has an enable/disable toggle. However, it can also (via the form)
+be placed in a mesecon-controlled mode. If mesecon control is enabled,
+the emitter must be receiving a mesecon signal in addition to being
+manually enabled, in order for it to generate the forcefield.
+
+The forcefield itself behaves largely as if solid, despite being
+immaterial: it cannot be traversed, and prevents access to blocks behind
+it. It is transparent, but not totally invisible. It cannot be dug.
+Some effects can pass through it, however, such as the beam of a mining
+laser, and explosions. In fact, explosions as currently implemented by
+the tnt mod actually temporarily destroy the forcefield itself; the tnt
+mod assumes too much about the regularity of node types.
+
+The forcefield occupies space that would otherwise have been air, but does
+not replace or otherwise interfere with materials that are solid, liquid,
+or otherwise not just air. If such an object blocking the forcefield is
+removed, the forcefield will quickly extend into the now-available space,
+but it does not do so instantly: there is a brief moment when the space
+is air and can be traversed.
+
+It is possible to have a doorway in a forcefield, by placing in advance,
+in space that the forcefield would otherwise occupy, some non-air blocks
+that can be walked through. For example, a door suffices, and can be
+opened and closed while the forcefield is in place.
+
+power generators
+----------------
+
+### fuel-fired generators ###
+
+The fiel-fired generators are electrical power generators that generate
+power by the combustion of fuel. Versions of them are available for
+all three voltages (LV, MV, and HV). These are all capable of burning
+any type of combustible fuel, such as coal. They are relatively easy
+to build, and so tend to be the first kind of generator used to power
+electrical machines. In this role they form an intermediate step between
+the directly fuel-fired machines and a more mature electrical network
+powered by means other than fuel combustion. They are also, by virtue of
+simplicity and controllability, a useful fallback or peak load generator
+for electrical networks that normally use more sophisticated generators.
+
+The MV and HV fuel-fired generators can accept fuel via pneumatic tube,
+from any direction.
+
+Keeping a fuel-fired generator fully fuelled is usually wasteful, because
+it will burn fuel as long as it has any, even if there is no demand for
+the electrical power that it generates. This is unlike the directly
+fuel-fired machines, which only burn fuel when they have work to do.
+To satisfy intermittent demand without waste, a fuel-fired generator must
+only be given fuel when there is either demand for the energy or at least
+sufficient battery capacity on the network to soak up the excess energy.
+
+The higher-tier fuel-fired generators get much more energy out of a
+fuel item than the lower-tier ones. The difference is much more than
+is needed to overcome the inefficiency of supply converters, so it is
+worth operating fuel-fired generators at a higher tier than the machines
+being powered.
+
+### solar generators ###
+
+The solar generators are electrical power generators that generate power
+from sunlight. Versions of them are available for all three voltages
+(LV, MV, and HV). There are four types in total, two LV and one each
+of MV and HV, forming a sequence of four tiers. The higher-tier ones
+are each built mainly from three solar generators of the next tier down,
+and their outputs scale in rough accordance, tripling at each tier.
+
+To operate, an arrayed solar generator must be at elevation +1 or above
+and have a transparent block (typically air) immediately above it.
+It will generate power only when the block above is well lit during
+daylight hours. It will generate more power at higher elevation,
+reaching maximum output at elevation +36 or higher when sunlit. The small
+solar generator has similar rules with slightly different thresholds.
+These rules are an attempt to ensure that the generator will only operate
+from sunlight, but it is actually possible to fool them to some extent
+with light sources such as meselamps.
+
+### hydro generator ###
+
+The hydro generator is an LV power generator that generates a small amount
+of power from the natural motion of water. To operate, the generator must
+be horizontally adjacent to water. It doesn't matter whether the water
+consists of source blocks or flowing blocks. Having water adjacent on
+more than one side, up to the full four, increases the generator's output.
+The water itself is unaffected by the generator.
+
+### geothermal generator ###
+
+The geothermal generator is an LV power generator that generates a small
+amount of power from the temperature difference between lava and water.
+To operate, the generator must be horizontally adjacent to both lava
+and water. It doesn't matter whether the liquids consist of source
+blocks or flowing blocks.
+
+Beware that if lava and water blocks are adjacent to each other then the
+lava will be solidified into stone or obsidian. If the lava adjacent to
+the generator is thus destroyed, the generator will stop producing power.
+Currently, in the default Minetest game, lava is destroyed even if
+it is only diagonally adjacent to water. Under these circumstances,
+the only way to operate the geothermal generator is with it adjacent
+to one lava block and one water block, which are on opposite sides of
+the generator. If diagonal adjacency doesn't destroy lava, such as with
+the gloopblocks mod, then it is possible to have more than one lava or
+water block adjacent to the geothermal generator. This increases the
+generator's output, with the maximum output achieved with two adjacent
+blocks of each liquid.
+
+### wind generator ###
+
+The wind generator is an MV power generator that generates a moderate
+amount of energy from wind. To operate, the generator must be placed
+atop a column of at least 20 wind mill frame blocks, and must be at
+an elevation of +30 or higher. It generates more at higher elevation,
+reaching maximum output at elevation +50 or higher. Its surroundings
+don't otherwise matter; it doesn't actually need to be in open air.
+
+### nuclear generator ###
+
+The nuclear generator (nuclear reactor) is an HV power generator that
+generates a large amount of energy from the controlled fission of
+uranium-235. It must be fuelled, with uranium fuel rods, but consumes
+the fuel quite slowly in relation to the rate at which it is likely to
+be mined. The operation of a nuclear reactor poses radiological hazards
+to which some thought must be given. Economically, the use of nuclear
+power requires a high capital investment, and a secure infrastructure,
+but rewards the investment well.
+
+Nuclear fuel is made from uranium. Natural uranium doesn't have a
+sufficiently high proportion of U-235, so it must first be enriched
+via centrifuge. Producing one unit of 3.5%-fissile uranium requires
+the input of five units of 0.7%-fissile (natural) uranium, and produces
+four units of 0.0%-fissile (fully depleted) uranium as a byproduct.
+It takes five ingots of 3.5%-fissile uranium to make each fuel rod, and
+six rods to fuel a reactor. It thus takes the input of the equivalent
+of 150 ingots of natural uranium, which can be obtained from the mining
+of 75 blocks of uranium ore, to make a full set of reactor fuel.
+
+The nuclear reactor is a large multi-block structure. Only one block in
+the structure, the reactor core, is of a type that is truly specific to
+the reactor; the rest of the structure consists of blocks that have mainly
+non-nuclear uses. The reactor core is where all the generator-specific
+action happens: it is where the fuel rods are inserted, and where the
+power cable must connect to draw off the generated power.
+
+The reactor structure consists of concentric layers, each a cubical
+shell, around the core. Immediately around the core is a layer of water,
+representing the reactor coolant; water blocks may be either source blocks
+or flowing blocks. Around that is a layer of stainless steel blocks,
+representing the reactor pressure vessel, and around that a layer of
+blast-resistant concrete blocks, representing a containment structure.
+It is customary, though no longer mandatory, to surround this with a
+layer of ordinary concrete blocks. The mandatory reactor structure
+makes a 7&times;7&times;7 cube, and the full customary structure a
+9&times;9&times;9 cube.
+
+The layers surrounding the core don't have to be absolutely complete.
+Indeed, if they were complete, it would be impossible to cable the core to
+a power network. The cable makes it necessary to have at least one block
+missing from each surrounding layer. The water layer is only permitted
+to have one water block missing of the 26 possible. The steel layer may
+have up to two blocks missing of the 98 possible, and the blast-resistant
+concrete layer may have up to two blocks missing of the 218 possible.
+Thus it is possible to have not only a cable duct, but also a separate
+inspection hole through the solid layers. The separate inspection hole
+is of limited use: the cable duct can serve double duty.
+
+Once running, the reactor core is significantly radioactive. The layers
+of reactor structure provide quite a lot of shielding, but not enough
+to make the reactor safe to be around, in two respects. Firstly, the
+shortest possible path from the core to a player outside the reactor
+is sufficiently short, and has sufficiently little shielding material,
+that it will damage the player. This only affects a player who is
+extremely close to the reactor, and close to a face rather than a vertex.
+The customary additional layer of ordinary concrete around the reactor
+adds sufficient distance and shielding to negate this risk, but it can
+also be addressed by just keeping extra distance (a little over two
+meters of air).
+
+The second radiological hazard of a running reactor arises from shine
+paths; that is, specific paths from the core that lack sufficient
+shielding. The necessary cable duct, if straight, forms a perfect
+shine path, because the cable itself has no radiation shielding effect.
+Any secondary inspection hole also makes a shine path, along which the
+only shielding material is the water of the reactor coolant. The shine
+path aspect of the cable duct can be ameliorated by adding a kink in the
+cable, but this still yields paths with reduced shielding. Ultimately,
+shine paths must be managed either with specific shielding outside the
+mandatory structure, or with additional no-go areas.
+
+The radioactivity of an operating reactor core makes starting up a reactor
+hazardous, and can come as a surprise because the non-operating core
+isn't radioactive at all. The radioactive damage is survivable, but it is
+normally preferable to avoid it by some care around the startup sequence.
+To start up, the reactor must have a full set of fuel inserted, have all
+the mandatory structure around it, and be cabled to a switching station.
+Only the fuel insertion requires direct access to the core, so irradiation
+of the player can be avoided by making one of the other two criteria be
+the last one satisfied. Completing the cabling to a switching station
+is the easiest to do from a safe distance.
+
+Once running, the reactor will generate 100 kEU/s for a week (168 hours,
+604800 seconds), a total of 6.048 GEU from one set of fuel. After the
+week is up, it will stop generating and no longer be radioactive. It can
+then be refuelled to run for another week. It is not really intended
+to be possible to pause a running reactor, but actually disconnecting
+it from a switching station will have the effect of pausing the week.
+This will probably change in the future. A paused reactor is still
+radioactive, just not generating electrical power.
+
+A running reactor can't be safely dismantled, and not only because
+dismantling the reactor implies removing the shielding that makes
+it safe to be close to the core. The mandatory parts of the reactor
+structure are not just mandatory in order to start the reactor; they're
+mandatory in order to keep it intact. If the structure around the core
+gets damaged, and remains damaged, the core will eventually melt down.
+How long there is before meltdown depends on the extent of the damage;
+if only one mandatory block is missing, meltdown will follow in 100
+seconds. While the structure of a running reactor is in a damaged state,
+heading towards meltdown, a siren built into the reactor core will sound.
+If the structure is rectified, the siren will signal all-clear. If the
+siren stops sounding without signalling all-clear, then it was stopped
+by meltdown.
+
+If meltdown is imminent because of damaged reactor structure, digging the
+reactor core is not a way to avert it. Digging the core of a running
+reactor causes instant meltdown. The only way to dismantle a reactor
+without causing meltdown is to start by waiting for it to finish the
+week-long burning of its current set of fuel. Once a reactor is no longer
+operating, it can be dismantled by ordinary means, with no special risks.
+
+Meltdown, if it occurs, destroys the reactor and poses a major
+environmental hazard. The reactor core melts, becoming a hot, highly
+radioactive liquid known as "corium". A single meltdown yields a single
+corium source block, where the core used to be. Corium flows, and the
+flowing corium is very destructive to whatever it comes into contact with.
+Flowing corium also randomly solidifies into a radioactive solid called
+"Chernobylite". The random solidification and random destruction of
+solid blocks means that the flow of corium is constantly changing.
+This combined with the severe radioactivity makes corium much more
+challenging to deal with than lava. If a meltdown is left to its own
+devices, it gets worse over time, as the corium works its way through
+the reactor structure and starts to flow over a variety of paths.
+It is best to tackle a meltdown quickly; the priority is to extinguish
+the corium source block, normally by dropping gravel into it. Only the
+most motivated should attempt to pick up the corium in a bucket.
+
+administrative world anchor
+---------------------------
+
+A world anchor is an object in the Minetest world that causes the server
+to keep surrounding parts of the world running even when no players
+are nearby. It is mainly used to allow machines to run unattended:
+normally machines are suspended when not near a player. The technic
+mod supplies a form of world anchor, as a placable block, but it is not
+straightforwardly available to players. There is no recipe for it, so it
+is only available if explicitly spawned into existence by someone with
+administrative privileges. In a single-player world, the single player
+normally has administrative privileges, and can obtain a world anchor
+by entering the chat command "/give singleplayer technic:admin\_anchor".
+
+The world anchor tries to force a cubical area, centered upon the anchor,
+to stay loaded. The distance from the anchor to the most distant map
+nodes that it will keep loaded is referred to as the "radius", and can be
+set in the world anchor's interaction form. The radius can be set as low
+as 0, meaning that the anchor only tries to keep itself loaded, or as high
+as 255, meaning that it will operate on a 511&times;511&times;511 cube.
+Larger radii are forbidden, to avoid typos causing the server excessive
+work; to keep a larger area loaded, use multiple anchors. Also use
+multiple anchors if the area to be kept loaded is not well approximated
+by a cube.
+
+The world is always kept loaded in units of 16&times;16&times;16 cubes,
+confusingly known as "map blocks". The anchor's configured radius takes
+no account of map block boundaries, but the anchor's effect is actually to
+keep loaded each map block that contains any part of the configured cube.
+The anchor's interaction form includes a status note showing how many map
+blocks this is, and how many of those it is successfully keeping loaded.
+When the anchor is disabled, as it is upon placement, it will always
+show that it is keeping no map blocks loaded; this does not indicate
+any kind of failure.
+
+The world anchor can optionally be locked. When it is locked, only
+the anchor's owner, the player who placed it, can reconfigure it or
+remove it. Only the owner can lock it. Locking an anchor is useful
+if the use of anchors is being tightly controlled by administrators:
+an administrator can set up a locked anchor and be sure that it will
+not be set by ordinary players to an unapproved configuration.
+
+The server limits the ability of world anchors to keep parts of the world
+loaded, to avoid overloading the server. The total number of map blocks
+that can be kept loaded in this way is set by the server configuration
+item "max\_forceloaded\_blocks" (in minetest.conf), which defaults to
+only 16. For comparison, each player normally keeps 125 map blocks loaded
+(a radius of 32). If an enabled world anchor shows that it is failing to
+keep all the map blocks loaded that it would like to, this can be fixed
+by increasing max\_forceloaded\_blocks by the amount of the shortfall.
+
+The tight limit on force-loading is the reason why the world anchor is
+not directly available to players. With the limit so low both by default
+and in common practice, the only feasible way to determine where world
+anchors should be used is for administrators to decide it directly.
+
+subjects missing from this manual
+---------------------------------
+
+This manual needs to be extended with sections on:
+
+* powered tools
+ * tool charging
+ * battery and energy crystals
+ * chainsaw
+ * flashlight
+ * mining lasers
+ * mining drills
+ * prospector
+ * sonic screwdriver
+* liquid cans
+* wrench
+* frames
+* templates
diff --git a/technic/modpack.txt b/technic/modpack.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/technic/modpack.txt
@@ -0,0 +1 @@
+
diff --git a/technic/technic/README.md b/technic/technic/README.md
new file mode 100644
index 0000000..b6aa05f
--- /dev/null
+++ b/technic/technic/README.md
@@ -0,0 +1,27 @@
+Technic
+=======
+
+License
+-------
+
+Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel)
+
+Technic chests code is licensed under the GNU LGPLv2+.
+
+Texture licenses:
+
+BlockMen modified by Zefram (CC BY-SA 3.0):
+ * technic_chernobylite_block.png
+ * technic_corium_flowing_animated.png
+ * technic_corium_source_animated.png
+
+celeron55 (Perttu Ahola) modified by Zefram (CC BY-SA 3.0):
+ * technic_bucket_corium.png
+
+sdzen (Elise Staudter) (CC BY-SA 3.0):
+ * most of the older 16x16 textures
+
+RealBadAngel: (WTFPL)
+ * Everything else.
+
+CC BY-SA 3.0: <http://creativecommons.org/licenses/by-sa/3.0/>
diff --git a/technic/technic/config.lua b/technic/technic/config.lua
new file mode 100644
index 0000000..81a2224
--- /dev/null
+++ b/technic/technic/config.lua
@@ -0,0 +1,18 @@
+technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf")
+
+local conf_table = technic.config:to_table()
+
+local defaults = {
+ enable_mining_drill = "true",
+ enable_mining_laser = "true",
+ enable_flashlight = "false",
+ enable_wind_mill = "false",
+ enable_frames = "false",
+ enable_corium_griefing = "true",
+}
+
+for k, v in pairs(defaults) do
+ if conf_table[k] == nil then
+ technic.config:set(k, v)
+ end
+end
diff --git a/technic/technic/crafts.lua b/technic/technic/crafts.lua
new file mode 100644
index 0000000..8a8cd37
--- /dev/null
+++ b/technic/technic/crafts.lua
@@ -0,0 +1,193 @@
+-- check if we have the necessary dependencies to allow actually using these materials in the crafts
+local mesecons_materials = minetest.get_modpath("mesecons_materials")
+
+-- tubes crafting recipes
+
+minetest.register_craft({
+ output = 'pipeworks:accelerator_tube_1',
+ recipe = {
+ {'technic:copper_coil', 'pipeworks:tube_1', 'technic:copper_coil'},
+ }
+})
+
+minetest.register_craft({
+ output = 'pipeworks:teleport_tube_1',
+ recipe = {
+ {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
+ {'pipeworks:tube_1', 'technic:control_logic_unit', 'pipeworks:tube_1'},
+ {'default:mese_crystal', 'technic:copper_coil', 'default:mese_crystal'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:diamond_drill_head',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'default:diamond', 'technic:stainless_steel_ingot'},
+ {'default:diamond', '', 'default:diamond'},
+ {'technic:stainless_steel_ingot', 'default:diamond', 'technic:stainless_steel_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:green_energy_crystal',
+ recipe = {
+ {'default:gold_ingot', 'technic:battery', 'dye:green'},
+ {'technic:battery', 'technic:red_energy_crystal', 'technic:battery'},
+ {'dye:green', 'technic:battery', 'default:gold_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:blue_energy_crystal',
+ recipe = {
+ {'moreores:mithril_ingot', 'technic:battery', 'dye:blue'},
+ {'technic:battery', 'technic:green_energy_crystal', 'technic:battery'},
+ {'dye:blue', 'technic:battery', 'moreores:mithril_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:red_energy_crystal',
+ recipe = {
+ {'moreores:silver_ingot', 'technic:battery', 'dye:red'},
+ {'technic:battery', 'default:diamondblock', 'technic:battery'},
+ {'dye:red', 'technic:battery', 'moreores:silver_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:fine_copper_wire 2',
+ recipe = {
+ {'', 'default:copper_ingot', ''},
+ {'', 'default:copper_ingot', ''},
+ {'', 'default:copper_ingot', ''},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:fine_gold_wire 2',
+ recipe = {
+ {'', 'default:gold_ingot', ''},
+ {'', 'default:gold_ingot', ''},
+ {'', 'default:gold_ingot', ''},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:fine_silver_wire 2',
+ recipe = {
+ {'', 'moreores:silver_ingot', ''},
+ {'', 'moreores:silver_ingot', ''},
+ {'', 'moreores:silver_ingot', ''},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:copper_coil 1',
+ recipe = {
+ {'technic:fine_copper_wire', 'technic:wrought_iron_ingot', 'technic:fine_copper_wire'},
+ {'technic:wrought_iron_ingot', '', 'technic:wrought_iron_ingot'},
+ {'technic:fine_copper_wire', 'technic:wrought_iron_ingot', 'technic:fine_copper_wire'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:motor',
+ recipe = {
+ {'technic:carbon_steel_ingot', 'technic:copper_coil', 'technic:carbon_steel_ingot'},
+ {'technic:carbon_steel_ingot', 'technic:copper_coil', 'technic:carbon_steel_ingot'},
+ {'technic:carbon_steel_ingot', 'default:copper_ingot', 'technic:carbon_steel_ingot'},
+ }
+})
+
+local isolation = mesecons_materials and "mesecons_materials:fiber" or "technic:rubber"
+
+minetest.register_craft({
+ output = 'technic:lv_transformer',
+ recipe = {
+ {isolation, 'technic:wrought_iron_ingot', isolation},
+ {'technic:copper_coil', 'technic:wrought_iron_ingot', 'technic:copper_coil'},
+ {'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot', 'technic:wrought_iron_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:mv_transformer',
+ recipe = {
+ {isolation, 'technic:carbon_steel_ingot', isolation},
+ {'technic:copper_coil', 'technic:carbon_steel_ingot', 'technic:copper_coil'},
+ {'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot', 'technic:carbon_steel_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:hv_transformer',
+ recipe = {
+ {isolation, 'technic:stainless_steel_ingot', isolation},
+ {'technic:copper_coil', 'technic:stainless_steel_ingot', 'technic:copper_coil'},
+ {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:control_logic_unit',
+ recipe = {
+ {'', 'technic:fine_gold_wire', ''},
+ {'default:copper_ingot', 'technic:silicon_wafer', 'default:copper_ingot'},
+ {'', 'technic:chromium_ingot', ''},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:mixed_metal_ingot 9',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
+ {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'},
+ {'moreores:tin_ingot', 'moreores:tin_ingot', 'moreores:tin_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:carbon_cloth',
+ recipe = {
+ {'technic:graphite', 'technic:graphite', 'technic:graphite'}
+ }
+})
+
+minetest.register_craft({
+ output = "technic:machine_casing",
+ recipe = {
+ { "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" },
+ { "technic:cast_iron_ingot", "technic:brass_ingot", "technic:cast_iron_ingot" },
+ { "technic:cast_iron_ingot", "technic:cast_iron_ingot", "technic:cast_iron_ingot" },
+ },
+})
+
+-- Remove some recipes
+-- Bronze
+minetest.register_craft({
+ type = "shapeless",
+ output = "default:bronze_ingot 0",
+ recipe = {"default:copper_ingot", "default:steel_ingot"}
+})
+
+-- Accelerator tube
+minetest.register_craft({
+ output = "pipeworks:accelerator_tube_1 0",
+ recipe = {
+ { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
+ { "default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment" },
+ { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
+ },
+})
+
+-- Teleport tube
+minetest.register_craft({
+ output = "pipeworks:teleport_tube_1 0",
+ recipe = {
+ { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" },
+ { "default:desert_stone", "default:mese", "default:desert_stone" },
+ { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }
+ },
+})
+
diff --git a/technic/technic/depends.txt b/technic/technic/depends.txt
new file mode 100644
index 0000000..746fe34
--- /dev/null
+++ b/technic/technic/depends.txt
@@ -0,0 +1,8 @@
+default
+pipeworks
+technic_worldgen
+bucket?
+mesecons_mvps?
+intllib?
+unified_inventory?
+vector_extras?
diff --git a/technic/technic/helpers.lua b/technic/technic/helpers.lua
new file mode 100644
index 0000000..e8efcf3
--- /dev/null
+++ b/technic/technic/helpers.lua
@@ -0,0 +1,67 @@
+--load config
+local sepchar = nil
+do
+ local sepcode = technic.config:get("thousand_separator")
+ --default is SI style
+ sepchar = sepcode and string.char(sepcode) or " "
+ baresepchar = sepchar
+ --handling if sepchar is magic...
+ for magic in string.gmatch("().%+-*?[^$", ".") do
+ if sepchar == magic then sepchar = "%"..sepchar end
+ end
+end
+
+-- Only changes name, keeps other params
+function technic.swap_node(pos, name)
+ local node = minetest.get_node(pos)
+ if node.name ~= name then
+ node.name = name
+ minetest.swap_node(pos, node)
+ end
+ return node.name
+end
+
+-- Fully charge RE chargeable item.
+-- Must be defined early to reference in item definitions.
+function technic.refill_RE_charge(stack)
+ local max_charge = technic.power_tools[stack:get_name()]
+ if not max_charge then return stack end
+ technic.set_RE_wear(stack, max_charge, max_charge)
+ local meta = minetest.deserialize(stack:get_metadata()) or {}
+ meta.charge = max_charge
+ stack:set_metadata(minetest.serialize(meta))
+ return stack
+end
+
+local function resolve_name(function_name)
+ local a = _G
+ for key in string.gmatch(function_name, "([^%.]+)(%.?)") do
+ if a[key] then
+ a = a[key]
+ else
+ return nil
+ end
+ end
+ return a
+end
+
+function technic.function_exists(function_name)
+ return type(resolve_name(function_name)) == 'function'
+end
+
+-- if the node is loaded, returns it. If it isn't loaded, load it and return nil.
+function technic.get_or_load_node(pos)
+ local node_or_nil = minetest.get_node_or_nil(pos)
+ if node_or_nil then return node_or_nil end
+ local vm = VoxelManip()
+ local MinEdge, MaxEdge = vm:read_from_map(pos, pos)
+ return nil
+end
+
+function technic.prettynum(num)
+ local str, k = tostring(num), nil
+ repeat
+ str, k = str:gsub("^(-?%d+)(%d%d%d)", "%1"..sepchar.."%2")
+ until k == 0
+ return str
+end \ No newline at end of file
diff --git a/technic/technic/init.lua b/technic/technic/init.lua
new file mode 100644
index 0000000..25361af
--- /dev/null
+++ b/technic/technic/init.lua
@@ -0,0 +1,54 @@
+-- Minetest 0.4.7 mod: technic
+-- namespace: technic
+-- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl>
+
+technic = rawget(_G, "technic") or {}
+technic.creative_mode = minetest.setting_getbool("creative_mode")
+
+technic.tube_inject_item = pipeworks.tube_inject_item or function (pos, start_pos, velocity, item)
+ local tubed = pipeworks.tube_item(vector.new(pos), item)
+ tubed:get_luaentity().start_pos = vector.new(start_pos)
+ tubed:setvelocity(velocity)
+ tubed:setacceleration(vector.new(0, 0, 0))
+end
+
+local load_start = os.clock()
+local modpath = minetest.get_modpath("technic")
+technic.modpath = modpath
+
+-- Boilerplate to support intllib
+if minetest.get_modpath("intllib") then
+ technic.getter = intllib.Getter()
+else
+ technic.getter = function(s,a,...)if a==nil then return s end a={a,...}return s:gsub("(@?)@(%(?)(%d+)(%)?)",function(e,o,n,c)if e==""then return a[tonumber(n)]..(o==""and c or"")else return"@"..o..n..c end end) end
+end
+local S = technic.getter
+
+-- Read configuration file
+dofile(modpath.."/config.lua")
+
+-- Helper functions
+dofile(modpath.."/helpers.lua")
+
+-- Items
+dofile(modpath.."/items.lua")
+
+-- Craft recipes for items
+dofile(modpath.."/crafts.lua")
+
+-- Register functions
+dofile(modpath.."/register.lua")
+
+-- Machines
+dofile(modpath.."/machines/init.lua")
+
+-- Tools
+dofile(modpath.."/tools/init.lua")
+
+-- Aliases for legacy node/item names
+dofile(modpath.."/legacy.lua")
+
+if minetest.setting_getbool("log_mods") then
+ print(S("[Technic] Loaded in %f seconds"):format(os.clock() - load_start))
+end
+
diff --git a/technic/technic/items.lua b/technic/technic/items.lua
new file mode 100644
index 0000000..27e05e4
--- /dev/null
+++ b/technic/technic/items.lua
@@ -0,0 +1,221 @@
+
+local S = technic.getter
+
+minetest.register_craftitem("technic:silicon_wafer", {
+ description = S("Silicon Wafer"),
+ inventory_image = "technic_silicon_wafer.png",
+})
+
+minetest.register_craftitem( "technic:doped_silicon_wafer", {
+ description = S("Doped Silicon Wafer"),
+ inventory_image = "technic_doped_silicon_wafer.png",
+})
+
+minetest.register_craftitem("technic:uranium_fuel", {
+ description = S("Uranium Fuel"),
+ inventory_image = "technic_uranium_fuel.png",
+})
+
+minetest.register_craftitem( "technic:diamond_drill_head", {
+ description = S("Diamond Drill Head"),
+ inventory_image = "technic_diamond_drill_head.png",
+})
+
+minetest.register_tool("technic:blue_energy_crystal", {
+ description = S("Blue Energy Crystal"),
+ inventory_image = minetest.inventorycube(
+ "technic_diamond_block_blue.png",
+ "technic_diamond_block_blue.png",
+ "technic_diamond_block_blue.png"),
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ tool_capabilities = {
+ max_drop_level = 0,
+ groupcaps = {
+ fleshy = {times={}, uses=10000, maxlevel=0}
+ }
+ }
+})
+
+minetest.register_tool("technic:green_energy_crystal", {
+ description = S("Green Energy Crystal"),
+ inventory_image = minetest.inventorycube(
+ "technic_diamond_block_green.png",
+ "technic_diamond_block_green.png",
+ "technic_diamond_block_green.png"),
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ tool_capabilities = {
+ max_drop_level = 0,
+ groupcaps = {
+ fleshy = {times={}, uses=10000, maxlevel=0}
+ }
+ }
+})
+
+minetest.register_tool("technic:red_energy_crystal", {
+ description = S("Red Energy Crystal"),
+ inventory_image = minetest.inventorycube(
+ "technic_diamond_block_red.png",
+ "technic_diamond_block_red.png",
+ "technic_diamond_block_red.png"),
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ tool_capabilities = {
+ max_drop_level = 0,
+ groupcaps = {
+ fleshy = {times={}, uses=10000, maxlevel=0}
+ }
+ }
+})
+
+
+minetest.register_craftitem("technic:fine_copper_wire", {
+ description = S("Fine Copper Wire"),
+ inventory_image = "technic_fine_copper_wire.png",
+})
+
+minetest.register_craftitem("technic:fine_gold_wire", {
+ description = S("Fine Gold Wire"),
+ inventory_image = "technic_fine_gold_wire.png",
+})
+
+minetest.register_craftitem("technic:fine_silver_wire", {
+ description = S("Fine Silver Wire"),
+ inventory_image = "technic_fine_silver_wire.png",
+})
+
+minetest.register_craftitem("technic:copper_coil", {
+ description = S("Copper Coil"),
+ inventory_image = "technic_copper_coil.png",
+})
+
+minetest.register_craftitem("technic:motor", {
+ description = S("Electric Motor"),
+ inventory_image = "technic_motor.png",
+})
+
+minetest.register_craftitem("technic:lv_transformer", {
+ description = S("Low Voltage Transformer"),
+ inventory_image = "technic_lv_transformer.png",
+})
+
+minetest.register_craftitem("technic:mv_transformer", {
+ description = S("Medium Voltage Transformer"),
+ inventory_image = "technic_mv_transformer.png",
+})
+
+minetest.register_craftitem( "technic:hv_transformer", {
+ description = S("High Voltage Transformer"),
+ inventory_image = "technic_hv_transformer.png",
+})
+
+minetest.register_craftitem( "technic:control_logic_unit", {
+ description = S("Control Logic Unit"),
+ inventory_image = "technic_control_logic_unit.png",
+})
+
+minetest.register_craftitem("technic:mixed_metal_ingot", {
+ description = S("Mixed Metal Ingot"),
+ inventory_image = "technic_mixed_metal_ingot.png",
+})
+
+minetest.register_craftitem("technic:composite_plate", {
+ description = S("Composite Plate"),
+ inventory_image = "technic_composite_plate.png",
+})
+
+minetest.register_craftitem("technic:copper_plate", {
+ description = S("Copper Plate"),
+ inventory_image = "technic_copper_plate.png",
+})
+
+minetest.register_craftitem("technic:carbon_plate", {
+ description = S("Carbon Plate"),
+ inventory_image = "technic_carbon_plate.png",
+})
+
+minetest.register_craftitem("technic:graphite", {
+ description = S("Graphite"),
+ inventory_image = "technic_graphite.png",
+})
+
+minetest.register_craftitem("technic:carbon_cloth", {
+ description = S("Carbon Cloth"),
+ inventory_image = "technic_carbon_cloth.png",
+})
+
+minetest.register_node("technic:machine_casing", {
+ description = S("Machine Casing"),
+ groups = {cracky=2},
+ sunlight_propagates = true,
+ paramtype = "light",
+ drawtype = "allfaces",
+ tiles = {"technic_machine_casing.png"},
+ sounds = default.node_sound_stone_defaults(),
+})
+
+for p = 0, 35 do
+ local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil
+ local psuffix = p == 7 and "" or p
+ local ingot = "technic:uranium"..psuffix.."_ingot"
+ local block = "technic:uranium"..psuffix.."_block"
+ local ov = p == 7 and minetest.override_item or nil;
+ (ov or minetest.register_craftitem)(ingot, {
+ description = string.format(S("%.1f%%-Fissile Uranium Ingot"), p/10),
+ inventory_image = "technic_uranium_ingot.png",
+ groups = {uranium_ingot=1, not_in_creative_inventory=nici},
+ });
+ -- Note on radioactivity of blocks:
+ -- Source: <http://www.wise-uranium.org/rup.html>
+ -- The baseline radioactivity of an isotope is not especially
+ -- correlated with whether it's fissile (i.e., suitable as
+ -- reactor fuel). Natural uranium consists mainly of fissile
+ -- U-235 and non-fissile U-238, and both U-235 and U-238 are
+ -- significantly radioactive. U-235's massic activity is
+ -- about 80.0 MBq/kg, and U-238's is about 12.4 MBq/kg, which
+ -- superficially suggests that 3.5%-fissile uranium should have
+ -- only 1.19 times the activity of fully-depleted uranium.
+ -- But a third isotope affects the result hugely: U-234 has
+ -- massic activity of 231 GBq/kg. Natural uranium has massic
+ -- composition of 99.2837% U-238, 0.711% U-235, and 0.0053% U-234,
+ -- so its activity comes roughly 49% each from U-234 and U-238
+ -- and only 2% from U-235. During enrichment via centrifuge,
+ -- the U-234 fraction is concentrated along with the U-235, with
+ -- the U-234:U-235 ratio remaining close to its original value.
+ -- (Actually the U-234 gets separated from U-238 slightly more
+ -- than the U-235 is, so the U-234:U-235 ratio is slightly
+ -- higher in enriched uranium.) A typical massic composition
+ -- for 3.5%-fissile uranium is 96.47116% U-238, 3.5% U-235, and
+ -- 0.02884% U-234. This gives 3.5%-fissile uranium about 6.55
+ -- times the activity of fully-depleted uranium. The values we
+ -- compute here for the "radioactive" group value are based on
+ -- linear interpolation of activity along that scale, rooted at
+ -- a natural (0.7%-fissile) uranium block having the activity of
+ -- 9 uranium ore blocks (due to 9 ingots per block). The group
+ -- value is proportional to the square root of the activity, and
+ -- uranium ore has radioactive=1000. This yields radioactive=2065
+ -- for a fully-depleted uranium block and radioactive=5286 for
+ -- a 3.5%-fissile uranium block.
+ (ov or minetest.register_node)(block, {
+ description = string.format(S("%.1f%%-Fissile Uranium Block"), p/10),
+ tiles = {"technic_uranium_block.png"},
+ is_ground_content = true,
+ groups = {uranium_block=1, not_in_creative_inventory=nici, cracky=1, level=2, radioactive=math.floor(1000*math.sqrt((1+5.55*p/35) * 9 / (1+5.55*7/35)) + 0.5)},
+ sounds = default.node_sound_stone_defaults(),
+ });
+ if not ov then
+ minetest.register_craft({
+ output = block,
+ recipe = {
+ {ingot, ingot, ingot},
+ {ingot, ingot, ingot},
+ {ingot, ingot, ingot},
+ },
+ })
+ minetest.register_craft({
+ output = ingot.." 9",
+ recipe = {{block}},
+ })
+ end
+end
diff --git a/technic/technic/legacy.lua b/technic/technic/legacy.lua
new file mode 100644
index 0000000..8360a71
--- /dev/null
+++ b/technic/technic/legacy.lua
@@ -0,0 +1,38 @@
+
+-- Aliases to convert from legacy node/item names
+
+technic.legacy_nodenames = {
+ ["technic:alloy_furnace"] = "technic:lv_alloy_furnace",
+ ["technic:alloy_furnace_active"] = "technic:lv_alloy_furnace_active",
+ ["technic:battery_box"] = "technic:lv_battery_box0",
+ ["technic:battery_box1"] = "technic:lv_battery_box1",
+ ["technic:battery_box2"] = "technic:lv_battery_box2",
+ ["technic:battery_box3"] = "technic:lv_battery_box3",
+ ["technic:battery_box4"] = "technic:lv_battery_box4",
+ ["technic:battery_box5"] = "technic:lv_battery_box5",
+ ["technic:battery_box6"] = "technic:lv_battery_box6",
+ ["technic:battery_box7"] = "technic:lv_battery_box7",
+ ["technic:battery_box8"] = "technic:lv_battery_box8",
+ ["technic:electric_furnace"] = "technic:lv_electric_furnace",
+ ["technic:electric_furnace_active"] = "technic:lv_electric_furnace_active",
+ ["technic:grinder"] = "technic:lv_grinder",
+ ["technic:grinder_active"] = "technic:lv_grinder_active",
+ ["technic:extractor"] = "technic:lv_extractor",
+ ["technic:extractor_active"] = "technic:lv_extractor_active",
+ ["technic:compressor"] = "technic:lv_compressor",
+ ["technic:compressor_active"] = "technic:lv_compressor_active",
+ ["technic:hv_battery_box"] = "technic:hv_battery_box0",
+ ["technic:hv_cable"] = "technic:hv_cable0",
+ ["technic:lv_cable"] = "technic:lv_cable0",
+ ["technic:mv_cable"] = "technic:mv_cable0",
+ ["technic:mv_battery_box"] = "technic:mv_battery_box0",
+ ["technic:generator"] = "technic:lv_generator",
+ ["technic:generator_active"] = "technic:lv_generator_active",
+ ["technic:iron_dust"] = "technic:wrought_iron_dust",
+ ["technic:enriched_uranium"] = "technic:uranium35_ingot",
+}
+
+for old, new in pairs(technic.legacy_nodenames) do
+ minetest.register_alias(old, new)
+end
+
diff --git a/technic/technic/locale/de.txt b/technic/technic/locale/de.txt
new file mode 100644
index 0000000..855ec5a
--- /dev/null
+++ b/technic/technic/locale/de.txt
@@ -0,0 +1,204 @@
+# German Translation for Technic Mod
+# Deutsche Uebersetzung des Technic Mods
+# by Xanthin
+
+## Misc
+[Technic] Loaded in %f seconds = [Technic] ist in %f Sekunden geladen
+
+## Items
+Silicon Wafer = Siliziumscheibe
+Doped Silicon Wafer = Dotierte Siliziumscheibe
+Enriched Uranium = Angereichertes Uran
+Uranium Fuel = Uranbrennstoff
+Diamond Drill Head = Diamantbohrkopf
+Blue Energy Crystal = Blauer Energiekristall
+Green Energy Crystal = Gruener Energiekristall
+Red Energy Crystal = Roter Energiekristall
+Fine Copper Wire = Feinkupferdraht
+Copper Coil = Kupferspule
+Electric Motor = Elektromotor
+Low Voltage Transformer = Niederspannungstransformator
+Medium Voltage Transformer = Mittelspannungstransformator
+High Voltage Transformer = Hochspannungstransformator
+Control Logic Unit = Steuer- und Regelungseinheit
+Mixed Metal Ingot = Mischmetallbarren
+Composite Plate = Verbundplatte
+Copper Plate = Kupferplatte
+Carbon Plate = Kohlefaserplatte
+Graphite = Graphit
+Carbon Cloth = Kohlefasergewebe
+Raw Latex = Rohlatex
+Rubber Fiber = Gummifaser
+%.1f%%-Fissile Uranium Ingot =
+%.1f%%-Fissile Uranium Block =
+
+## Machine misc
+Machine cannot be removed because it is not empty = Die Maschine kann nicht entfernt werden, weil sie noch nicht leer ist.
+Inventory move disallowed due to protection = Das Inventar ist geschuetzt, Zugriff verweigert.
+# $1: Machine name (Includes tier)
+@1 Active (@2 EU) = @1 ist eingeschaltet (@2 EU)
+%s Active = %s ist eingeschaltet
+%s Disabled = %s ist ausgeschaltet
+%s Enabled =
+%s Idle = %s ist bereit
+%s Improperly Placed = %s ist falsch plaziert
+%s Unpowered = %s hat keine Stromversorgung
+%s Out Of Fuel = %s hat keinen Brennstoff
+%s Has Bad Cabling = %s ist falsch verkabelt
+%s Has No Network = %s hat kein Netzwerk
+%s Finished = %s ist fertig
+Enable/Disable = Einschalten/Ausschalten
+Range = Reichweite
+Upgrade Slots = Verbesserungsfaecher
+In: = Rein:
+Out: = Raus:
+Slot %d = Fach %d
+Itemwise = Einzelstuecke
+Stackwise = Ganzer Stapel
+Owner: =
+Unlocked =
+Locked =
+Radius: =
+Enabled =
+Disabled =
+
+## Machine names
+# $1: Tier
+%s Alloy Furnace = %s Legierungsofen
+%s Battery Box = %s Batteriebox
+%s Cable = %s Kabel
+%s CNC Machine = %s CNC-Maschine
+%s Compressor = %s Kompressor
+%s Extractor = %s Extraktor
+%s Forcefield Emitter = %s Kraftfeld-Emitter
+%s Furnace = %s Ofen
+%s Grinder = %s Schleifmaschine
+%s Music Player = %s Musikspieler
+%s Quarry = %s Steinbruch
+%s Tool Workshop = %s Werkzeugwerkstatt
+Arrayed Solar %s Generator = %s Solaranlage
+Fuel-Fired %s Generator = %s Kohle-Generator
+Geothermal %s Generator = %s Geothermie-Generator
+Hydro %s Generator = %s Wassermuehle
+Nuclear %s Generator Core = %s Reaktorkern
+Small Solar %s Generator = %s Solarmodul
+Wind %s Generator = %s Windmuehle
+Self-Contained Injector = Selbstversorger-Injektor
+Constructor Mk%d = Konstruktor Modell %d
+Frame = Rahmen
+Frame Motor = Rahmenmotor
+Template = Schablone
+Template (replacing) = Schablone (ersetzend)
+Template motor = Schablonenmotor
+Template tool = Schablonenwerkzeug
+Battery Box = Batteriebox
+Supply Converter = Stromumwandler
+Switching Station = Schaltanlage
+Fuel-Fired Alloy Furnace = Kohle-Legierungsofen
+Fuel-Fired Furnace = Kohle-Ofen
+Wind Mill Frame = Windmuehlengeruest
+Forcefield = Kraftfeld
+Nuclear Reactor Rod Compartment = Brennstabfaecher
+Administrative World Anchor =
+
+## Machine-specific
+# $1: Pruduced EU
+Charge = Aufladen
+Discharge = Entladen
+Power level = Energiestufe
+# $1: Tier $2: current_charge $3: max_charge
+@1 Battery Box: @2/@3 = @1 Batteriebox: @2/@3
+# $1: Machine name $2: Supply $3: Demand
+@1. Supply: @2 Demand: @3 = @1. Versorgung: @2 Bedarf: @3
+Production at %d%% = Produktion bei %d%%
+Choose Milling Program: = Waehle ein Fraesprogramm:
+Slim Elements half / normal height: = Schmale Elemente von halber / normaler Hoehe:
+Current track %s = Aktueller Titel %s
+Stopped =
+Keeping %d/%d map blocks loaded =
+Digging not started =
+Digging finished =
+Digging %d m above machine =
+Digging %d m below machine =
+
+## CNC
+Cylinder = Zylinder
+Element Cross = Halbes Kreuzelement
+Element Cross Double = Kreuzelement
+Element Edge = Halbes Eckelement
+Element Edge Double = Eckelement
+Element End = Halbes Endelement
+Element End Double = Endelement
+Element Straight = Halbes aufrechtes Element
+Element Straight Double = Aufrechtes Element
+Element T = Halbes T-Element
+Element T Double = T-Element
+Horizontal Cylinder = Liegender Zylinder
+One Curved Edge Block = Block mit einer abgerundeten Kante
+Pyramid = Pyramide
+Slope = Schraege
+Slope Edge = Schraege mit Ecke
+Slope Inner Edge = Schraege mit Innenecke
+Slope Lying = Liegende Schraege
+Slope Upside Down = Umgedrehte Schraege
+Slope Upside Down Edge = Umgedrehte Schraege mit Ecke
+Slope Upside Down Inner Edge = Umgedrehte Schraege mit Innenecke
+Sphere = Kugel
+Spike = Spitze
+Stick = Stange
+Two Curved Edge Block = Block mit zwei abgerundeten Kanten
+Brick = Ziegel:
+Cobble = Pflasterstein:
+Dirt = Erde:
+Leaves = Laub:
+Sandstone = Sandstein:
+Stone = Stein:
+Tree = Baumstamm:
+Wooden = Holz:
+
+## Grinder Recipes
+# $1: Name
+%s Dust = %sstaub
+Akalin = Akalin
+Alatro = Alatro
+Arol = Arol
+Brass = Messing
+Bronze = Bronze
+Carbon Steel = Kohlenstoffstahl
+Cast Iron = Gusseisen
+Chromium = Chrom
+Coal = Kohle
+Copper = Kupfer
+Gold = Gold
+Mithril = Mithril
+Silver = Silber
+Stainless Steel = Edelstahl
+Talinite = Talinite
+Tin = Zinn
+Wrought Iron = Schmiedeeisen
+Zinc = Zink
+%.1f%%-Fissile Uranium =
+
+## Tools
+RE Battery = Akkubatterie
+Water Can = Wasserkanister
+Lava Can = Lavakanister
+Chainsaw = Kettensaege
+Flashlight = Taschenlampe
+3 nodes deep. = 3 Bloecke tief.
+3 nodes tall. = 3 Bloecke hoch.
+3 nodes wide. = 3 Bloecke breit.
+3x3 nodes. = 3x3 Bloecke.
+Use while sneaking to change Mining Drill Mk%d modes. = Halte die Shift-Taste beim Benutzen gedrueckt, um die Funktion des Bergbaubohrers Modell %d zu aendern.
+Mining Drill Mk%d Mode %d = Bergbaubohrer Modell %d Funktion %d
+Mining Drill Mk%d = Bergbaubohrer Modell %d
+Mining Laser Mk%d = Bergbaulaser Modell %d
+Single node. = Einzelblock
+Sonic Screwdriver = Schallschraubendreher
+Tree Tap = Baumzapfhahn
+
+## Craft descriptions
+Alloy cooking =
+Grinding =
+Compressing =
+Extracting =
diff --git a/technic/technic/locale/es.txt b/technic/technic/locale/es.txt
new file mode 100644
index 0000000..7945d65
--- /dev/null
+++ b/technic/technic/locale/es.txt
@@ -0,0 +1,197 @@
+# Spanish Translation for Technic Mod
+# Traduccion al Español del Mod Technic
+# Autor: Diego Martínez <kaeza>
+
+## Misc
+[Technic] Loaded in %f seconds = [Technic] Cargado en %f segundos
+
+## Items
+Silicon Wafer = Oblea de Silicio
+Doped Silicon Wafer = Oblea de Silicio Dopada
+Enriched Uranium = Uranio Enriquecido
+Uranium Fuel = Combustible de Uranio
+Diamond Drill Head = Mecha de Taladro de Diamante
+Blue Energy Crystal = Cristal de Energia Azul
+Green Energy Crystal = Cristal de Energia Verde
+Red Energy Crystal = Cristal de Energia Rojo
+Fine Copper Wire = Cable Fino de Cobre
+Copper Coil = Resorte de Cobre
+Electric Motor = Motor Electrico
+Low Voltage Transformer = Transformador de Bajo Voltaje
+Medium Voltage Transformer = Transformador de Voltaje Medio
+High Voltage Transformer = Transformador de Alto Voltaje
+Control Logic Unit = Unidad Logica de Control
+Mixed Metal Ingot = Lingote de Metal Mezclado
+Composite Plate = Placa de Compuestos
+Copper Plate = Placa de Cobre
+Carbon Plate = Placa de Carbon
+Graphite = Grafito
+Carbon Cloth = Tela de Carbon
+Raw Latex = Latex Crudo
+Rubber Fiber = Fibra de Hule
+%.1f%%-Fissile Uranium Ingot =
+%.1f%%-Fissile Uranium Block =
+
+## Machine misc
+Machine cannot be removed because it is not empty = La maquina no puede removerse porque no esta vacia
+Inventory move disallowed due to protection =
+# $1: Machine name (Includes tier)
+@1 Active (@2 EU) = @1 Activo (@2 EU)
+%s Active = %s Activo
+%s Enabled =
+%s Idle = %s Quieto
+%s Unpowered = %s Sin Energia
+%s Out Of Fuel = %s Sin Combustible
+%s Has Bad Cabling = %s Tiene Mal Cableado
+%s Has No Network = %s No Tiene Una Red
+%s Finished = %s Terminado
+%s Disabled = %s Deshabilitado
+%s Improperly Placed = %s No Colocado Apropiadamente
+Range = Alcance
+Enable/Disable = Habilitar/Deshabilitar
+Itemwise =
+Stackwise =
+Owner: =
+Unlocked =
+Locked =
+Radius: =
+Enabled =
+Disabled =
+
+## Machine names
+# $1: Tier
+%s Alloy Furnace = Horno de Aleacion %s
+%s Battery Box = Caja de Bateria %s
+%s Cable = Cable %s
+%s CNC Machine = Maquina CNC %s
+%s Compressor = Compresor %s
+%s Extractor = Extractor %s
+%s Forcefield Emitter = Emisor de Campo de Fuerza %s
+%s Furnace = Horno %s
+%s Grinder = Amoladora %s
+%s Music Player = Reproductor de Musica %s
+%s Quarry = Cantera %s
+%s Tool Workshop = Taller de Herramientas %s
+Arrayed Solar %s Generator = Panel Solar %s
+Fuel-Fired %s Generator = Generador a Carbon %s
+Geothermal %s Generator = Generador Geotermico %s
+Hydro %s Generator = Molino de Agua %s
+Nuclear %s Generator Core = Nucleo de Reactor Nuclear %s
+Small Solar %s Generator = Panel Solar %s
+Wind %s Generator = Molino de Viento %s
+Self-Contained Injector =
+Constructor Mk%d =
+Frame =
+Frame Motor =
+Template =
+Template (replacing) =
+Template Motor =
+Template Tool =
+Supply Converter = Convertidor de Alimentacion
+Switching Station = Estacion de Conmutacion
+Battery Box = Caja de Baterias
+Fuel-Fired Alloy Furnace = Horno de Aleacion a Carbon
+Fuel-Fired Furnace = Horno a Carbon
+Forcefield = Campo de Fuerza
+Nuclear Reactor Rod Compartment = Compartimiento para Vara de Reactor Nuclear
+Wind Mill Frame = Armazon de Molino de Viento
+Administrative World Anchor =
+
+## Machine-specific
+# $1: Pruduced EU
+Charge = Cargar
+Discharge = Descargar
+Power level = Nivel de Poder
+# $1: Tier $2: current_charge $3: max_charge
+@1 Battery Box: @2/@3 = Caja de Bateria @1: @2/@3
+# $1: Machine name $2: Supply $3: Demand
+@1. Supply: @2 Demand: @3 = @1. Alimentacion: @2 Demanda: @3
+# $1: Production percent
+Production at %d%% = Produccion en %d%%
+Stopped =
+Keeping %d/%d map blocks loaded =
+Digging not started =
+Digging finished =
+Digging %d m above machine =
+Digging %d m below machine =
+
+## CNC Machine
+Element Edge = Elemento Borde
+Tree = Arbol
+Element Cross Double = Elemento Cruz Doble
+Spike = Pica
+Element Edge Double = Elemento Borde Doble
+Two Curved Edge Block = Dos Bloques de Borde Curvados
+Pyramid = Piramide
+Slope Upside Down Inner Edge = Borde Interno de Rampa Al Reves
+Slope Upside Down Edge = Borde de Rampa Al Reves
+Element Straight Double = Elemento Doble Recto
+Sphere = Esfera
+Element End Double = Doble Fin de Elemento
+Element Straight = Recta de Elemento
+Horizontal Cylinder = Cilindro Horizontal
+Slope Inner Edge = Borde Interno de Rampa
+One Curved Edge Block = Un Bloque de Borde Curvado
+Element Cross = Cruce de Elementos
+Stick = Varita
+Element End = Fin de Elemento
+Slope Lying = Rampa en Reposo
+Slope Upside Down = Rampa Al Reves
+Slope Edge = Borde de Rampa
+Slope = Rampa
+Element T = Elemento T
+Cylinder = Cilindro
+Cobble = Adoquines
+Stone = Piedra
+Brick = Ladrillo
+Dirt = Tierra
+Sandstone = Arenisca
+Wooden = Madera
+Leaves = Hojas
+
+## Grinder Recipes
+# $1: Name
+%s Dust = Polvo de %s
+Akalin = Akalina
+Alatro = Alatro
+Arol = Arol
+Brass = Laton
+Bronze = Bronce
+Carbon Steel = Acero al Carbono
+Cast Iron = Hierro Fundido
+Chromium = Cromo
+Coal = Carbon
+Copper = Cobre
+Gold = Oro
+Mithril = Mitrilo
+Silver = Plata
+Stainless Steel = Acero Inoxidable
+Talinite = Talinita
+Tin = Estanio
+Wrought Iron = Hierro Forjado
+Zinc = Zinc
+%.1f%%-Fissile Uranium =
+
+## Tools
+RE Battery =
+Water Can = Bidon de Agua
+Lava Can = Bidon de Lava
+Chainsaw = Motosierra
+Flashlight = Linterna
+3 nodes deep. = 3 nodos de profundo.
+3 nodes tall. = 3 nodos de alto.
+3 nodes wide. = 3 nodos de ancho.
+3x3 nodes. = 3x3 nodos.
+Use while sneaking to change Mining Drill Mk%d modes. = Manten pulsado Mayus y Usar para cambiar el modo del Taladro de Mineria Mk%d.
+Mining Drill Mk%d Mode %d = Taladro de Mineria Mk%d Modo %d
+Mining Drill Mk%d = Taladro de Mineria Mk%d
+Mining Laser Mk%d = Laser de Mineria Mk%d
+Single node. = Nodo simple.
+Sonic Screwdriver = Destonillador Sonico
+Tree Tap = Grifo de Arbol
+
+## Craft descriptions
+Alloy cooking =
+Grinding =
+Compressing =
+Extracting =
diff --git a/technic/technic/locale/it.txt b/technic/technic/locale/it.txt
new file mode 100644
index 0000000..59ba7f6
--- /dev/null
+++ b/technic/technic/locale/it.txt
@@ -0,0 +1,201 @@
+
+## Misc
+[Technic] Loaded in %f seconds = [Technic] caricato in %f secondi
+
+## Items
+Silicon Wafer = Wafer di silicone
+Doped Silicon Wafer = Wafer di silicone dopato
+Enriched Uranium = Uranio arricchito
+Uranium Fuel = Uranio Combustibile
+Diamond Drill Head = Trivella diamantata
+Blue Energy Crystal = Cristallo energetico blu
+Green Energy Crystal = Cristallo energetico verde
+Red Energy Crystal = Cristallo energetico rosso
+Fine Copper Wire = Filo di rame fine
+Copper Coil = Bobina di rame
+Electric Motor = Motore elettrico
+Low Voltage Transformer = Trasformatore in bassa tensione
+Medium Voltage Transformer = Trasformatore in media tensione
+High Voltage Transformer = Trasformatore in alta tensione
+Control Logic Unit = Unità di controllo logica
+Mixed Metal Ingot = Lingotto in lega ibrida
+Composite Plate = Lastra composita
+Copper Plate = Lastra di rame
+Carbon Plate = Lastra in carbonio
+Graphite = Lastra in graffite
+Carbon Cloth = Fibra di carbonio
+Raw Latex = Latex grezzo
+Rubber Fiber = Fibra di gomma
+%.1f%%-Fissile Uranium Ingot =
+%.1f%%-Fissile Uranium Block =
+
+## Machine misc
+Machine cannot be removed because it is not empty = La macchina non può essere rimossa perchè non è vuota
+Inventory move disallowed due to protection = Impossibile muovere l'inventario a causa della protezione
+# $1: Machine name (Includes tier)
+@1 Active (@2 EU) = @1 Attivo (@2 EU)
+%s Active = %s Attivo
+%s Disabled = %s Disabilitato
+%s Enabled =
+%s Idle = %s Inattivo
+%s Improperly Placed = %s Piazzato impropiamente
+%s Unpowered = %s Non alimentato
+%s Out Of Fuel = %s senza carburante
+%s Has Bad Cabling = %s ha un cablaggio scorretto
+%s Has No Network = %s non è collegata
+%s Finished = %s Finito
+Enable/Disable = Abilita/Disabilita
+Range = Raggio
+Upgrade Slots =
+In: = Ingresso:
+Out: = Uscita:
+Slot %d =
+Itemwise = Singolo elemento
+Stackwise = pila completa
+Owner: =
+Unlocked =
+Locked =
+Radius: =
+Enabled =
+Disabled =
+
+## Machine names
+# $1: Tier
+%s Alloy Furnace = %s Fornace per leghe
+%s Battery Box = %s Box batterie
+%s Cable = Cavo %s
+%s CNC Machine = Tornio CNC %s
+%s Compressor = Compressore %s
+%s Extractor = Estrattore %s
+%s Forcefield Emitter = Emettitore di campo di forza %s
+%s Furnace = %s Fornace
+%s Grinder = %s Tritatutto
+%s Music Player = Music Player %s
+%s Quarry = Cava %s
+%s Tool Workshop = Officina per attrezzi %s
+Arrayed Solar %s Generator = %s Pannello Solare
+Fuel-Fired %s Generator = %s Generatore a carbone
+Geothermal %s Generator = %s Generatore Geotermico
+Hydro %s Generator = Turbina Elettrica %s
+Nuclear %s Generator Core = Reattore nucleare %s
+Small Solar %s Generator = %s Pannello solare
+Wind %s Generator = %s Generatore eolico
+Self-Contained Injector = Ignettore
+Constructor Mk%d = Costruttore Mk%d
+Frame = Cornice
+Frame Motor = Cornice del motore
+Template =
+Template (replacing) = Template (rimpiazzato)
+Template Motor =
+Template Tool =
+Battery Box = Box batterie
+Supply Converter = Trasformatore
+Switching Station = Stazione di controllo
+Fuel-Fired Alloy Furnace = Fornace per leghe a carbone
+Fuel-Fired Furnace = Fornace a carbone
+Wind Mill Frame = Pala eolica
+Forcefield = Campo di forza
+Nuclear Reactor Rod Compartment = Compartimento combustibile nucleare
+Administrative World Anchor =
+
+## Machine-specific
+# $1: Pruduced EU
+Charge = Carica
+Discharge = Scarica
+Power level = Livello di potenza
+# $1: Tier $2: current_charge $3: max_charge
+@1 Battery Box: @2/@3 = @1 Box Batterie: @2/@3
+# $1: Machine name $2: Supply $3: Demand
+@1. Supply: @2 Demand: @3 = @1. Prodotto: @2 Consumato: @3
+Production at %d%% = Produzione a %d%%
+Choose Milling Program: = Scegliere un programma di Fresatura
+Slim Elements half / normal height: = Metà elementi sottili / altezza normale:
+Current track %s = Traccia corrente %s
+Stopped =
+Keeping %d/%d map blocks loaded =
+Digging not started =
+Digging finished =
+Digging %d m above machine =
+Digging %d m below machine =
+
+## CNC
+Cylinder = Cilindro
+Element Cross = Elemento a croce
+Element Cross Double = Elemento a croce doppio
+Element Edge = Elemento bordo
+Element Edge Double = Elemento bordo doppio
+Element End = Elemento finale
+Element End Double = Elemento finale doppio
+Element Straight = Elemento dritto
+Element Straight Double = Elemento dritto doppio
+Element T = Elemento a T
+Element T Double = Elemento a T doppio
+Horizontal Cylinder = Cilindro orizzontale
+One Curved Edge Block = Blocco con bordo curvo
+Pyramid = Piramide
+Slope = Inclinato
+Slope Edge = Bordo inclinato
+Slope Inner Edge = Bordo interno inclinato
+Slope Lying = Pendenza bugiarda
+Slope Upside Down = Pendenza capovolta
+Slope Upside Down Edge = Bordo inclinato capovolto
+Slope Upside Down Inner Edge = Bordo interno inclinato capovolto
+Sphere = Sfera
+Spike = Spuntone
+Stick = Bastone
+Two Curved Edge Block = Blocco con bordo a doppia curva
+Brick = Mattone
+Cobble = Ciottolato
+Dirt = Terra
+Leaves = Foglie
+Sandstone = Arenaria
+Stone = Pietra
+Tree = Albero
+Wooden = Legno
+
+## Grinder Recipes
+# $1: Name
+%s Dust = Polvere di %s
+Akalin = Alcalino
+Alatro = Alatro
+Arol = Arol
+Brass = Ottone
+Bronze = Bronzo
+Carbon Steel = Acciaio al Carbonio
+Cast Iron = Ghisa
+Chromium = Cromo
+Coal = Carbone
+Copper = Rame
+Gold = Oro
+Mithril = Mithril
+Silver = Argento
+Stainless Steel = Acciaio Inossidabile
+Talinite = Talinite
+Tin = Stagno
+Wrought Iron = Ferro Battuto
+Zinc = Zinco
+%.1f%%-Fissile Uranium =
+
+## Tools
+RE Battery =
+Water Can = Serbatoio d'acqua
+Lava Can = Serbatoio di lava
+Chainsaw = Motosega
+Flashlight = Torcia
+3 nodes deep. = 3 nodi in profondità.
+3 nodes tall. = 3 nodi in altezza.
+3 nodes wide. = 3 nodi in larghezza.
+3x3 nodes. = 3x3 nodi.
+Use while sneaking to change Mining Drill Mk%d modes. = Premi shift (freccia grossa) e usa per cambiare modalità nella trivella da miniera Mk%d.
+Mining Drill Mk%d Mode %d = Trivella mk%d in modalità %d
+Mining Drill Mk%d = Trivella da miniera mk%d
+Mining Laser Mk%d = Laser da miniera mk%d
+Single node. = Nodo singolo.
+Sonic Screwdriver = Cacciavite sonico
+Tree Tap = Batti albero
+
+## Craft descriptions
+Alloy cooking = Cottura lege
+Grinding = Macinazione
+Compressing = Compressione
+Extracting = Estrazione
diff --git a/technic/technic/locale/template.txt b/technic/technic/locale/template.txt
new file mode 100644
index 0000000..0464241
--- /dev/null
+++ b/technic/technic/locale/template.txt
@@ -0,0 +1,211 @@
+# template.txt
+# Template for translations of Technic
+
+
+## Misc
+[Technic] Loaded in %f seconds =
+
+## Items
+Silicon Wafer =
+Doped Silicon Wafer =
+Enriched Uranium =
+Uranium Fuel =
+Diamond Drill Head =
+Blue Energy Crystal =
+Green Energy Crystal =
+Red Energy Crystal =
+Fine Copper Wire =
+Copper Coil =
+Electric Motor =
+Low Voltage Transformer =
+Medium Voltage Transformer =
+High Voltage Transformer =
+Control Logic Unit =
+Mixed Metal Ingot =
+Composite Plate =
+Copper Plate =
+Carbon Plate =
+Graphite =
+Carbon Cloth =
+Raw Latex =
+Rubber Fiber =
+%.1f%%-Fissile Uranium Ingot =
+%.1f%%-Fissile Uranium Block =
+
+## Machine misc
+Machine cannot be removed because it is not empty =
+Inventory move disallowed due to protection =
+# $1: Machine name (Includes tier)
+@1 Active (@2 EU) =
+%s Active =
+%s Disabled =
+%s Enabled =
+%s Idle =
+%s Improperly Placed =
+%s is empty =
+%s Unpowered =
+%s Out Of Fuel =
+%s Has Bad Cabling =
+%s (Slave) =
+%s Has No Network =
+%s Finished =
+Enable/Disable =
+Range =
+Upgrade Slots =
+In: =
+Out: =
+Slot %d =
+Itemwise =
+Stackwise =
+Ignoring Mesecon Signal =
+Controlled by Mesecon Signal =
+Owner: =
+Unlocked =
+Locked =
+Radius: =
+Enabled =
+Disabled =
+
+## Machine names
+# $1: Tier
+%s Alloy Furnace =
+%s Battery Box =
+%s Cable =
+%s CNC Machine =
+%s Centrifuge =
+%s Compressor =
+%s Extractor =
+%s Forcefield Emitter =
+%s Furnace =
+%s Grinder =
+%s Music Player =
+%s Quarry =
+%s Tool Workshop =
+Arrayed Solar %s Generator =
+Fuel-Fired %s Generator =
+Geothermal %s Generator =
+Hydro %s Generator =
+Nuclear %s Generator Core =
+Small Solar %s Generator =
+Wind %s Generator =
+Self-Contained Injector =
+Constructor Mk%d =
+Frame =
+Frame Motor =
+Template =
+Template (replacing) =
+Template Motor =
+Template Tool =
+Battery Box =
+Supply Converter =
+Switching Station =
+Fuel-Fired Alloy Furnace =
+Fuel-Fired Furnace =
+Wind Mill Frame =
+Forcefield =
+Nuclear Reactor Rod Compartment =
+Administrative World Anchor =
+
+## Machine-specific
+# $1: Pruduced EU
+Charge =
+Discharge =
+Power level =
+# $1: Tier $2: current_charge $3: max_charge
+@1 Battery Box: @2/@3 =
+# $1: Machine name $2: Supply $3: Demand
+@1. Supply: @2 Demand: @3 =
+Production at %d%% =
+Choose Milling Program: =
+Slim Elements half / normal height: =
+Current track %s =
+Stopped =
+Keeping %d/%d map blocks loaded =
+Digging not started =
+Digging finished =
+Digging %d m above machine =
+Digging %d m below machine =
+@1 (@2 @3 -> @4 @5) =
+
+## CNC
+Cylinder =
+Element Cross =
+Element Cross Double =
+Element Edge =
+Element Edge Double =
+Element End =
+Element End Double =
+Element Straight =
+Element Straight Double =
+Element T =
+Element T Double =
+Horizontal Cylinder =
+One Curved Edge Block =
+Pyramid =
+Slope =
+Slope Edge =
+Slope Inner Edge =
+Slope Lying =
+Slope Upside Down =
+Slope Upside Down Edge =
+Slope Upside Down Inner Edge =
+Sphere =
+Spike =
+Stick =
+Two Curved Edge Block =
+Brick =
+Cobble =
+Dirt =
+Leaves =
+Sandstone =
+Stone =
+Tree =
+Wooden =
+
+## Grinder Recipes
+# $1: Name
+%s Dust =
+Akalin =
+Alatro =
+Arol =
+Brass =
+Bronze =
+Carbon Steel =
+Cast Iron =
+Chromium =
+Coal =
+Copper =
+Gold =
+Mithril =
+Silver =
+Stainless Steel =
+Talinite =
+Tin =
+Wrought Iron =
+Zinc =
+%.1f%%-Fissile Uranium =
+
+## Tools
+RE Battery =
+Water Can =
+Lava Can =
+Chainsaw =
+Flashlight =
+3 nodes deep. =
+3 nodes tall. =
+3 nodes wide. =
+3x3 nodes. =
+Use while sneaking to change Mining Drill Mk%d modes. =
+Mining Drill Mk%d Mode %d =
+Mining Drill Mk%d =
+Mining Laser Mk%d =
+Single node. =
+Sonic Screwdriver =
+Tree Tap =
+
+## Craft descriptions
+Alloy cooking =
+Grinding =
+Compressing =
+Extracting =
+Separating =
diff --git a/technic/technic/machines/HV/battery_box.lua b/technic/technic/machines/HV/battery_box.lua
new file mode 100644
index 0000000..1e054ec
--- /dev/null
+++ b/technic/technic/machines/HV/battery_box.lua
@@ -0,0 +1,21 @@
+-- HV battery box
+minetest.register_craft({
+ output = 'technic:hv_battery_box0',
+ recipe = {
+ {'technic:mv_battery_box0', 'technic:mv_battery_box0', 'technic:mv_battery_box0'},
+ {'technic:mv_battery_box0', 'technic:hv_transformer', 'technic:mv_battery_box0'},
+ {'', 'technic:hv_cable0', ''},
+ }
+})
+
+technic.register_battery_box({
+ tier = "HV",
+ max_charge = 1000000,
+ charge_rate = 100000,
+ discharge_rate = 400000,
+ charge_step = 10000,
+ discharge_step = 40000,
+ upgrade = 1,
+ tube = 1,
+})
+
diff --git a/technic/technic/machines/HV/cables.lua b/technic/technic/machines/HV/cables.lua
new file mode 100644
index 0000000..25297c8
--- /dev/null
+++ b/technic/technic/machines/HV/cables.lua
@@ -0,0 +1,12 @@
+
+minetest.register_craft({
+ output = 'technic:hv_cable0 3',
+ recipe = {
+ {'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'},
+ {'technic:mv_cable0', 'technic:mv_cable0', 'technic:mv_cable0'},
+ {'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting', 'homedecor:plastic_sheeting'},
+ }
+})
+
+technic.register_cable("HV", 3/16)
+
diff --git a/technic/technic/machines/HV/forcefield.lua b/technic/technic/machines/HV/forcefield.lua
new file mode 100644
index 0000000..0f0836d
--- /dev/null
+++ b/technic/technic/machines/HV/forcefield.lua
@@ -0,0 +1,261 @@
+--- Forcefield generator.
+-- @author ShadowNinja
+--
+-- Forcefields are powerful barriers but they consume huge amounts of power.
+-- The forcefield Generator is an HV machine.
+
+-- How expensive is the generator?
+-- Leaves room for upgrades lowering the power drain?
+local forcefield_power_drain = 10
+
+local S = technic.getter
+
+minetest.register_craft({
+ output = "technic:forcefield_emitter_off",
+ recipe = {
+ {"default:mese", "technic:motor", "default:mese" },
+ {"technic:deployer_off", "technic:machine_casing", "technic:deployer_off"},
+ {"default:mese", "technic:hv_cable0", "default:mese" },
+ }
+})
+
+
+local replaceable_cids = {}
+
+minetest.after(0, function()
+ for name, ndef in pairs(minetest.registered_nodes) do
+ if ndef.buildable_to == true and name ~= "ignore" then
+ replaceable_cids[minetest.get_content_id(name)] = true
+ end
+ end
+end)
+
+
+-- Idea: Let forcefields have different colors by upgrade slot.
+-- Idea: Let forcefields add up by detecting if one hits another.
+-- ___ __
+-- / \/ \
+-- | |
+-- \___/\___/
+
+local function update_forcefield(pos, meta, active, first)
+ local shape = meta:get_int("shape")
+ local range = meta:get_int("range")
+ local vm = VoxelManip()
+ local MinEdge, MaxEdge = vm:read_from_map(vector.subtract(pos, range),
+ vector.add(pos, range))
+ local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge})
+ local data = vm:get_data()
+
+ local c_air = minetest.get_content_id("air")
+ local c_field = minetest.get_content_id("technic:forcefield")
+
+ for z = -range, range do
+ for y = -range, range do
+ local vi = area:index(pos.x + (-range), pos.y + y, pos.z + z)
+ for x = -range, range do
+ local relevant
+ if shape == 0 then
+ local squared = x * x + y * y + z * z
+ relevant =
+ squared <= range * range + range and
+ squared >= (range - 1) * (range - 1) + (range - 1)
+ else
+ relevant =
+ x == -range or x == range or
+ y == -range or y == range or
+ z == -range or z == range
+ end
+ if relevant then
+ local cid = data[vi]
+ if active and replaceable_cids[cid] then
+ data[vi] = c_field
+ elseif not active and cid == c_field then
+ data[vi] = c_air
+ end
+ end
+ vi = vi + 1
+ end
+ end
+ end
+
+ vm:set_data(data)
+ vm:update_liquids()
+ vm:write_to_map()
+ -- update_map is very slow, but if we don't call it we'll
+ -- get phantom blocks on the client.
+ if not active or first then
+ vm:update_map()
+ end
+end
+
+local function set_forcefield_formspec(meta)
+ local formspec = "size[5,2.25]"..
+ "field[0.3,0.5;2,1;range;"..S("Range")..";"..meta:get_int("range").."]"
+ -- The names for these toggle buttons are explicit about which
+ -- state they'll switch to, so that multiple presses (arising
+ -- from the ambiguity between lag and a missed press) only make
+ -- the single change that the user expects.
+ if meta:get_int("shape") == 0 then
+ formspec = formspec.."button[3,0.2;2,1;shape1;"..S("Sphere").."]"
+ else
+ formspec = formspec.."button[3,0.2;2,1;shape0;"..S("Cube").."]"
+ end
+ if meta:get_int("mesecon_mode") == 0 then
+ formspec = formspec.."button[0,1;5,1;mesecon_mode_1;"..S("Ignoring Mesecon Signal").."]"
+ else
+ formspec = formspec.."button[0,1;5,1;mesecon_mode_0;"..S("Controlled by Mesecon Signal").."]"
+ end
+ if meta:get_int("enabled") == 0 then
+ formspec = formspec.."button[0,1.75;5,1;enable;"..S("%s Disabled"):format(S("%s Forcefield Emitter"):format("HV")).."]"
+ else
+ formspec = formspec.."button[0,1.75;5,1;disable;"..S("%s Enabled"):format(S("%s Forcefield Emitter"):format("HV")).."]"
+ end
+ meta:set_string("formspec", formspec)
+end
+
+local forcefield_receive_fields = function(pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ local range = nil
+ if fields.range then
+ range = tonumber(fields.range) or 0
+ -- Smallest field is 5. Anything less is asking for trouble.
+ -- Largest is 20. It is a matter of pratical node handling.
+ -- At the maximim range updating the forcefield takes about 0.2s
+ range = math.max(range, 5)
+ range = math.min(range, 20)
+ if range == meta:get_int("range") then range = nil end
+ end
+ if fields.shape0 or fields.shape1 or range then
+ update_forcefield(pos, meta, false)
+ end
+ if range then meta:set_int("range", range) end
+ if fields.shape0 then meta:set_int("shape", 0) end
+ if fields.shape1 then meta:set_int("shape", 1) end
+ if fields.enable then meta:set_int("enabled", 1) end
+ if fields.disable then meta:set_int("enabled", 0) end
+ if fields.mesecon_mode_0 then meta:set_int("mesecon_mode", 0) end
+ if fields.mesecon_mode_1 then meta:set_int("mesecon_mode", 1) end
+ set_forcefield_formspec(meta)
+end
+
+local mesecons = {
+ effector = {
+ action_on = function(pos, node)
+ minetest.get_meta(pos):set_int("mesecon_effect", 1)
+ end,
+ action_off = function(pos, node)
+ minetest.get_meta(pos):set_int("mesecon_effect", 0)
+ end
+ }
+}
+
+local function run(pos, node)
+ local meta = minetest.get_meta(pos)
+ local eu_input = meta:get_int("HV_EU_input")
+ local enabled = meta:get_int("enabled") ~= 0 and (meta:get_int("mesecon_mode") == 0 or meta:get_int("mesecon_effect") ~= 0)
+ local machine_name = S("%s Forcefield Emitter"):format("HV")
+
+ local range = meta:get_int("range")
+ local power_requirement
+ if meta:get_int("shape") == 0 then
+ power_requirement = math.floor(4 * math.pi * range * range)
+ else
+ power_requirement = 24 * range * range
+ end
+ power_requirement = power_requirement * forcefield_power_drain
+
+ if not enabled then
+ if node.name == "technic:forcefield_emitter_on" then
+ update_forcefield(pos, meta, false)
+ technic.swap_node(pos, "technic:forcefield_emitter_off")
+ meta:set_string("infotext", S("%s Disabled"):format(machine_name))
+ end
+ meta:set_int("HV_EU_demand", 0)
+ return
+ end
+ meta:set_int("HV_EU_demand", power_requirement)
+ if eu_input < power_requirement then
+ meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
+ if node.name == "technic:forcefield_emitter_on" then
+ update_forcefield(pos, meta, false)
+ technic.swap_node(pos, "technic:forcefield_emitter_off")
+ end
+ elseif eu_input >= power_requirement then
+ local first = false
+ if node.name == "technic:forcefield_emitter_off" then
+ first = true
+ technic.swap_node(pos, "technic:forcefield_emitter_on")
+ meta:set_string("infotext", S("%s Active"):format(machine_name))
+ end
+ update_forcefield(pos, meta, true, first)
+ end
+end
+
+minetest.register_node("technic:forcefield_emitter_off", {
+ description = S("%s Forcefield Emitter"):format("HV"),
+ tiles = {"technic_forcefield_emitter_off.png"},
+ groups = {cracky = 1, technic_machine = 1},
+ on_receive_fields = forcefield_receive_fields,
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_int("HV_EU_input", 0)
+ meta:set_int("HV_EU_demand", 0)
+ meta:set_int("range", 10)
+ meta:set_int("enabled", 0)
+ meta:set_int("mesecon_mode", 0)
+ meta:set_int("mesecon_effect", 0)
+ meta:set_string("infotext", S("%s Forcefield Emitter"):format("HV"))
+ set_forcefield_formspec(meta)
+ end,
+ mesecons = mesecons,
+ technic_run = run,
+})
+
+minetest.register_node("technic:forcefield_emitter_on", {
+ description = S("%s Forcefield Emitter"):format("HV"),
+ tiles = {"technic_forcefield_emitter_on.png"},
+ groups = {cracky = 1, technic_machine = 1, not_in_creative_inventory=1},
+ drop = "technic:forcefield_emitter_off",
+ on_receive_fields = forcefield_receive_fields,
+ on_destruct = function(pos)
+ local meta = minetest.get_meta(pos)
+ update_forcefield(pos, meta, false)
+ end,
+ mesecons = mesecons,
+ technic_run = run,
+ technic_on_disable = function (pos, node)
+ local meta = minetest.get_meta(pos)
+ update_forcefield(pos, meta, false)
+ technic.swap_node(pos, "technic:forcefield_emitter_off")
+ end,
+})
+
+minetest.register_node("technic:forcefield", {
+ description = S("%s Forcefield"):format("HV"),
+ sunlight_propagates = true,
+ drawtype = "glasslike",
+ groups = {not_in_creative_inventory=1},
+ paramtype = "light",
+ light_source = 15,
+ diggable = false,
+ drop = '',
+ tiles = {{
+ name = "technic_forcefield_animated.png",
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ }},
+})
+
+
+if minetest.get_modpath("mesecons_mvps") then
+ mesecon.register_mvps_stopper("technic:forcefield")
+end
+
+technic.register_machine("HV", "technic:forcefield_emitter_on", technic.receiver)
+technic.register_machine("HV", "technic:forcefield_emitter_off", technic.receiver)
+
diff --git a/technic/technic/machines/HV/generator.lua b/technic/technic/machines/HV/generator.lua
new file mode 100644
index 0000000..aa83590
--- /dev/null
+++ b/technic/technic/machines/HV/generator.lua
@@ -0,0 +1,13 @@
+minetest.register_alias("hv_generator", "technic:hv_generator")
+
+minetest.register_craft({
+ output = 'technic:hv_generator',
+ recipe = {
+ {'technic:carbon_plate', 'technic:mv_generator', 'technic:composite_plate'},
+ {'pipeworks:tube_1', 'technic:hv_transformer', 'pipeworks:tube_1'},
+ {'technic:stainless_steel_ingot', 'technic:hv_cable0', 'technic:stainless_steel_ingot'},
+ }
+})
+
+technic.register_generator({tier="HV", tube=1, supply=1200})
+
diff --git a/technic/technic/machines/HV/init.lua b/technic/technic/machines/HV/init.lua
new file mode 100644
index 0000000..d7136b4
--- /dev/null
+++ b/technic/technic/machines/HV/init.lua
@@ -0,0 +1,18 @@
+
+technic.register_tier("HV", "High Voltage")
+
+local path = technic.modpath.."/machines/HV"
+
+-- Wiring stuff
+dofile(path.."/cables.lua")
+dofile(path.."/battery_box.lua")
+
+-- Generators
+dofile(path.."/solar_array.lua")
+dofile(path.."/nuclear_reactor.lua")
+dofile(path.."/generator.lua")
+
+-- Machines
+dofile(path.."/quarry.lua")
+dofile(path.."/forcefield.lua")
+
diff --git a/technic/technic/machines/HV/nuclear_reactor.lua b/technic/technic/machines/HV/nuclear_reactor.lua
new file mode 100644
index 0000000..3aa1ba8
--- /dev/null
+++ b/technic/technic/machines/HV/nuclear_reactor.lua
@@ -0,0 +1,723 @@
+-- The enriched uranium rod driven EU generator.
+-- A very large and advanced machine providing vast amounts of power.
+-- Very efficient but also expensive to run as it needs uranium. (10000EU 86400 ticks (one week))
+-- Provides HV EUs that can be down converted as needed.
+--
+-- The nuclear reactor core needs water and a protective shield to work.
+-- This is checked now and then and if the machine is tampered with... BOOM!
+
+local burn_ticks = 7 * 24 * 60 * 60 -- (seconds).
+local power_supply = 100000 -- EUs
+local fuel_type = "technic:uranium_fuel" -- The reactor burns this stuff
+
+local S = technic.getter
+
+if not vector.length_square then
+ vector.length_square = function (v)
+ return v.x*v.x + v.y*v.y + v.z*v.z
+ end
+end
+
+-- FIXME: recipe must make more sense like a rod recepticle, steam chamber, HV generator?
+minetest.register_craft({
+ output = 'technic:hv_nuclear_reactor_core',
+ recipe = {
+ {'technic:carbon_plate', 'default:obsidian_glass', 'technic:carbon_plate'},
+ {'technic:composite_plate', 'technic:machine_casing', 'technic:composite_plate'},
+ {'technic:stainless_steel_ingot', 'technic:hv_cable0', 'technic:stainless_steel_ingot'},
+ }
+})
+
+local generator_formspec =
+ "invsize[8,9;]"..
+ "label[0,0;"..S("Nuclear Reactor Rod Compartment").."]"..
+ "list[current_name;src;2,1;3,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[]"
+
+-- "Boxy sphere"
+local nodebox = {
+ { -0.353, -0.353, -0.353, 0.353, 0.353, 0.353 }, -- Box
+ { -0.495, -0.064, -0.064, 0.495, 0.064, 0.064 }, -- Circle +-x
+ { -0.483, -0.128, -0.128, 0.483, 0.128, 0.128 },
+ { -0.462, -0.191, -0.191, 0.462, 0.191, 0.191 },
+ { -0.433, -0.249, -0.249, 0.433, 0.249, 0.249 },
+ { -0.397, -0.303, -0.303, 0.397, 0.303, 0.303 },
+ { -0.305, -0.396, -0.305, 0.305, 0.396, 0.305 }, -- Circle +-y
+ { -0.250, -0.432, -0.250, 0.250, 0.432, 0.250 },
+ { -0.191, -0.461, -0.191, 0.191, 0.461, 0.191 },
+ { -0.130, -0.482, -0.130, 0.130, 0.482, 0.130 },
+ { -0.066, -0.495, -0.066, 0.066, 0.495, 0.066 },
+ { -0.064, -0.064, -0.495, 0.064, 0.064, 0.495 }, -- Circle +-z
+ { -0.128, -0.128, -0.483, 0.128, 0.128, 0.483 },
+ { -0.191, -0.191, -0.462, 0.191, 0.191, 0.462 },
+ { -0.249, -0.249, -0.433, 0.249, 0.249, 0.433 },
+ { -0.303, -0.303, -0.397, 0.303, 0.303, 0.397 },
+}
+
+local reactor_siren = {}
+local function siren_set_state(pos, newstate)
+ local hpos = minetest.hash_node_position(pos)
+ local siren = reactor_siren[hpos]
+ if not siren then
+ if newstate == "off" then return end
+ siren = {state="off"}
+ reactor_siren[hpos] = siren
+ end
+ if newstate == "danger" and siren.state ~= "danger" then
+ if siren.handle then minetest.sound_stop(siren.handle) end
+ siren.handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_danger_loop", {pos=pos, gain=1.5, loop=true, max_hear_distance=48})
+ siren.state = "danger"
+ elseif newstate == "clear" then
+ if siren.handle then minetest.sound_stop(siren.handle) end
+ local clear_handle = minetest.sound_play("technic_hv_nuclear_reactor_siren_clear", {pos=pos, gain=1.5, loop=false, max_hear_distance=48})
+ siren.handle = clear_handle
+ siren.state = "clear"
+ minetest.after(10, function ()
+ if siren.handle == clear_handle then
+ minetest.sound_stop(clear_handle)
+ if reactor_siren[hpos] == siren then
+ reactor_siren[hpos] = nil
+ end
+ end
+ end)
+ elseif newstate == "off" and siren.state ~= "off" then
+ if siren.handle then minetest.sound_stop(siren.handle) end
+ siren.handle = nil
+ reactor_siren[hpos] = nil
+ end
+end
+local function siren_danger(pos, meta)
+ meta:set_int("siren", 1)
+ siren_set_state(pos, "danger")
+end
+local function siren_clear(pos, meta)
+ if meta:get_int("siren") ~= 0 then
+ siren_set_state(pos, "clear")
+ meta:set_int("siren", 0)
+ end
+end
+
+-- The standard reactor structure consists of a 9x9x9 cube. A cross
+-- section through the middle:
+--
+-- CCCC CCCC
+-- CBBB BBBC
+-- CBSS SSBC
+-- CBSWWWSBC
+-- CBSW#WSBC
+-- CBSW|WSBC
+-- CBSS|SSBC
+-- CBBB|BBBC
+-- CCCC|CCCC
+-- C = Concrete, B = Blast-resistant concrete, S = Stainless Steel,
+-- W = water node, # = reactor core, | = HV cable
+--
+-- The man-hole and the HV cable are only in the middle, and the man-hole
+-- is optional.
+--
+-- For the reactor to operate and not melt down, it insists on the inner
+-- 7x7x7 portion (from the core out to the blast-resistant concrete)
+-- being intact. Intactness only depends on the number of nodes of the
+-- right type in each layer. The water layer must have water in all but
+-- at most one node; the steel and blast-resistant concrete layers must
+-- have the right material in all but at most two nodes. The permitted
+-- gaps are meant for the cable and man-hole, but can actually be anywhere
+-- and contain anything. For the reactor to be useful, a cable must
+-- connect to the core, but it can go in any direction.
+--
+-- The outer concrete layer of the standard structure is not required
+-- for the reactor to operate. It is noted here because it used to
+-- be mandatory, and for historical reasons (that it predates the
+-- implementation of radiation) it needs to continue being adequate
+-- shielding of legacy reactors. If it ever ceases to be adequate
+-- shielding for new reactors, legacy ones should be grandfathered.
+local reactor_structure_badness = function(pos)
+ local vm = VoxelManip()
+ local pos1 = vector.subtract(pos, 3)
+ local pos2 = vector.add(pos, 3)
+ local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2)
+ local data = vm:get_data()
+ local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge})
+
+ local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete")
+ local c_stainless_steel = minetest.get_content_id("technic:stainless_steel_block")
+ local c_water_source = minetest.get_content_id("default:water_source")
+ local c_water_flowing = minetest.get_content_id("default:water_flowing")
+
+ local blastlayer, steellayer, waterlayer = 0, 0, 0
+
+ for z = pos1.z, pos2.z do
+ for y = pos1.y, pos2.y do
+ for x = pos1.x, pos2.x do
+ local cid = data[area:index(x, y, z)]
+ if x == pos1.x or x == pos2.x or
+ y == pos1.y or y == pos2.y or
+ z == pos1.z or z == pos2.z then
+ if cid == c_blast_concrete then
+ blastlayer = blastlayer + 1
+ end
+ elseif x == pos1.x+1 or x == pos2.x-1 or
+ y == pos1.y+1 or y == pos2.y-1 or
+ z == pos1.z+1 or z == pos2.z-1 then
+ if cid == c_stainless_steel then
+ steellayer = steellayer + 1
+ end
+ elseif x == pos1.x+2 or x == pos2.x-2 or
+ y == pos1.y+2 or y == pos2.y-2 or
+ z == pos1.z+2 or z == pos2.z-2 then
+ if cid == c_water_source or cid == c_water_flowing then
+ waterlayer = waterlayer + 1
+ end
+ end
+ end
+ end
+ end
+ if waterlayer > 25 then waterlayer = 25 end
+ if steellayer > 96 then steellayer = 96 end
+ if blastlayer > 216 then blastlayer = 216 end
+ return (25 - waterlayer) + (96 - steellayer) + (216 - blastlayer)
+end
+
+local function meltdown_reactor(pos)
+ print("A reactor melted down at "..minetest.pos_to_string(pos))
+ minetest.set_node(pos, {name="technic:corium_source"})
+end
+
+minetest.register_abm({
+ nodenames = {"technic:hv_nuclear_reactor_core_active"},
+ interval = 1,
+ chance = 1,
+ action = function (pos, node)
+ local meta = minetest.get_meta(pos)
+ local badness = reactor_structure_badness(pos)
+ local accum_badness = meta:get_int("structure_accumulated_badness")
+ if badness == 0 then
+ if accum_badness ~= 0 then
+ meta:set_int("structure_accumulated_badness", accum_badness - 1)
+ siren_clear(pos, meta)
+ end
+ else
+ siren_danger(pos, meta)
+ accum_badness = accum_badness + badness
+ if accum_badness >= 100 then
+ meltdown_reactor(pos)
+ else
+ meta:set_int("structure_accumulated_badness", accum_badness)
+ end
+ end
+ end,
+})
+
+local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local machine_name = S("Nuclear %s Generator Core"):format("HV")
+ local burn_time = meta:get_int("burn_time") or 0
+
+ if burn_time >= burn_ticks or burn_time == 0 then
+ local inv = meta:get_inventory()
+ if not inv:is_empty("src") then
+ local srclist = inv:get_list("src")
+ local correct_fuel_count = 0
+ for _, srcstack in pairs(srclist) do
+ if srcstack then
+ if srcstack:get_name() == fuel_type then
+ correct_fuel_count = correct_fuel_count + 1
+ end
+ end
+ end
+ -- Check that the reactor is complete as well
+ -- as the correct number of correct fuel
+ if correct_fuel_count == 6 and
+ reactor_structure_badness(pos) == 0 then
+ meta:set_int("burn_time", 1)
+ technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active")
+ meta:set_int("HV_EU_supply", power_supply)
+ for idx, srcstack in pairs(srclist) do
+ srcstack:take_item()
+ inv:set_stack("src", idx, srcstack)
+ end
+ return
+ end
+ end
+ meta:set_int("HV_EU_supply", 0)
+ meta:set_int("burn_time", 0)
+ meta:set_string("infotext", S("%s Idle"):format(machine_name))
+ technic.swap_node(pos, "technic:hv_nuclear_reactor_core")
+ meta:set_int("structure_accumulated_badness", 0)
+ siren_clear(pos, meta)
+ elseif burn_time > 0 then
+ burn_time = burn_time + 1
+ meta:set_int("burn_time", burn_time)
+ local percent = math.floor(burn_time / burn_ticks * 100)
+ meta:set_string("infotext", machine_name.." ("..percent.."%)")
+ meta:set_int("HV_EU_supply", power_supply)
+ end
+end
+
+minetest.register_node("technic:hv_nuclear_reactor_core", {
+ description = S("Nuclear %s Generator Core"):format("HV"),
+ tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
+ "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
+ "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
+ groups = {cracky=1, technic_machine=1},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ drawtype="nodebox",
+ paramtype = "light",
+ stack_max = 1,
+ node_box = {
+ type = "fixed",
+ fixed = nodebox
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("Nuclear %s Generator Core"):format("HV"))
+ meta:set_int("HV_EU_supply", 0)
+ -- Signal to the switching station that this device burns some
+ -- sort of fuel and needs special handling
+ meta:set_int("HV_EU_from_fuel", 1)
+ meta:set_int("burn_time", 0)
+ meta:set_string("formspec", generator_formspec)
+ local inv = meta:get_inventory()
+ inv:set_size("src", 6)
+ end,
+ can_dig = technic.machine_can_dig,
+ on_destruct = function(pos) siren_set_state(pos, "off") end,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ technic_run = run,
+})
+
+minetest.register_node("technic:hv_nuclear_reactor_core_active", {
+ tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
+ "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
+ "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
+ groups = {cracky=1, technic_machine=1, radioactive=11000, not_in_creative_inventory=1},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ drop="technic:hv_nuclear_reactor_core",
+ drawtype="nodebox",
+ light_source = 15,
+ paramtype = "light",
+ node_box = {
+ type = "fixed",
+ fixed = nodebox
+ },
+ can_dig = technic.machine_can_dig,
+ after_dig_node = meltdown_reactor,
+ on_destruct = function(pos) siren_set_state(pos, "off") end,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ technic_run = run,
+ technic_on_disable = function(pos, node)
+ local timer = minetest.get_node_timer(pos)
+ timer:start(1)
+ end,
+ on_timer = function(pos, node)
+ local meta = minetest.get_meta(pos)
+
+ -- Connected back?
+ if meta:get_int("HV_EU_timeout") > 0 then return false end
+
+ local burn_time = meta:get_int("burn_time") or 0
+
+ if burn_time >= burn_ticks or burn_time == 0 then
+ meta:set_int("HV_EU_supply", 0)
+ meta:set_int("burn_time", 0)
+ technic.swap_node(pos, "technic:hv_nuclear_reactor_core")
+ meta:set_int("structure_accumulated_badness", 0)
+ siren_clear(pos, meta)
+ return false
+ end
+
+ meta:set_int("burn_time", burn_time + 1)
+ return true
+ end,
+})
+
+technic.register_machine("HV", "technic:hv_nuclear_reactor_core", technic.producer)
+technic.register_machine("HV", "technic:hv_nuclear_reactor_core_active", technic.producer)
+
+-- radioactivity
+
+-- Radiation resistance represents the extent to which a material
+-- attenuates radiation passing through it; i.e., how good a radiation
+-- shield it is. This is identified per node type. For materials that
+-- exist in real life, the radiation resistance value that this system
+-- uses for a node type consisting of a solid cube of that material is the
+-- (approximate) number of halvings of ionising radiation that is achieved
+-- by a metre of the material in real life. This is approximately
+-- proportional to density, which provides a good way to estimate it.
+-- Homogeneous mixtures of materials have radiation resistance computed
+-- by a simple weighted mean. Note that the amount of attenuation that
+-- a material achieves in-game is not required to be (and is not) the
+-- same as the attenuation achieved in real life.
+--
+-- Radiation resistance for a node type may be specified in the node
+-- definition, under the key "radiation_resistance". As an interim
+-- measure, until node definitions widely include this, this code
+-- knows a bunch of values for particular node types in several mods,
+-- and values for groups of node types. The node definition takes
+-- precedence if it specifies a value. Nodes for which no value at
+-- all is known are taken to provide no radiation resistance at all;
+-- this is appropriate for the majority of node types. Only node types
+-- consisting of a fairly homogeneous mass of material should report
+-- non-zero radiation resistance; anything with non-uniform geometry
+-- or complex internal structure should show no radiation resistance.
+-- Fractional resistance values are permitted; two significant figures
+-- is the recommended precision.
+local default_radiation_resistance_per_node = {
+ ["default:brick"] = 13,
+ ["default:bronzeblock"] = 45,
+ ["default:clay"] = 15,
+ ["default:coalblock"] = 9.6,
+ ["default:cobble"] = 15,
+ ["default:copperblock"] = 46,
+ ["default:desert_cobble"] = 15,
+ ["default:desert_sand"] = 10,
+ ["default:desert_stone"] = 17,
+ ["default:desert_stonebrick"] = 17,
+ ["default:diamondblock"] = 24,
+ ["default:dirt"] = 8.2,
+ ["default:dirt_with_grass"] = 8.2,
+ ["default:dirt_with_grass_footsteps"] = 8.2,
+ ["default:dirt_with_snow"] = 8.2,
+ ["default:glass"] = 17,
+ ["default:goldblock"] = 170,
+ ["default:gravel"] = 10,
+ ["default:ice"] = 5.6,
+ ["default:lava_flowing"] = 8.5,
+ ["default:lava_source"] = 17,
+ ["default:mese"] = 21,
+ ["default:mossycobble"] = 15,
+ ["default:nyancat"] = 1000,
+ ["default:nyancat_rainbow"] = 1000,
+ ["default:obsidian"] = 18,
+ ["default:obsidian_glass"] = 18,
+ ["default:sand"] = 10,
+ ["default:sandstone"] = 15,
+ ["default:sandstonebrick"] = 15,
+ ["default:snowblock"] = 1.7,
+ ["default:steelblock"] = 40,
+ ["default:stone"] = 17,
+ ["default:stone_with_coal"] = 16,
+ ["default:stone_with_copper"] = 20,
+ ["default:stone_with_diamond"] = 18,
+ ["default:stone_with_gold"] = 34,
+ ["default:stone_with_iron"] = 20,
+ ["default:stone_with_mese"] = 17,
+ ["default:stonebrick"] = 17,
+ ["default:water_flowing"] = 2.8,
+ ["default:water_source"] = 5.6,
+ ["farming:desert_sand_soil"] = 10,
+ ["farming:desert_sand_soil_wet"] = 10,
+ ["farming:soil"] = 8.2,
+ ["farming:soil_wet"] = 8.2,
+ ["glooptest:akalin_crystal_glass"] = 21,
+ ["glooptest:akalinblock"] = 40,
+ ["glooptest:alatro_crystal_glass"] = 21,
+ ["glooptest:alatroblock"] = 40,
+ ["glooptest:amethystblock"] = 18,
+ ["glooptest:arol_crystal_glass"] = 21,
+ ["glooptest:crystal_glass"] = 21,
+ ["glooptest:emeraldblock"] = 19,
+ ["glooptest:heavy_crystal_glass"] = 21,
+ ["glooptest:mineral_akalin"] = 20,
+ ["glooptest:mineral_alatro"] = 20,
+ ["glooptest:mineral_amethyst"] = 17,
+ ["glooptest:mineral_arol"] = 20,
+ ["glooptest:mineral_desert_coal"] = 16,
+ ["glooptest:mineral_desert_iron"] = 20,
+ ["glooptest:mineral_emerald"] = 17,
+ ["glooptest:mineral_kalite"] = 20,
+ ["glooptest:mineral_ruby"] = 18,
+ ["glooptest:mineral_sapphire"] = 18,
+ ["glooptest:mineral_talinite"] = 20,
+ ["glooptest:mineral_topaz"] = 18,
+ ["glooptest:reinforced_crystal_glass"] = 21,
+ ["glooptest:rubyblock"] = 27,
+ ["glooptest:sapphireblock"] = 27,
+ ["glooptest:talinite_crystal_glass"] = 21,
+ ["glooptest:taliniteblock"] = 40,
+ ["glooptest:topazblock"] = 24,
+ ["mesecons_extrawires:mese_powered"] = 21,
+ ["moreblocks:cactus_brick"] = 13,
+ ["moreblocks:cactus_checker"] = 8.5,
+ ["moreblocks:circle_stone_bricks"] = 17,
+ ["moreblocks:clean_glass"] = 17,
+ ["moreblocks:coal_checker"] = 9.0,
+ ["moreblocks:coal_glass"] = 17,
+ ["moreblocks:coal_stone"] = 17,
+ ["moreblocks:coal_stone_bricks"] = 17,
+ ["moreblocks:glow_glass"] = 17,
+ ["moreblocks:grey_bricks"] = 15,
+ ["moreblocks:iron_checker"] = 11,
+ ["moreblocks:iron_glass"] = 17,
+ ["moreblocks:iron_stone"] = 17,
+ ["moreblocks:iron_stone_bricks"] = 17,
+ ["moreblocks:plankstone"] = 9.3,
+ ["moreblocks:split_stone_tile"] = 15,
+ ["moreblocks:split_stone_tile_alt"] = 15,
+ ["moreblocks:stone_tile"] = 15,
+ ["moreblocks:super_glow_glass"] = 17,
+ ["moreblocks:tar"] = 7.0,
+ ["moreblocks:wood_tile"] = 1.7,
+ ["moreblocks:wood_tile_center"] = 1.7,
+ ["moreblocks:wood_tile_down"] = 1.7,
+ ["moreblocks:wood_tile_flipped"] = 1.7,
+ ["moreblocks:wood_tile_full"] = 1.7,
+ ["moreblocks:wood_tile_left"] = 1.7,
+ ["moreblocks:wood_tile_right"] = 1.7,
+ ["moreblocks:wood_tile_up"] = 1.7,
+ ["moreores:mineral_mithril"] = 18,
+ ["moreores:mineral_silver"] = 21,
+ ["moreores:mineral_tin"] = 19,
+ ["moreores:mithril_block"] = 26,
+ ["moreores:silver_block"] = 53,
+ ["moreores:tin_block"] = 37,
+ ["snow:snow_brick"] = 2.8,
+ ["technic:brass_block"] = 43,
+ ["technic:carbon_steel_block"] = 40,
+ ["technic:cast_iron_block"] = 40,
+ ["technic:chernobylite_block"] = 40,
+ ["technic:chromium_block"] = 37,
+ ["technic:corium_flowing"] = 40,
+ ["technic:corium_source"] = 80,
+ ["technic:granite"] = 18,
+ ["technic:lead_block"] = 80,
+ ["technic:marble"] = 18,
+ ["technic:marble_bricks"] = 18,
+ ["technic:mineral_chromium"] = 19,
+ ["technic:mineral_uranium"] = 71,
+ ["technic:mineral_zinc"] = 19,
+ ["technic:stainless_steel_block"] = 40,
+ ["technic:zinc_block"] = 36,
+ ["tnt:tnt"] = 11,
+ ["tnt:tnt_burning"] = 11,
+}
+local default_radiation_resistance_per_group = {
+ concrete = 16,
+ tree = 3.4,
+ uranium_block = 500,
+ wood = 1.7,
+}
+local cache_radiation_resistance = {}
+local function node_radiation_resistance(nodename)
+ local eff = cache_radiation_resistance[nodename]
+ if eff then return eff end
+ local def = minetest.registered_nodes[nodename] or {groups={}}
+ eff = def.radiation_resistance or default_radiation_resistance_per_node[nodename]
+ if not eff then
+ for g, v in pairs(def.groups) do
+ if v > 0 and default_radiation_resistance_per_group[g] then
+ eff = default_radiation_resistance_per_group[g]
+ break
+ end
+ end
+ end
+ if not eff then eff = 0 end
+ cache_radiation_resistance[nodename] = eff
+ return eff
+end
+
+-- Radioactive nodes cause damage to nearby players. The damage
+-- effect depends on the intrinsic strength of the radiation source,
+-- the distance between the source and the player, and the shielding
+-- effect of the intervening material. These determine a rate of damage;
+-- total damage caused is the integral of this over time.
+--
+-- In the absence of effective shielding, for a specific source the
+-- damage rate varies realistically in inverse proportion to the square
+-- of the distance. (Distance is measured to the player's abdomen,
+-- not to the nominal player position which corresponds to the foot.)
+-- However, if the player is inside a non-walkable (liquid or gaseous)
+-- radioactive node, the nominal distance could go to zero, yielding
+-- infinite damage. In that case, the player's body is displacing the
+-- radioactive material, so the effective distance should remain non-zero.
+-- We therefore apply a lower distance bound of sqrt(0.75) m, which is
+-- the maximum distance one can get from the node centre within the node.
+--
+-- A radioactive node is identified by being in the "radioactive" group,
+-- and the group value signifies the strength of the radiation source.
+-- The group value is the distance in millimetres from a node at which
+-- an unshielded player will be damaged by 0.25 HP/s. Or, equivalently,
+-- it is 2000 times the square root of the damage rate in HP/s that an
+-- unshielded player 1 m away will take.
+--
+-- Shielding is assessed by sampling every 0.25 m along the path
+-- from the source to the player, ignoring the source node itself.
+-- The summed shielding values from the sampled nodes yield a measure
+-- of the total amount of shielding on the path. As in reality,
+-- shielding causes exponential attenuation of radiation. However, the
+-- effect is scaled down relative to real life. A metre of a node with
+-- radiation resistance value R yields attenuation of sqrt(R)*0.1 nepers.
+-- (In real life it would be about R*0.69 nepers, by the definition
+-- of the radiation resistance values.) The sqrt part of this formula
+-- scales down the differences between shielding types, reflecting the
+-- game's simplification of making expensive materials such as gold
+-- readily available in cubic metres. The multiplicative factor in the
+-- formula scales down the difference between shielded and unshielded
+-- safe distances, avoiding the latter becoming impractically large.
+--
+-- Damage is processed at rates down to 0.25 HP/s, which in the absence of
+-- shielding is attained at the distance specified by the "radioactive"
+-- group value. Computed damage rates below 0.25 HP/s result in no
+-- damage at all to the player. This gives the player an opportunity
+-- to be safe, and limits the range at which source/player interactions
+-- need to be considered.
+local assumed_abdomen_offset = vector.new(0, 1, 0)
+local assumed_abdomen_offset_length = vector.length(assumed_abdomen_offset)
+local cache_scaled_shielding = {}
+
+local damage_enabled = minetest.setting_getbool("enable_damage")
+
+if damage_enabled then
+ minetest.register_abm({
+ nodenames = {"group:radioactive"},
+ interval = 1,
+ chance = 1,
+ action = function (pos, node)
+ local strength = minetest.registered_nodes[node.name].groups.radioactive
+ for _, o in ipairs(minetest.get_objects_inside_radius(pos, strength*0.001 + assumed_abdomen_offset_length)) do
+ if o:is_player() then
+ local rel = vector.subtract(vector.add(o:getpos(), assumed_abdomen_offset), pos)
+ local dist_sq = vector.length_square(rel)
+ local dist = math.sqrt(dist_sq)
+ local dirstep = dist == 0 and vector.new(0,0,0) or vector.divide(rel, dist*4)
+ local intpos = pos
+ local shielding = 0
+ for intdist = 0.25, dist, 0.25 do
+ intpos = vector.add(intpos, dirstep)
+ local intnodepos = vector.round(intpos)
+ if not vector.equals(intnodepos, pos) then
+ local sname = minetest.get_node(intnodepos).name
+ local sval = cache_scaled_shielding[sname]
+ if not sval then
+ sval = math.sqrt(node_radiation_resistance(sname)) * -0.025
+ cache_scaled_shielding[sname] = sval
+ end
+ shielding = shielding + sval
+ end
+ end
+ local dmg_rate = 0.25e-6 * strength*strength * math.exp(shielding) / math.max(0.75, dist_sq)
+ if dmg_rate >= 0.25 then
+ local dmg_int = math.floor(dmg_rate)
+ if math.random() < dmg_rate-dmg_int then
+ dmg_int = dmg_int + 1
+ end
+ if dmg_int > 0 then
+ o:set_hp(math.max(o:get_hp() - dmg_int, 0))
+ end
+ end
+ end
+ end
+ end,
+ })
+end
+
+-- radioactive materials that can result from destroying a reactor
+local corium_griefing = 1
+if (not technic.config:get_bool("enable_corium_griefing")) then
+ corium_griefing = 0
+end
+
+for _, state in ipairs({ "flowing", "source" }) do
+ minetest.register_node("technic:corium_"..state, {
+ description = S(state == "source" and "Corium Source" or "Flowing Corium"),
+ drawtype = (state == "source" and "liquid" or "flowingliquid"),
+ [state == "source" and "tiles" or "special_tiles"] = {{
+ name = "technic_corium_"..state.."_animated.png",
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 3.0,
+ },
+ }},
+ paramtype = "light",
+ paramtype2 = (state == "flowing" and "flowingliquid" or nil),
+ light_source = (state == "source" and 8 or 5),
+ walkable = false,
+ pointable = false,
+ diggable = false,
+ buildable_to = true,
+ drop = "",
+ drowning = 1,
+ liquidtype = state,
+ liquid_alternative_flowing = "technic:corium_flowing",
+ liquid_alternative_source = "technic:corium_source",
+ liquid_viscosity = LAVA_VISC,
+ liquid_renewable = false,
+ damage_per_second = 6,
+ post_effect_color = { a=192, r=80, g=160, b=80 },
+ groups = {
+ liquid = 2,
+ hot = 3,
+ igniter = corium_griefing,
+ radioactive = (state == "source" and 32000 or 16000),
+ not_in_creative_inventory = (state == "flowing" and 1 or nil),
+ },
+ })
+end
+
+if bucket and bucket.register_liquid then
+ bucket.register_liquid(
+ "technic:corium_source",
+ "technic:corium_flowing",
+ "technic:bucket_corium",
+ "technic_bucket_corium.png",
+ "Corium Bucket"
+ )
+end
+
+minetest.register_node("technic:chernobylite_block", {
+ description = S("Chernobylite Block"),
+ tiles = { "technic_chernobylite_block.png" },
+ is_ground_content = true,
+ groups = { cracky=1, radioactive=5000, level=2 },
+ sounds = default.node_sound_stone_defaults(),
+ light_source = 2,
+
+})
+
+minetest.register_abm({
+ nodenames = {"group:water"},
+ neighbors = {"technic:corium_source"},
+ interval = 1,
+ chance = 1,
+ action = function (pos, node)
+ minetest.remove_node(pos)
+ end,
+})
+
+if (corium_griefing == 1) then
+ minetest.register_abm({
+ nodenames = {"technic:corium_flowing"},
+ interval = 5,
+ chance = 10,
+ action = function (pos, node)
+ minetest.set_node(pos, {name="technic:chernobylite_block"})
+ end,
+ })
+ minetest.register_abm({
+ nodenames = { "technic:corium_source", "technic:corium_flowing" },
+ interval = 4,
+ chance = 4,
+ action = function (pos, node)
+ for _, offset in ipairs({
+ vector.new(1,0,0),
+ vector.new(-1,0,0),
+ vector.new(0,0,1),
+ vector.new(0,0,-1),
+ vector.new(0,-1,0),
+ }) do
+ if math.random(8) == 1 then
+ minetest.dig_node(vector.add(pos, offset))
+ end
+ end
+ end,
+ })
+end
diff --git a/technic/technic/machines/HV/quarry.lua b/technic/technic/machines/HV/quarry.lua
new file mode 100644
index 0000000..60805cc
--- /dev/null
+++ b/technic/technic/machines/HV/quarry.lua
@@ -0,0 +1,251 @@
+
+local S = technic.getter
+
+minetest.register_craft({
+ recipe = {
+ {"technic:carbon_plate", "pipeworks:filter", "technic:composite_plate"},
+ {"technic:motor", "technic:machine_casing", "technic:diamond_drill_head"},
+ {"technic:carbon_steel_block", "technic:hv_cable0", "technic:carbon_steel_block"}},
+ output = "technic:quarry",
+})
+
+local quarry_dig_above_nodes = 3 -- How far above the quarry we will dig nodes
+local quarry_max_depth = 100
+local quarry_demand = 10000
+
+local function set_quarry_formspec(meta)
+ local radius = meta:get_int("size")
+ local formspec = "size[6,4.3]"..
+ "list[context;cache;0,1;4,3;]"..
+ "item_image[4.8,0;1,1;technic:quarry]"..
+ "label[0,0.2;"..S("%s Quarry"):format("HV").."]"..
+ "field[4.3,3.5;2,1;size;"..S("Radius:")..";"..radius.."]"
+ if meta:get_int("enabled") == 0 then
+ formspec = formspec.."button[4,1;2,1;enable;"..S("Disabled").."]"
+ else
+ formspec = formspec.."button[4,1;2,1;disable;"..S("Enabled").."]"
+ end
+ local diameter = radius*2 + 1
+ local nd = meta:get_int("dug")
+ local rel_y = quarry_dig_above_nodes - math.floor(nd / (diameter*diameter))
+ formspec = formspec.."label[0,4;"..minetest.formspec_escape(
+ nd == 0 and S("Digging not started") or
+ (rel_y < -quarry_max_depth and S("Digging finished") or
+ (meta:get_int("purge_on") == 1 and S("Purging cache") or
+ S("Digging %d m "..(rel_y > 0 and "above" or "below").." machine")
+ :format(math.abs(rel_y))))
+ ).."]"
+ formspec = formspec.."button[4,2;2,1;restart;"..S("Restart").."]"
+ meta:set_string("formspec", formspec)
+end
+
+local function set_quarry_demand(meta)
+ local radius = meta:get_int("size")
+ local diameter = radius*2 + 1
+ local machine_name = S("%s Quarry"):format("HV")
+ if meta:get_int("enabled") == 0 or meta:get_int("purge_on") == 1 then
+ meta:set_string("infotext", S(meta:get_int("purge_on") == 1 and "%s purging cache" or "%s Disabled"):format(machine_name))
+ meta:set_int("HV_EU_demand", 0)
+ elseif meta:get_int("dug") == diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) then
+ meta:set_string("infotext", S("%s Finished"):format(machine_name))
+ meta:set_int("HV_EU_demand", 0)
+ else
+ meta:set_string("infotext", S(meta:get_int("HV_EU_input") >= quarry_demand and "%s Active" or "%s Unpowered"):format(machine_name))
+ meta:set_int("HV_EU_demand", quarry_demand)
+ end
+end
+
+local function quarry_receive_fields(pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ if fields.size and string.find(fields.size, "^[0-9]+$") then
+ local size = tonumber(fields.size)
+ if size >= 2 and size <= 8 and size ~= meta:get_int("size") then
+ meta:set_int("size", size)
+ meta:set_int("dug", 0)
+ end
+ end
+ if fields.enable then meta:set_int("enabled", 1) end
+ if fields.disable then meta:set_int("enabled", 0) end
+ if fields.restart then
+ meta:set_int("dug", 0)
+ meta:set_int("purge_on", 1)
+ end
+ set_quarry_formspec(meta)
+ set_quarry_demand(meta)
+end
+
+local function quarry_handle_purge(pos)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local i = 0
+ for _,stack in ipairs(inv:get_list("cache")) do
+ i = i + 1
+ if stack then
+ local item = stack:to_table()
+ if item then
+ technic.tube_inject_item(pos, pos, vector.new(0, 1, 0), item)
+ stack:clear()
+ inv:set_stack("cache", i, stack)
+ break
+ end
+ end
+ end
+ if inv:is_empty("cache") then
+ meta:set_int("purge_on", 0)
+ end
+end
+
+local function quarry_run(pos, node)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ -- initialize cache for the case we load an older world
+ inv:set_size("cache", 12)
+ -- toss a coin whether we do an automatic purge. Chance 1:200
+ local purge_rand = math.random()
+ if purge_rand <= 0.005 then
+ meta:set_int("purge_on", 1)
+ end
+
+ if meta:get_int("enabled") and meta:get_int("HV_EU_input") >= quarry_demand and meta:get_int("purge_on") == 0 then
+ local pdir = minetest.facedir_to_dir(node.param2)
+ local qdir = pdir.x == 1 and vector.new(0,0,-1) or
+ (pdir.z == -1 and vector.new(-1,0,0) or
+ (pdir.x == -1 and vector.new(0,0,1) or
+ vector.new(1,0,0)))
+ local radius = meta:get_int("size")
+ local diameter = radius*2 + 1
+ local startpos = vector.add(vector.add(vector.add(pos,
+ vector.new(0, quarry_dig_above_nodes, 0)),
+ pdir),
+ vector.multiply(qdir, -radius))
+ local endpos = vector.add(vector.add(vector.add(startpos,
+ vector.new(0, -quarry_dig_above_nodes-quarry_max_depth, 0)),
+ vector.multiply(pdir, diameter-1)),
+ vector.multiply(qdir, diameter-1))
+ local vm = VoxelManip()
+ local minpos, maxpos = vm:read_from_map(startpos, endpos)
+ local area = VoxelArea:new({MinEdge=minpos, MaxEdge=maxpos})
+ local data = vm:get_data()
+ local c_air = minetest.get_content_id("air")
+ local owner = meta:get_string("owner")
+ local nd = meta:get_int("dug")
+ while nd ~= diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) do
+ local ry = math.floor(nd / (diameter*diameter))
+ local ndl = nd % (diameter*diameter)
+ if ry % 2 == 1 then
+ ndl = diameter*diameter - 1 - ndl
+ end
+ local rq = math.floor(ndl / diameter)
+ local rp = ndl % diameter
+ if rq % 2 == 1 then rp = diameter - 1 - rp end
+ local digpos = vector.add(vector.add(vector.add(startpos,
+ vector.new(0, -ry, 0)),
+ vector.multiply(pdir, rp)),
+ vector.multiply(qdir, rq))
+ local can_dig = true
+ if can_dig and minetest.is_protected and minetest.is_protected(digpos, owner) then
+ can_dig = false
+ end
+ local dignode
+ if can_dig then
+ dignode = technic.get_or_load_node(digpos) or minetest.get_node(digpos)
+ local dignodedef = minetest.registered_nodes[dignode.name] or {diggable=false}
+ if not dignodedef.diggable or (dignodedef.can_dig and not dignodedef.can_dig(digpos, nil)) then
+ can_dig = false
+ end
+ end
+
+ if can_dig then
+ for ay = startpos.y, digpos.y+1, -1 do
+ local checkpos = {x=digpos.x, y=ay, z=digpos.z}
+ local checknode = technic.get_or_load_node(checkpos) or minetest.get_node(checkpos)
+ if checknode.name ~= "air" then
+ can_dig = false
+ break
+ end
+ end
+ end
+ nd = nd + 1
+ if can_dig then
+ minetest.remove_node(digpos)
+ local drops = minetest.get_node_drops(dignode.name, "")
+ for _, dropped_item in ipairs(drops) do
+ local left = inv:add_item("cache", dropped_item)
+ while not left:is_empty() do
+ meta:set_int("purge_on", 1)
+ quarry_handle_purge(pos)
+ left = inv:add_item("cache", left)
+ end
+ end
+ break
+ end
+ end
+ if nd == diameter*diameter * (quarry_dig_above_nodes+1+quarry_max_depth) then
+ -- if a quarry is finished, we enable purge mode
+ meta:set_int("purge_on", 1)
+ end
+ meta:set_int("dug", nd)
+ else
+ -- if a quarry is disabled or has no power, we enable purge mode
+ meta:set_int("purge_on", 1)
+ end
+ -- if something triggered a purge, we handle it
+ if meta:get_int("purge_on") == 1 then
+ quarry_handle_purge(pos)
+ end
+ set_quarry_formspec(meta)
+ set_quarry_demand(meta)
+end
+
+local function send_move_error(player)
+ minetest.chat_send_player(player:get_player_name(),
+ S("Manually taking/removing from cache by hand is not possible. "..
+ "If you can't wait, restart or disable the quarry to start automatic purge."))
+ return 0
+end
+
+minetest.register_node("technic:quarry", {
+ description = S("%s Quarry"):format("HV"),
+ tiles = {"technic_carbon_steel_block.png", "technic_carbon_steel_block.png",
+ "technic_carbon_steel_block.png", "technic_carbon_steel_block.png",
+ "technic_carbon_steel_block.png^default_tool_mesepick.png", "technic_carbon_steel_block.png"},
+ inventory_image = minetest.inventorycube("technic_carbon_steel_block.png",
+ "technic_carbon_steel_block.png^default_tool_mesepick.png",
+ "technic_carbon_steel_block.png"),
+ paramtype2 = "facedir",
+ groups = {cracky=2, tubedevice=1, technic_machine = 1},
+ tube = {
+ connect_sides = {top = 1},
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("%s Quarry"):format("HV"))
+ meta:set_int("size", 4)
+ set_quarry_formspec(meta)
+ set_quarry_demand(meta)
+ end,
+ after_place_node = function(pos, placer, itemstack)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("owner", placer:get_player_name())
+ pipeworks.scan_for_tube_objects(pos)
+ end,
+ can_dig = function(pos,player)
+ local meta = minetest.get_meta(pos);
+ local inv = meta:get_inventory()
+ return inv:is_empty("cache")
+ end,
+ after_dig_node = pipeworks.scan_for_tube_objects,
+ on_receive_fields = quarry_receive_fields,
+ technic_run = quarry_run,
+ allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
+ return send_move_error(player)
+ end,
+ allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+ return send_move_error(player)
+ end,
+ allow_metadata_inventory_take = function(pos, listname, index, stack, player)
+ return send_move_error(player)
+ end
+})
+
+technic.register_machine("HV", "technic:quarry", technic.receiver)
diff --git a/technic/technic/machines/HV/solar_array.lua b/technic/technic/machines/HV/solar_array.lua
new file mode 100644
index 0000000..414291a
--- /dev/null
+++ b/technic/technic/machines/HV/solar_array.lua
@@ -0,0 +1,14 @@
+-- The high voltage solar array is an assembly of medium voltage arrays.
+-- Solar arrays are not able to store large amounts of energy.
+
+minetest.register_craft({
+ output = 'technic:solar_array_hv 1',
+ recipe = {
+ {'technic:solar_array_mv', 'technic:solar_array_mv', 'technic:solar_array_mv'},
+ {'technic:carbon_plate', 'technic:hv_transformer', 'technic:composite_plate'},
+ {'', 'technic:hv_cable0', ''},
+ }
+})
+
+technic.register_solar_array({tier="HV", power=100})
+
diff --git a/technic/technic/machines/LV/alloy_furnace.lua b/technic/technic/machines/LV/alloy_furnace.lua
new file mode 100644
index 0000000..bdf2f31
--- /dev/null
+++ b/technic/technic/machines/LV/alloy_furnace.lua
@@ -0,0 +1,14 @@
+-- LV Alloy furnace
+
+-- FIXME: kpoppel: I'd like to introduce an induction heating element here...
+minetest.register_craft({
+ output = 'technic:lv_alloy_furnace',
+ recipe = {
+ {'default:brick', 'default:brick', 'default:brick'},
+ {'default:brick', 'technic:machine_casing', 'default:brick'},
+ {'default:brick', 'technic:lv_cable0', 'default:brick'},
+ }
+})
+
+technic.register_alloy_furnace({tier = "LV", speed = 1, demand = {300}})
+
diff --git a/technic/technic/machines/LV/battery_box.lua b/technic/technic/machines/LV/battery_box.lua
new file mode 100644
index 0000000..429bcd6
--- /dev/null
+++ b/technic/technic/machines/LV/battery_box.lua
@@ -0,0 +1,19 @@
+
+minetest.register_craft({
+ output = 'technic:lv_battery_box0',
+ recipe = {
+ {'group:wood', 'group:wood', 'group:wood'},
+ {'technic:battery', 'technic:machine_casing', 'technic:battery'},
+ {'technic:battery', 'technic:lv_cable0', 'technic:battery'},
+ }
+})
+
+technic.register_battery_box({
+ tier = "LV",
+ max_charge = 40000,
+ charge_rate = 1000,
+ discharge_rate = 4000,
+ charge_step = 500,
+ discharge_step = 800,
+})
+
diff --git a/technic/technic/machines/LV/cables.lua b/technic/technic/machines/LV/cables.lua
new file mode 100644
index 0000000..e18eae1
--- /dev/null
+++ b/technic/technic/machines/LV/cables.lua
@@ -0,0 +1,14 @@
+
+minetest.register_alias("lv_cable", "technic:lv_cable0")
+
+minetest.register_craft({
+ output = 'technic:lv_cable0 6',
+ recipe = {
+ {'default:paper', 'default:paper', 'default:paper'},
+ {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'},
+ {'default:paper', 'default:paper', 'default:paper'},
+ }
+})
+
+technic.register_cable("LV", 2/16)
+
diff --git a/technic/technic/machines/LV/cnc.lua b/technic/technic/machines/LV/cnc.lua
new file mode 100644
index 0000000..dd67e9b
--- /dev/null
+++ b/technic/technic/machines/LV/cnc.lua
@@ -0,0 +1,237 @@
+-- Technic CNC v1.0 by kpoppel
+-- Based on the NonCubic Blocks MOD v1.4 by yves_de_beck
+
+-- Idea:
+-- Somehow have a tabbed/paged panel if the number of shapes should expand
+-- beyond what is available in the panel today.
+-- I could imagine some form of API allowing modders to come with their own node
+-- box definitions and easily stuff it in the this machine for production.
+
+local S = technic.getter
+
+local shape = {}
+local onesize_products = {
+ slope = 2,
+ slope_edge = 1,
+ slope_inner_edge = 1,
+ pyramid = 2,
+ spike = 1,
+ cylinder = 2,
+ oblate_spheroid = 1,
+ sphere = 1,
+ stick = 8,
+ slope_upsdown = 2,
+ slope_edge_upsdown = 1,
+ slope_inner_edge_upsdown = 1,
+ cylinder_horizontal = 2,
+ slope_lying = 2,
+ onecurvededge = 1,
+ twocurvededge = 1,
+}
+local twosize_products = {
+ element_straight = 4,
+ element_end = 2,
+ element_cross = 1,
+ element_t = 1,
+ element_edge = 2,
+}
+
+local cnc_formspec =
+ "invsize[9,11;]"..
+ "label[1,0;"..S("Choose Milling Program:").."]"..
+ "image_button[1,0.5;1,1;technic_cnc_slope.png;slope; ]"..
+ "image_button[2,0.5;1,1;technic_cnc_slope_edge.png;slope_edge; ]"..
+ "image_button[3,0.5;1,1;technic_cnc_slope_inner_edge.png;slope_inner_edge; ]"..
+ "image_button[4,0.5;1,1;technic_cnc_pyramid.png;pyramid; ]"..
+ "image_button[5,0.5;1,1;technic_cnc_spike.png;spike; ]"..
+ "image_button[6,0.5;1,1;technic_cnc_cylinder.png;cylinder; ]"..
+ "image_button[7,0.5;1,1;technic_cnc_oblate_spheroid.png;oblate_spheroid; ]"..
+ "image_button[8,0.5;1,1;technic_cnc_stick.png;stick; ]"..
+
+ "image_button[1,1.5;1,1;technic_cnc_slope_upsdwn.png;slope_upsdown; ]"..
+ "image_button[2,1.5;1,1;technic_cnc_slope_edge_upsdwn.png;slope_edge_upsdown; ]"..
+ "image_button[3,1.5;1,1;technic_cnc_slope_inner_edge_upsdwn.png;slope_inner_edge_upsdown; ]"..
+ "image_button[4,1.5;1,1;technic_cnc_cylinder_horizontal.png;cylinder_horizontal; ]"..
+ "image_button[5,1.5;1,1;technic_cnc_sphere.png;sphere; ]"..
+
+ "image_button[1,2.5;1,1;technic_cnc_slope_lying.png;slope_lying; ]"..
+ "image_button[2,2.5;1,1;technic_cnc_onecurvededge.png;onecurvededge; ]"..
+ "image_button[3,2.5;1,1;technic_cnc_twocurvededge.png;twocurvededge; ]"..
+
+ "label[1,3.5;"..S("Slim Elements half / normal height:").."]"..
+
+ "image_button[1,4;1,0.5;technic_cnc_full.png;full; ]"..
+ "image_button[1,4.5;1,0.5;technic_cnc_half.png;half; ]"..
+ "image_button[2,4;1,1;technic_cnc_element_straight.png;element_straight; ]"..
+ "image_button[3,4;1,1;technic_cnc_element_end.png;element_end; ]"..
+ "image_button[4,4;1,1;technic_cnc_element_cross.png;element_cross; ]"..
+ "image_button[5,4;1,1;technic_cnc_element_t.png;element_t; ]"..
+ "image_button[6,4;1,1;technic_cnc_element_edge.png;element_edge; ]"..
+
+ "label[0, 5.5;"..S("In:").."]"..
+ "list[current_name;src;0.5,5.5;1,1;]"..
+ "label[4, 5.5;"..S("Out:").."]"..
+ "list[current_name;dst;5,5.5;4,1;]"..
+
+ "list[current_player;main;0,7;8,4;]"..
+ "listring[current_name;dst]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]"
+
+local size = 1;
+
+-- The form handler is declared here because we need it in both the inactive and active modes
+-- in order to be able to change programs wile it is running.
+local function form_handler(pos, formname, fields, sender)
+ -- REGISTER MILLING PROGRAMS AND OUTPUTS:
+ ------------------------------------------
+ -- Program for half/full size
+ if fields["full"] then
+ size = 1
+ return
+ end
+
+ if fields["half"] then
+ size = 2
+ return
+ end
+
+ -- Resolve the node name and the number of items to make
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local inputstack = inv:get_stack("src", 1)
+ local inputname = inputstack:get_name()
+ local multiplier = 0
+ for k, _ in pairs(fields) do
+ -- Set a multipier for the half/full size capable blocks
+ if twosize_products[k] ~= nil then
+ multiplier = size * twosize_products[k]
+ else
+ multiplier = onesize_products[k]
+ end
+
+ if onesize_products[k] ~= nil or twosize_products[k] ~= nil then
+ meta:set_float( "cnc_multiplier", multiplier)
+ meta:set_string("cnc_user", sender:get_player_name())
+ end
+
+ if onesize_products[k] ~= nil or (twosize_products[k] ~= nil and size==2) then
+ meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k)
+ --print(inputname .. "_technic_cnc_" .. k)
+ break
+ end
+
+ if twosize_products[k] ~= nil and size==1 then
+ meta:set_string("cnc_product", inputname .. "_technic_cnc_" .. k .. "_double")
+ --print(inputname .. "_technic_cnc_" .. k .. "_double")
+ break
+ end
+ end
+ return
+end
+
+-- Action code performing the transformation
+local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local eu_input = meta:get_int("LV_EU_input")
+ local machine_name = S("%s CNC Machine"):format("LV")
+ local machine_node = "technic:cnc"
+ local demand = 450
+
+ local result = meta:get_string("cnc_product")
+ if inv:is_empty("src") or
+ (not minetest.registered_nodes[result]) or
+ (not inv:room_for_item("dst", result)) then
+ technic.swap_node(pos, machine_node)
+ meta:set_string("infotext", S("%s Idle"):format(machine_name))
+ meta:set_string("cnc_product", "")
+ meta:set_int("LV_EU_demand", 0)
+ return
+ end
+
+ if eu_input < demand then
+ technic.swap_node(pos, machine_node)
+ meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
+ elseif eu_input >= demand then
+ technic.swap_node(pos, machine_node.."_active")
+ meta:set_string("infotext", S("%s Active"):format(machine_name))
+ meta:set_int("src_time", meta:get_int("src_time") + 1)
+ if meta:get_int("src_time") >= 3 then -- 3 ticks per output
+ meta:set_int("src_time", 0)
+ srcstack = inv:get_stack("src", 1)
+ srcstack:take_item()
+ inv:set_stack("src", 1, srcstack)
+ inv:add_item("dst", result.." "..meta:get_int("cnc_multiplier"))
+ end
+ end
+ meta:set_int("LV_EU_demand", demand)
+end
+
+-- The actual block inactive state
+minetest.register_node("technic:cnc", {
+ description = S("%s CNC Machine"):format("LV"),
+ tiles = {"technic_cnc_top.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
+ "technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front.png"},
+ drawtype = "nodebox",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+ },
+ },
+ groups = {cracky=2, technic_machine=1},
+ legacy_facedir_simple = true,
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("%s CNC Machine"):format("LV"))
+ meta:set_float("technic_power_machine", 1)
+ meta:set_string("formspec", cnc_formspec)
+ local inv = meta:get_inventory()
+ inv:set_size("src", 1)
+ inv:set_size("dst", 4)
+ end,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ on_receive_fields = form_handler,
+ technic_run = run,
+})
+
+-- Active state block
+minetest.register_node("technic:cnc_active", {
+ description = S("%s CNC Machine"):format("LV"),
+ tiles = {"technic_cnc_top_active.png", "technic_cnc_bottom.png", "technic_cnc_side.png",
+ "technic_cnc_side.png", "technic_cnc_side.png", "technic_cnc_front_active.png"},
+ paramtype2 = "facedir",
+ drop = "technic:cnc",
+ groups = {cracky=2, technic_machine=1, not_in_creative_inventory=1},
+ legacy_facedir_simple = true,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ on_receive_fields = form_handler,
+ technic_run = run,
+ technic_disabled_machine_name = "technic:cnc",
+})
+
+technic.register_machine("LV", "technic:cnc", technic.receiver)
+technic.register_machine("LV", "technic:cnc_active", technic.receiver)
+
+-------------------------
+-- CNC Machine Recipe
+-------------------------
+minetest.register_craft({
+ output = 'technic:cnc',
+ recipe = {
+ {'default:glass', 'technic:diamond_drill_head', 'default:glass'},
+ {'technic:control_logic_unit', 'technic:machine_casing', 'technic:motor'},
+ {'technic:carbon_steel_ingot', 'technic:lv_cable0', 'technic:carbon_steel_ingot'},
+ },
+})
+
diff --git a/technic/technic/machines/LV/cnc_api.lua b/technic/technic/machines/LV/cnc_api.lua
new file mode 100644
index 0000000..f5aae5c
--- /dev/null
+++ b/technic/technic/machines/LV/cnc_api.lua
@@ -0,0 +1,369 @@
+-- API for the technic CNC machine
+-- Again code is adapted from the NonCubic Blocks MOD v1.4 by yves_de_beck
+
+local S = technic.getter
+
+technic.cnc = {}
+
+-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES:
+------------------------------------------------------
+
+-- Define slope boxes for the various nodes
+-------------------------------------------
+technic.cnc.programs = {
+ { suffix = "technic_cnc_stick",
+ model = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
+ desc = S("Stick")
+ },
+
+ { suffix = "technic_cnc_element_end_double",
+ model = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
+ desc = S("Element End Double")
+ },
+
+ { suffix = "technic_cnc_element_cross_double",
+ model = {
+ {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
+ {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
+ {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
+ desc = S("Element Cross Double")
+ },
+
+ { suffix = "technic_cnc_element_t_double",
+ model = {
+ {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
+ {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
+ {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}},
+ desc = S("Element T Double")
+ },
+
+ { suffix = "technic_cnc_element_edge_double",
+ model = {
+ {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
+ {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
+ desc = S("Element Edge Double")
+ },
+
+ { suffix = "technic_cnc_element_straight_double",
+ model = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
+ desc = S("Element Straight Double")
+ },
+
+ { suffix = "technic_cnc_element_end",
+ model = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
+ desc = S("Element End")
+ },
+
+ { suffix = "technic_cnc_element_cross",
+ model = {
+ {0.3, -0.5, -0.3, 0.5, 0, 0.3},
+ {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
+ {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
+ desc = S("Element Cross")
+ },
+
+ { suffix = "technic_cnc_element_t",
+ model = {
+ {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
+ {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
+ {0.3, -0.5, -0.3, 0.5, 0, 0.3}},
+ desc = S("Element T")
+ },
+
+ { suffix = "technic_cnc_element_edge",
+ model = {
+ {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
+ {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
+ desc = S("Element Edge")
+ },
+
+ { suffix = "technic_cnc_element_straight",
+ model = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
+ desc = S("Element Straight")
+ },
+
+ { suffix = "technic_cnc_oblate_spheroid",
+ model = "technic_oblate_spheroid.obj",
+ desc = S("Oblate spheroid"),
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { -6/16, 4/16, -6/16, 6/16, 8/16, 6/16 },
+ { -8/16, -4/16, -8/16, 8/16, 4/16, 8/16 },
+ { -6/16, -8/16, -6/16, 6/16, -4/16, 6/16 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_sphere",
+ model = "technic_sphere.obj",
+ desc = S("Sphere")
+ },
+
+ { suffix = "technic_cnc_cylinder_horizontal",
+ model = "technic_cylinder_horizontal.obj",
+ desc = S("Horizontal Cylinder")
+ },
+
+ { suffix = "technic_cnc_cylinder",
+ model = "technic_cylinder.obj",
+ desc = S("Cylinder")
+ },
+
+ { suffix = "technic_cnc_twocurvededge",
+ model = "technic_two_curved_edge.obj",
+ desc = S("Two Curved Edge/Corner Block")
+ },
+
+ { suffix = "technic_cnc_onecurvededge",
+ model = "technic_one_curved_edge.obj",
+ desc = S("One Curved Edge Block")
+ },
+
+ { suffix = "technic_cnc_spike",
+ model = "technic_pyramid_spike.obj",
+ desc = S("Spike"),
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { -2/16, 4/16, -2/16, 2/16, 8/16, 2/16 },
+ { -4/16, 0, -4/16, 4/16, 4/16, 4/16 },
+ { -6/16, -4/16, -6/16, 6/16, 0, 6/16 },
+ { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_pyramid",
+ model = "technic_pyramid.obj",
+ desc = S("Pyramid"),
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { -2/16, -2/16, -2/16, 2/16, 0, 2/16 },
+ { -4/16, -4/16, -4/16, 4/16, -2/16, 4/16 },
+ { -6/16, -6/16, -6/16, 6/16, -4/16, 6/16 },
+ { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_slope_inner_edge_upsdown",
+ model = "technic_innercorner_upsdown.obj",
+ desc = S("Slope Upside Down Inner Edge/Corner"),
+ sbox = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
+ },
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { 0.25, -0.25, -0.5, 0.5, -0.5, 0.5 },
+ { -0.5, -0.25, 0.25, 0.5, -0.5, 0.5 },
+ { 0, 0, -0.5, 0.5, -0.25, 0.5 },
+ { -0.5, 0, 0, 0.5, -0.25, 0.5 },
+ { -0.25, 0.25, -0.5, 0.5, 0, -0.25 },
+ { -0.5, 0.25, -0.25, 0.5, 0, 0.5 },
+ { -0.5, 0.5, -0.5, 0.5, 0.25, 0.5 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_slope_edge_upsdown",
+ model = "technic_outercorner_upsdown.obj",
+ desc = S("Slope Upside Down Outer Edge/Corner"),
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { -8/16, 8/16, -8/16, 8/16, 4/16, 8/16 },
+ { -4/16, 4/16, -4/16, 8/16, 0, 8/16 },
+ { 0, 0, 0, 8/16, -4/16, 8/16 },
+ { 4/16, -4/16, 4/16, 8/16, -8/16, 8/16 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_slope_inner_edge",
+ model = "technic_innercorner.obj",
+ desc = S("Slope Inner Edge/Corner"),
+ sbox = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
+ },
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 },
+ { -0.5, -0.25, -0.25, 0.5, 0, 0.5 },
+ { -0.25, -0.25, -0.5, 0.5, 0, -0.25 },
+ { -0.5, 0, 0, 0.5, 0.25, 0.5 },
+ { 0, 0, -0.5, 0.5, 0.25, 0.5 },
+ { -0.5, 0.25, 0.25, 0.5, 0.5, 0.5 },
+ { 0.25, 0.25, -0.5, 0.5, 0.5, 0.5 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_slope_edge",
+ model = "technic_outercorner.obj",
+ desc = S("Slope Outer Edge/Corner"),
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { 4/16, 4/16, 4/16, 8/16, 8/16, 8/16 },
+ { 0, 0, 0, 8/16, 4/16, 8/16 },
+ { -4/16, -4/16, -4/16, 8/16, 0, 8/16 },
+ { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_slope_upsdown",
+ model = "technic_slope_upsdown.obj",
+ desc = S("Slope Upside Down"),
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { -8/16, 8/16, -8/16, 8/16, 4/16, 8/16 },
+ { -8/16, 4/16, -4/16, 8/16, 0, 8/16 },
+ { -8/16, 0, 0, 8/16, -4/16, 8/16 },
+ { -8/16, -4/16, 4/16, 8/16, -8/16, 8/16 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_slope_lying",
+ model = "technic_slope_horizontal.obj",
+ desc = S("Slope Lying"),
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { 4/16, -8/16, 4/16, 8/16, 8/16, 8/16 },
+ { 0, -8/16, 0, 4/16, 8/16, 8/16 },
+ { -4/16, -8/16, -4/16, 0, 8/16, 8/16 },
+ { -8/16, -8/16, -8/16, -4/16, 8/16, 8/16 }
+ }
+ }
+ },
+
+ { suffix = "technic_cnc_slope",
+ model = "technic_slope.obj",
+ desc = S("Slope"),
+ cbox = {
+ type = "fixed",
+ fixed = {
+ { -8/16, 4/16, 4/16, 8/16, 8/16, 8/16 },
+ { -8/16, 0, 0, 8/16, 4/16, 8/16 },
+ { -8/16, -4/16, -4/16, 8/16, 0, 8/16 },
+ { -8/16, -8/16, -8/16, 8/16, -4/16, 8/16 }
+ }
+ }
+ },
+
+}
+
+-- Allow disabling certain programs for some node. Default is allowing all types for all nodes
+technic.cnc.programs_disable = {
+ -- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick
+ -- ...
+ ["default:dirt"] = {"technic_cnc_oblate_spheroid", "technic_cnc_slope_upsdown", "technic_cnc_edge",
+ "technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown",
+ "technic_cnc_slope_inner_edge_upsdown", "technic_cnc_stick",
+ "technic_cnc_cylinder_horizontal"}
+}
+
+-- Generic function for registering all the different node types
+function technic.cnc.register_program(recipeitem, suffix, model, groups, images, description, cbox, sbox)
+
+ local dtype
+ local nodeboxdef
+ local meshdef
+
+ if type(model) ~= "string" then -- assume a nodebox if it's a table or function call
+ dtype = "nodebox"
+ nodeboxdef = {
+ type = "fixed",
+ fixed = model
+ }
+ else
+ dtype = "mesh"
+ meshdef = model
+ end
+
+ if cbox and not sbox then sbox = cbox end
+
+ minetest.register_node(":"..recipeitem.."_"..suffix, {
+ description = description,
+ drawtype = dtype,
+ node_box = nodeboxdef,
+ mesh = meshdef,
+ tiles = images,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ groups = groups,
+ selection_box = sbox,
+ collision_box = cbox
+ })
+end
+
+-- function to iterate over all the programs the CNC machine knows
+function technic.cnc.register_all(recipeitem, groups, images, description)
+ for _, data in ipairs(technic.cnc.programs) do
+ -- Disable node creation for disabled node types for some material
+ local do_register = true
+ if technic.cnc.programs_disable[recipeitem] ~= nil then
+ for __, disable in ipairs(technic.cnc.programs_disable[recipeitem]) do
+ if disable == data.suffix then
+ do_register = false
+ end
+ end
+ end
+ -- Create the node if it passes the test
+ if do_register then
+ technic.cnc.register_program(recipeitem, data.suffix, data.model,
+ groups, images, description.." "..data.desc, data.cbox, data.sbox)
+ end
+ end
+end
+
+
+-- REGISTER NEW TECHNIC_CNC_API's PART 2: technic.cnc..register_element_end(subname, recipeitem, groups, images, desc_element_xyz)
+-----------------------------------------------------------------------------------------------------------------------
+function technic.cnc.register_slope_edge_etc(recipeitem, groups, images, desc_slope, desc_slope_lying, desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, desc_cylinder, desc_cylinder_horizontal, desc_spheroid, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end)
+
+ technic.cnc.register_slope(recipeitem, groups, images, desc_slope)
+ technic.cnc.register_slope_lying(recipeitem, groups, images, desc_slope_lying)
+ technic.cnc.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown)
+ technic.cnc.register_slope_edge(recipeitem, groups, images, desc_slope_edge)
+ technic.cnc.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge)
+ technic.cnc.register_slope_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_edge)
+ technic.cnc.register_slope_inner_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_inner_edge)
+ technic.cnc.register_pyramid(recipeitem, groups, images, desc_pyramid)
+ technic.cnc.register_spike(recipeitem, groups, images, desc_spike)
+ technic.cnc.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge)
+ technic.cnc.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge)
+ technic.cnc.register_cylinder(recipeitem, groups, images, desc_cylinder)
+ technic.cnc.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal)
+ technic.cnc.register_spheroid(recipeitem, groups, images, desc_spheroid)
+ technic.cnc.register_element_straight(recipeitem, groups, images, desc_element_straight)
+ technic.cnc.register_element_edge(recipeitem, groups, images, desc_element_edge)
+ technic.cnc.register_element_t(recipeitem, groups, images, desc_element_t)
+ technic.cnc.register_element_cross(recipeitem, groups, images, desc_element_cross)
+ technic.cnc.register_element_end(recipeitem, groups, images, desc_element_end)
+end
+
+-- REGISTER STICKS: noncubic.register_xyz(recipeitem, groups, images, desc_element_xyz)
+------------------------------------------------------------------------------------------------------------
+function technic.cnc.register_stick_etc(recipeitem, groups, images, desc_stick)
+ technic.cnc.register_stick(recipeitem, groups, images, desc_stick)
+end
+
+function technic.cnc.register_elements(recipeitem, groups, images, desc_element_straight_double, desc_element_edge_double, desc_element_t_double, desc_element_cross_double, desc_element_end_double)
+ technic.cnc.register_element_straight_double(recipeitem, groups, images, desc_element_straight_double)
+ technic.cnc.register_element_edge_double(recipeitem, groups, images, desc_element_edge_double)
+ technic.cnc.register_element_t_double(recipeitem, groups, images, desc_element_t_double)
+ technic.cnc.register_element_cross_double(recipeitem, groups, images, desc_element_cross_double)
+ technic.cnc.register_element_end_double(recipeitem, groups, images, desc_element_end_double)
+end
+
diff --git a/technic/technic/machines/LV/cnc_nodes.lua b/technic/technic/machines/LV/cnc_nodes.lua
new file mode 100644
index 0000000..05be9af
--- /dev/null
+++ b/technic/technic/machines/LV/cnc_nodes.lua
@@ -0,0 +1,91 @@
+-- REGISTER MATERIALS AND PROPERTIES FOR NONCUBIC ELEMENTS:
+-----------------------------------------------------------
+
+local S = technic.getter
+
+-- DIRT
+-------
+technic.cnc.register_all("default:dirt",
+ {snappy=2,choppy=2,oddly_breakable_by_hand=3,not_in_creative_inventory=1},
+ {"default_grass.png", "default_dirt.png", "default_grass.png"},
+ S("Dirt"))
+-- WOOD
+-------
+technic.cnc.register_all("default:wood",
+ {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
+ {"default_wood.png"},
+ S("Wooden"))
+-- STONE
+--------
+technic.cnc.register_all("default:stone",
+ {cracky=3, not_in_creative_inventory=1},
+ {"default_stone.png"},
+ S("Stone"))
+-- COBBLE
+---------
+technic.cnc.register_all("default:cobble",
+ {cracky=3, not_in_creative_inventory=1},
+ {"default_cobble.png"},
+ S("Cobble"))
+-- BRICK
+--------
+technic.cnc.register_all("default:brick",
+ {cracky=3, not_in_creative_inventory=1},
+ {"default_brick.png"},
+ S("Brick"))
+
+-- SANDSTONE
+------------
+technic.cnc.register_all("default:sandstone",
+ {crumbly=2, cracky=3, not_in_creative_inventory=1},
+ {"default_sandstone.png"},
+ S("Sandstone"))
+
+-- LEAVES
+---------
+technic.cnc.register_all("default:leaves",
+ {snappy=2, choppy=2, oddly_breakable_by_hand=3, not_in_creative_inventory=1},
+ {"default_leaves.png"},
+ S("Leaves"))
+-- TREE
+-------
+technic.cnc.register_all("default:tree",
+ {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, wood=1, not_in_creative_inventory=1},
+ {"default_tree.png"},
+ S("Tree"))
+
+-- WROUGHT IRON
+---------------
+technic.cnc.register_all("default:steelblock",
+ {cracky=1, level=2, not_in_creative_inventory=1},
+ {"technic_wrought_iron_block.png"},
+ S("Wrought Iron"))
+
+-- Bronze
+--------
+technic.cnc.register_all("default:bronzeblock",
+ {cracky=1, level=2, not_in_creative_inventory=1},
+ {"default_bronze_block.png"},
+ S("Bronze"))
+
+-- Stainless Steel
+--------
+technic.cnc.register_all("technic:stainless_steel_block",
+ {cracky=1, level=2, not_in_creative_inventory=1},
+ {"technic_stainless_steel_block.png"},
+ S("Stainless Steel"))
+
+-- Marble
+------------
+technic.cnc.register_all("technic:marble",
+ {cracky=3, not_in_creative_inventory=1},
+ {"technic_marble.png"},
+ S("Marble"))
+
+-- Granite
+------------
+technic.cnc.register_all("technic:granite",
+ {cracky=1, not_in_creative_inventory=1},
+ {"technic_granite.png"},
+ S("Granite"))
+
diff --git a/technic/technic/machines/LV/compressor.lua b/technic/technic/machines/LV/compressor.lua
new file mode 100644
index 0000000..e2bde40
--- /dev/null
+++ b/technic/technic/machines/LV/compressor.lua
@@ -0,0 +1,13 @@
+
+minetest.register_alias("compressor", "technic:lv_compressor")
+
+minetest.register_craft({
+ output = 'technic:lv_compressor',
+ recipe = {
+ {'default:stone', 'technic:motor', 'default:stone'},
+ {'mesecons:piston', 'technic:machine_casing', 'mesecons:piston'},
+ {'technic:fine_silver_wire', 'technic:lv_cable0', 'technic:fine_silver_wire'},
+ }
+})
+
+technic.register_compressor({tier = "LV", demand = {300}, speed = 1})
diff --git a/technic/technic/machines/LV/electric_furnace.lua b/technic/technic/machines/LV/electric_furnace.lua
new file mode 100644
index 0000000..cc4daff
--- /dev/null
+++ b/technic/technic/machines/LV/electric_furnace.lua
@@ -0,0 +1,16 @@
+-- LV Electric Furnace
+-- This is a faster version of the stone furnace which runs on EUs
+
+-- FIXME: kpoppel I'd like to introduce an induction heating element here also
+minetest.register_craft({
+ output = 'technic:electric_furnace',
+ recipe = {
+ {'default:cobble', 'default:cobble', 'default:cobble'},
+ {'default:cobble', 'technic:machine_casing', 'default:cobble'},
+ {'default:cobble', 'technic:lv_cable0', 'default:cobble'},
+ }
+})
+
+technic.register_electric_furnace({tier="LV", demand={300}, speed = 2})
+
+
diff --git a/technic/technic/machines/LV/extractor.lua b/technic/technic/machines/LV/extractor.lua
new file mode 100644
index 0000000..363d2e3
--- /dev/null
+++ b/technic/technic/machines/LV/extractor.lua
@@ -0,0 +1,13 @@
+
+minetest.register_alias("extractor", "technic:lv_extractor")
+
+minetest.register_craft({
+ output = 'technic:lv_extractor',
+ recipe = {
+ {'technic:treetap', 'technic:motor', 'technic:treetap'},
+ {'technic:treetap', 'technic:machine_casing', 'technic:treetap'},
+ {'', 'technic:lv_cable0', ''},
+ }
+})
+
+technic.register_extractor({tier = "LV", demand = {300}, speed = 1})
diff --git a/technic/technic/machines/LV/generator.lua b/technic/technic/machines/LV/generator.lua
new file mode 100644
index 0000000..999dbc5
--- /dev/null
+++ b/technic/technic/machines/LV/generator.lua
@@ -0,0 +1,18 @@
+-- The electric generator.
+-- A simple device to get started on the electric machines.
+-- Inefficient and expensive in fuel (200EU per tick)
+-- Also only allows for LV machinery to run.
+
+minetest.register_alias("lv_generator", "technic:lv_generator")
+
+minetest.register_craft({
+ output = 'technic:lv_generator',
+ recipe = {
+ {'default:stone', 'default:furnace', 'default:stone'},
+ {'default:stone', 'technic:machine_casing', 'default:stone'},
+ {'default:stone', 'technic:lv_cable0', 'default:stone'},
+ }
+})
+
+technic.register_generator({tier="LV", supply=200})
+
diff --git a/technic/technic/machines/LV/geothermal.lua b/technic/technic/machines/LV/geothermal.lua
new file mode 100644
index 0000000..e88d3c9
--- /dev/null
+++ b/technic/technic/machines/LV/geothermal.lua
@@ -0,0 +1,111 @@
+-- A geothermal EU generator
+-- Using hot lava and water this device can create energy from steam
+-- The machine is only producing LV EUs and can thus not drive more advanced equipment
+-- The output is a little more than the coal burning generator (max 300EUs)
+
+minetest.register_alias("geothermal", "technic:geothermal")
+
+local S = technic.getter
+
+minetest.register_craft({
+ output = 'technic:geothermal',
+ recipe = {
+ {'technic:granite', 'default:diamond', 'technic:granite'},
+ {'technic:fine_copper_wire', 'technic:machine_casing', 'technic:fine_copper_wire'},
+ {'technic:granite', 'technic:lv_cable0', 'technic:granite'},
+ }
+})
+
+minetest.register_craftitem("technic:geothermal", {
+ description = S("Geothermal %s Generator"):format("LV"),
+})
+
+local check_node_around = function(pos)
+ local node = minetest.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
+
+local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local water_nodes = 0
+ local lava_nodes = 0
+ local production_level = 0
+ local eu_supply = 0
+
+ -- Correct positioning is water on one side and lava on the other.
+ -- The two cannot be adjacent because the lava the turns into obsidian or rock.
+ -- To get to 100% production stack the water and lava one extra block down as well:
+ -- WGL (W=Water, L=Lava, G=the generator, |=an LV cable)
+ -- W|L
+
+ local positions = {
+ {x=pos.x+1, y=pos.y, z=pos.z},
+ {x=pos.x+1, y=pos.y-1, z=pos.z},
+ {x=pos.x-1, y=pos.y, z=pos.z},
+ {x=pos.x-1, y=pos.y-1, z=pos.z},
+ {x=pos.x, y=pos.y, z=pos.z+1},
+ {x=pos.x, y=pos.y-1, z=pos.z+1},
+ {x=pos.x, y=pos.y, z=pos.z-1},
+ {x=pos.x, y=pos.y-1, z=pos.z-1},
+ }
+ for _, p in pairs(positions) do
+ local check = check_node_around(p)
+ if check == 1 then water_nodes = water_nodes + 1 end
+ if check == 2 then lava_nodes = lava_nodes + 1 end
+ end
+
+ if water_nodes == 1 and lava_nodes == 1 then production_level = 25; eu_supply = 50 end
+ if water_nodes == 2 and lava_nodes == 1 then production_level = 50; eu_supply = 100 end
+ if water_nodes == 1 and lava_nodes == 2 then production_level = 75; eu_supply = 200 end
+ if water_nodes == 2 and lava_nodes == 2 then production_level = 100; eu_supply = 300 end
+
+ if production_level > 0 then
+ meta:set_int("LV_EU_supply", eu_supply)
+ end
+
+ meta:set_string("infotext",
+ S("Geothermal %s Generator"):format("LV").." ("..production_level.."%)")
+
+ if production_level > 0 and minetest.get_node(pos).name == "technic:geothermal" then
+ technic.swap_node (pos, "technic:geothermal_active")
+ return
+ end
+ if production_level == 0 then
+ technic.swap_node(pos, "technic:geothermal")
+ meta:set_int("LV_EU_supply", 0)
+ end
+end
+
+minetest.register_node("technic:geothermal", {
+ description = S("Geothermal %s Generator"):format("LV"),
+ 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, technic_machine=1},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("Geothermal %s Generator"):format("LV"))
+ meta:set_int("LV_EU_supply", 0)
+ end,
+ technic_run = run,
+})
+
+minetest.register_node("technic:geothermal_active", {
+ description = S("Geothermal %s Generator"):format("LV"),
+ 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_run = run,
+})
+
+technic.register_machine("LV", "technic:geothermal", technic.producer)
+technic.register_machine("LV", "technic:geothermal_active", technic.producer)
+
diff --git a/technic/technic/machines/LV/grinder.lua b/technic/technic/machines/LV/grinder.lua
new file mode 100644
index 0000000..da9ea29
--- /dev/null
+++ b/technic/technic/machines/LV/grinder.lua
@@ -0,0 +1,13 @@
+
+minetest.register_alias("grinder", "technic:lv_grinder")
+minetest.register_craft({
+ output = 'technic:lv_grinder',
+ recipe = {
+ {'default:desert_stone', 'default:diamond', 'default:desert_stone'},
+ {'default:desert_stone', 'technic:machine_casing', 'default:desert_stone'},
+ {'technic:granite', 'technic:lv_cable0', 'technic:granite'},
+ }
+})
+
+technic.register_grinder({tier="LV", demand={200}, speed=1})
+
diff --git a/technic/technic/machines/LV/init.lua b/technic/technic/machines/LV/init.lua
new file mode 100644
index 0000000..30523c9
--- /dev/null
+++ b/technic/technic/machines/LV/init.lua
@@ -0,0 +1,29 @@
+
+technic.register_tier("LV", "Low Voltage")
+
+local path = technic.modpath.."/machines/LV"
+
+-- Wiring stuff
+dofile(path.."/cables.lua")
+dofile(path.."/battery_box.lua")
+
+-- Generators
+dofile(path.."/solar_panel.lua")
+dofile(path.."/solar_array.lua")
+dofile(path.."/geothermal.lua")
+dofile(path.."/water_mill.lua")
+dofile(path.."/generator.lua")
+
+-- Machines
+dofile(path.."/alloy_furnace.lua")
+dofile(path.."/electric_furnace.lua")
+dofile(path.."/grinder.lua")
+dofile(path.."/extractor.lua")
+dofile(path.."/compressor.lua")
+
+dofile(path.."/music_player.lua")
+
+dofile(path.."/cnc.lua")
+dofile(path.."/cnc_api.lua")
+dofile(path.."/cnc_nodes.lua")
+
diff --git a/technic/technic/machines/LV/music_player.lua b/technic/technic/machines/LV/music_player.lua
new file mode 100644
index 0000000..dc7e2d0
--- /dev/null
+++ b/technic/technic/machines/LV/music_player.lua
@@ -0,0 +1,130 @@
+-- LV Music player.
+-- The player can play music. But it is high ampage!
+
+local S = technic.getter
+
+minetest.register_alias("music_player", "technic:music_player")
+minetest.register_craft({
+ output = 'technic:music_player',
+ recipe = {
+ {'technic:chromium_ingot', 'default:diamond', 'technic:chromium_ingot'},
+ {'default:diamond', 'technic:machine_casing', 'default:diamond'},
+ {'default:mossycobble', 'technic:lv_cable0', 'default:mossycobble'},
+ }
+})
+
+local music_handles = {}
+
+local function play_track(pos, track)
+ return minetest.sound_play("technic_track"..tostring(track),
+ {pos = pos, gain = 1.0, loop = true, max_hear_distance = 72,})
+end
+
+local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local eu_input = meta:get_int("LV_EU_input")
+ local machine_name = S("%s Music Player"):format("LV")
+ local machine_node = "technic:music_player"
+ local demand = 150
+
+ local current_track = meta:get_int("current_track")
+ local pos_hash = minetest.hash_node_position(pos)
+ local music_handle = music_handles[pos_hash]
+
+ -- Setup meta data if it does not exist.
+ if not eu_input then
+ meta:set_int("LV_EU_demand", demand)
+ meta:set_int("LV_EU_input", 0)
+ return
+ end
+
+ if meta:get_int("active") == 0 then
+ meta:set_string("infotext", S("%s Idle"):format(machine_name))
+ meta:set_int("LV_EU_demand", 0)
+ return
+ end
+
+ if eu_input < demand then
+ meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
+ if music_handle then
+ minetest.sound_stop(music_handle)
+ music_handle = nil
+ end
+ elseif eu_input >= demand then
+ meta:set_string("infotext", S("%s Active"):format(machine_name))
+ if not music_handle then
+ music_handle = play_track(pos, current_track)
+ end
+ end
+ music_handles[pos_hash] = music_handle
+ meta:set_int("LV_EU_demand", demand)
+end
+
+local function stop_player(pos, node)
+ local pos_hash = minetest.hash_node_position(pos)
+ local music_handle = music_handles[pos_hash]
+ if music_handle then
+ minetest.sound_stop(music_handle)
+ music_handles[pos_hash] = nil
+ end
+end
+
+local function set_display(meta)
+ meta:set_string("formspec",
+ "size[4,4.5]"..
+ "item_image[0,0;1,1;technic:music_player]"..
+ "label[1,0;"..S("%s Music Player"):format("LV").."]"..
+ "button[0,1;1,1;track1;1]"..
+ "button[1,1;1,1;track2;2]"..
+ "button[2,1;1,1;track3;3]"..
+ "button[0,2;1,1;track4;4]"..
+ "button[1,2;1,1;track5;5]"..
+ "button[2,2;1,1;track6;6]"..
+ "button[0,3;1,1;track7;7]"..
+ "button[1,3;1,1;track8;8]"..
+ "button[2,3;1,1;track9;9]"..
+ "button[3,1;1,1;stop;Stop]"..
+ "label[0,4;"..minetest.formspec_escape(
+ meta:get_int("active") == 0 and
+ S("Stopped") or
+ S("Current track %s"):format(meta:get_int("current_track"))).."]")
+end
+
+minetest.register_node("technic:music_player", {
+ description = S("%s Music Player"):format("LV"),
+ 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, technic_machine=1},
+ sounds = default.node_sound_wood_defaults(),
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("%s Music Player"):format("LV"))
+ set_display(meta)
+ end,
+ on_receive_fields = function(pos, formanme, fields, sender)
+ local new_track = nil
+ if fields.stop then new_track = 0 end
+ if fields.track1 then new_track = 1 end
+ if fields.track2 then new_track = 2 end
+ if fields.track3 then new_track = 3 end
+ if fields.track4 then new_track = 4 end
+ if fields.track5 then new_track = 5 end
+ if fields.track6 then new_track = 6 end
+ if fields.track7 then new_track = 7 end
+ if fields.track8 then new_track = 8 end
+ if fields.track9 then new_track = 9 end
+ if new_track then
+ stop_player(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_int("active", new_track == 0 and 0 or 1)
+ meta:set_int("current_track", new_track)
+ set_display(meta)
+ end
+ end,
+ on_destruct = stop_player,
+ technic_run = run,
+ technic_on_disable = stop_player,
+})
+
+technic.register_machine("LV", "technic:music_player", technic.receiver)
+
diff --git a/technic/technic/machines/LV/solar_array.lua b/technic/technic/machines/LV/solar_array.lua
new file mode 100644
index 0000000..4d2c3b3
--- /dev/null
+++ b/technic/technic/machines/LV/solar_array.lua
@@ -0,0 +1,18 @@
+-- The solar array is an assembly of panels into a powerful array
+-- The assembly can deliver more energy than the individual panel because
+-- of the transformer unit which converts the panel output variations into
+-- a stable supply.
+-- Solar arrays are not able to store large amounts of energy.
+-- The LV arrays are used to make medium voltage arrays.
+
+minetest.register_craft({
+ output = 'technic:solar_array_lv 1',
+ recipe = {
+ {'technic:solar_panel', 'technic:solar_panel', 'technic:solar_panel'},
+ {'technic:carbon_steel_ingot', 'technic:lv_transformer', 'technic:carbon_steel_ingot'},
+ {'', 'technic:lv_cable0', ''},
+ }
+})
+
+technic.register_solar_array({tier="LV", power=10})
+
diff --git a/technic/technic/machines/LV/solar_panel.lua b/technic/technic/machines/LV/solar_panel.lua
new file mode 100644
index 0000000..41dff95
--- /dev/null
+++ b/technic/technic/machines/LV/solar_panel.lua
@@ -0,0 +1,67 @@
+-- Solar panels are the building blocks of LV solar arrays
+-- They can however also be used separately but with reduced efficiency due to the missing transformer.
+-- Individual panels are less efficient than when the panels are combined into full arrays.
+
+local S = technic.getter
+
+local run = function(pos, node)
+ -- The action here is to make the solar panel prodice power
+ -- Power is dependent on the light level and the height above ground
+ -- There are many ways to cheat by using other light sources like lamps.
+ -- As there is no way to determine if light is sunlight that is just a shame.
+ -- To take care of some of it solar panels do not work outside daylight hours or if
+ -- built below 0m
+ local pos1 = {x=pos.x, y=pos.y+1, z=pos.z}
+ local machine_name = S("Small Solar %s Generator"):format("LV")
+
+ local light = minetest.get_node_light(pos1, nil)
+ local time_of_day = minetest.get_timeofday()
+ local meta = minetest.get_meta(pos)
+ if light == nil then light = 0 end
+ -- turn on panel only during day time and if sufficient light
+ -- I know this is counter intuitive when cheating by using other light sources underground.
+ if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > -10 then
+ local charge_to_give = math.floor((light + pos1.y) * 3)
+ charge_to_give = math.max(charge_to_give, 0)
+ charge_to_give = math.min(charge_to_give, 200)
+ meta:set_string("infotext", S("@1 Active (@2 EU)", machine_name, technic.prettynum(charge_to_give)))
+ meta:set_int("LV_EU_supply", charge_to_give)
+ else
+ meta:set_string("infotext", S("%s Idle"):format(machine_name))
+ meta:set_int("LV_EU_supply", 0)
+ end
+end
+
+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, technic_machine=1},
+ sounds = default.node_sound_wood_defaults(),
+ description = S("Small Solar %s Generator"):format("LV"),
+ active = false,
+ drawtype = "nodebox",
+ paramtype = "light",
+ is_ground_content = true,
+ node_box = {
+ type = "fixed",
+ fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_int("LV_EU_supply", 0)
+ meta:set_string("infotext", S("Small Solar %s Generator"):format("LV"))
+ end,
+ technic_run = run,
+})
+
+minetest.register_craft({
+ output = 'technic:solar_panel',
+ recipe = {
+ {'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer', 'technic:doped_silicon_wafer'},
+ {'technic:fine_silver_wire', 'technic:lv_cable0', 'mesecons_materials:glue'},
+
+ }
+})
+
+technic.register_machine("LV", "technic:solar_panel", technic.producer)
+
diff --git a/technic/technic/machines/LV/water_mill.lua b/technic/technic/machines/LV/water_mill.lua
new file mode 100644
index 0000000..9088d1d
--- /dev/null
+++ b/technic/technic/machines/LV/water_mill.lua
@@ -0,0 +1,102 @@
+-- A water mill produces LV EUs by exploiting flowing water across it
+-- It is a LV EU supplyer and fairly low yield (max 120EUs)
+-- It is a little under half as good as the thermal generator.
+
+local S = technic.getter
+
+minetest.register_alias("water_mill", "technic:water_mill")
+
+minetest.register_craft({
+ output = 'technic:water_mill',
+ recipe = {
+ {'technic:marble', 'default:diamond', 'technic:marble'},
+ {'group:wood', 'technic:machine_casing', 'group:wood'},
+ {'technic:marble', 'technic:lv_cable0', 'technic:marble'},
+ }
+})
+
+local function check_node_around_mill(pos)
+ local node = minetest.get_node(pos)
+ if node.name == "default:water_flowing" or
+ node.name == "default:water_source" then
+ return true
+ end
+ return false
+end
+
+local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local water_nodes = 0
+ local lava_nodes = 0
+ local production_level = 0
+ local eu_supply = 0
+
+ local positions = {
+ {x=pos.x+1, y=pos.y, z=pos.z},
+ {x=pos.x-1, y=pos.y, z=pos.z},
+ {x=pos.x, y=pos.y, z=pos.z+1},
+ {x=pos.x, y=pos.y, z=pos.z-1},
+ }
+
+ for _, p in pairs(positions) do
+ local check = check_node_around_mill(p)
+ if check then
+ water_nodes = water_nodes + 1
+ end
+ end
+
+ production_level = 25 * water_nodes
+ eu_supply = 30 * water_nodes
+
+ if production_level > 0 then
+ meta:set_int("LV_EU_supply", eu_supply)
+ end
+
+ meta:set_string("infotext",
+ S("Hydro %s Generator"):format("LV").." ("..production_level.."%)")
+
+ if production_level > 0 and
+ minetest.get_node(pos).name == "technic:water_mill" then
+ technic.swap_node (pos, "technic:water_mill_active")
+ meta:set_int("LV_EU_supply", 0)
+ return
+ end
+ if production_level == 0 then
+ technic.swap_node(pos, "technic:water_mill")
+ end
+end
+
+minetest.register_node("technic:water_mill", {
+ description = S("Hydro %s Generator"):format("LV"),
+ 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, technic_machine=1},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("Hydro %s Generator"):format("LV"))
+ meta:set_int("LV_EU_supply", 0)
+ end,
+ technic_run = run,
+})
+
+minetest.register_node("technic:water_mill_active", {
+ description = S("Hydro %s Generator"):format("LV"),
+ 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, technic_machine=1, not_in_creative_inventory=1},
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ drop = "technic:water_mill",
+ technic_run = run,
+ technic_disabled_machine_name = "technic:water_mill",
+})
+
+technic.register_machine("LV", "technic:water_mill", technic.producer)
+technic.register_machine("LV", "technic:water_mill_active", technic.producer)
+
diff --git a/technic/technic/machines/MV/alloy_furnace.lua b/technic/technic/machines/MV/alloy_furnace.lua
new file mode 100644
index 0000000..a1918fd
--- /dev/null
+++ b/technic/technic/machines/MV/alloy_furnace.lua
@@ -0,0 +1,14 @@
+-- MV alloy furnace
+
+minetest.register_craft({
+ output = 'technic:mv_alloy_furnace',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:lv_alloy_furnace', 'technic:stainless_steel_ingot'},
+ {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
+ {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
+ }
+})
+
+
+technic.register_alloy_furnace({tier = "MV", speed = 1.5, upgrade = 1, tube = 1, demand = {3000, 2000, 1000}})
+
diff --git a/technic/technic/machines/MV/battery_box.lua b/technic/technic/machines/MV/battery_box.lua
new file mode 100644
index 0000000..45437c1
--- /dev/null
+++ b/technic/technic/machines/MV/battery_box.lua
@@ -0,0 +1,22 @@
+-- MV Battery box
+
+minetest.register_craft({
+ output = 'technic:mv_battery_box0',
+ recipe = {
+ {'technic:lv_battery_box0', 'technic:lv_battery_box0', 'technic:lv_battery_box0'},
+ {'technic:lv_battery_box0', 'technic:mv_transformer', 'technic:lv_battery_box0'},
+ {'', 'technic:mv_cable0', ''},
+ }
+})
+
+technic.register_battery_box({
+ tier = "MV",
+ max_charge = 200000,
+ charge_rate = 20000,
+ discharge_rate = 80000,
+ charge_step = 2000,
+ discharge_step = 8000,
+ upgrade = 1,
+ tube = 1,
+})
+
diff --git a/technic/technic/machines/MV/cables.lua b/technic/technic/machines/MV/cables.lua
new file mode 100644
index 0000000..b1a34c8
--- /dev/null
+++ b/technic/technic/machines/MV/cables.lua
@@ -0,0 +1,14 @@
+
+minetest.register_alias("mv_cable", "technic:mv_cable0")
+
+minetest.register_craft({
+ output = 'technic:mv_cable0 3',
+ recipe ={
+ {'technic:rubber', 'technic:rubber', 'technic:rubber'},
+ {'technic:lv_cable0', 'technic:lv_cable0', 'technic:lv_cable0'},
+ {'technic:rubber', 'technic:rubber', 'technic:rubber'},
+ }
+})
+
+technic.register_cable("MV", 2.5/16)
+
diff --git a/technic/technic/machines/MV/centrifuge.lua b/technic/technic/machines/MV/centrifuge.lua
new file mode 100644
index 0000000..5bf24bf
--- /dev/null
+++ b/technic/technic/machines/MV/centrifuge.lua
@@ -0,0 +1,16 @@
+minetest.register_craft({
+ output = "technic:mv_centrifuge",
+ recipe = {
+ { "technic:motor", "technic:copper_plate", "technic:diamond_drill_head" },
+ { "technic:copper_plate", "technic:machine_casing", "technic:copper_plate" },
+ { "pipeworks:one_way_tube", "technic:mv_cable0", "pipeworks:mese_filter" },
+ }
+})
+
+technic.register_centrifuge({
+ tier = "MV",
+ demand = { 8000, 7000, 6000 },
+ speed = 2,
+ upgrade = 1,
+ tube = 1,
+})
diff --git a/technic/technic/machines/MV/compressor.lua b/technic/technic/machines/MV/compressor.lua
new file mode 100644
index 0000000..5b36cc5
--- /dev/null
+++ b/technic/technic/machines/MV/compressor.lua
@@ -0,0 +1,12 @@
+-- MV compressor
+
+minetest.register_craft({
+ output = 'technic:mv_compressor',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:lv_compressor', 'technic:stainless_steel_ingot'},
+ {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
+ {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
+ }
+})
+
+technic.register_compressor({tier = "MV", demand = {800, 600, 400}, speed = 2, upgrade = 1, tube = 1})
diff --git a/technic/technic/machines/MV/electric_furnace.lua b/technic/technic/machines/MV/electric_furnace.lua
new file mode 100644
index 0000000..1f6b1c2
--- /dev/null
+++ b/technic/technic/machines/MV/electric_furnace.lua
@@ -0,0 +1,18 @@
+-- MV Electric Furnace
+-- This is a faster version of the stone furnace which runs on EUs
+-- In addition to this it can be upgraded with microcontrollers and batteries
+-- This new version uses the batteries to lower the power consumption of the machine
+-- Also in addition this furnace can be attached to the pipe system from the pipeworks mod.
+
+-- FIXME: kpoppel I'd like to introduce an induction heating element here also
+minetest.register_craft({
+ output = 'technic:mv_electric_furnace',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:lv_electric_furnace', 'technic:stainless_steel_ingot'},
+ {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
+ {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
+ }
+})
+
+technic.register_electric_furnace({tier="MV", upgrade=1, tube=1, demand={2000, 1000, 500}, speed=4})
+
diff --git a/technic/technic/machines/MV/extractor.lua b/technic/technic/machines/MV/extractor.lua
new file mode 100644
index 0000000..fdef5b2
--- /dev/null
+++ b/technic/technic/machines/MV/extractor.lua
@@ -0,0 +1,12 @@
+-- MV extractor
+
+minetest.register_craft({
+ output = 'technic:mv_extractor',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:lv_extractor', 'technic:stainless_steel_ingot'},
+ {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
+ {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
+ }
+})
+
+technic.register_extractor({tier = "MV", demand = {800, 600, 400}, speed = 2, upgrade = 1, tube = 1})
diff --git a/technic/technic/machines/MV/generator.lua b/technic/technic/machines/MV/generator.lua
new file mode 100644
index 0000000..4ae24b8
--- /dev/null
+++ b/technic/technic/machines/MV/generator.lua
@@ -0,0 +1,13 @@
+minetest.register_alias("generator_mv", "technic:generator_mv")
+
+minetest.register_craft({
+ output = 'technic:mv_generator',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:lv_generator', 'technic:stainless_steel_ingot'},
+ {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
+ {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
+ }
+})
+
+technic.register_generator({tier="MV", tube=1, supply=600})
+
diff --git a/technic/technic/machines/MV/grinder.lua b/technic/technic/machines/MV/grinder.lua
new file mode 100644
index 0000000..dac536c
--- /dev/null
+++ b/technic/technic/machines/MV/grinder.lua
@@ -0,0 +1,13 @@
+-- MV grinder
+
+minetest.register_craft({
+ output = 'technic:mv_grinder',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:lv_grinder', 'technic:stainless_steel_ingot'},
+ {'pipeworks:tube_1', 'technic:mv_transformer', 'pipeworks:tube_1'},
+ {'technic:stainless_steel_ingot', 'technic:mv_cable0', 'technic:stainless_steel_ingot'},
+ }
+})
+
+technic.register_grinder({tier="MV", demand={600, 450, 300}, speed=2, upgrade=1, tube=1})
+
diff --git a/technic/technic/machines/MV/init.lua b/technic/technic/machines/MV/init.lua
new file mode 100644
index 0000000..72a98b6
--- /dev/null
+++ b/technic/technic/machines/MV/init.lua
@@ -0,0 +1,32 @@
+
+technic.register_tier("MV", "Medium Voltage")
+
+local path = technic.modpath.."/machines/MV"
+
+-- Wiring stuff
+dofile(path.."/cables.lua")
+dofile(path.."/battery_box.lua")
+
+-- Generators
+if technic.config:get_bool("enable_wind_mill") then
+ dofile(path.."/wind_mill.lua")
+end
+dofile(path.."/generator.lua")
+dofile(path.."/solar_array.lua")
+
+-- Machines
+dofile(path.."/alloy_furnace.lua")
+dofile(path.."/electric_furnace.lua")
+dofile(path.."/grinder.lua")
+dofile(path.."/extractor.lua")
+dofile(path.."/compressor.lua")
+dofile(path.."/centrifuge.lua")
+
+dofile(path.."/tool_workshop.lua")
+
+-- The power radiator supplies appliances with inductive coupled power:
+-- Lighting and associated textures is taken directly from VanessaE's homedecor and made electric.
+-- This is currently useless, slow, and mostly copied
+--dofile(path.."/power_radiator.lua")
+--dofile(path.."/lighting.lua")
+
diff --git a/technic/technic/machines/MV/lighting.lua b/technic/technic/machines/MV/lighting.lua
new file mode 100644
index 0000000..76fcb20
--- /dev/null
+++ b/technic/technic/machines/MV/lighting.lua
@@ -0,0 +1,590 @@
+-- NOTE: The code is takes directly from VanessaE's homedecor mod.
+-- I just made it the lights into indictive appliances for this mod.
+
+-- This file supplies electric powered glowlights
+
+-- Boilerplate to support localized strings if intllib mod is installed.
+local S
+if (minetest.get_modpath("intllib")) then
+ dofile(minetest.get_modpath("intllib").."/intllib.lua")
+ S = intllib.Getter(minetest.get_current_modname())
+else
+ S = function (s) return s end
+end
+
+function technic_homedecor_node_is_owned(pos, placer)
+ local ownername = false
+ if type(IsPlayerNodeOwner) == "function" then -- node_ownership mod
+ if HasOwner(pos, placer) then
+ if not IsPlayerNodeOwner(pos, placer:get_player_name()) then
+ if type(getLastOwner) == "function" then -- ...is an old version
+ ownername = getLastOwner(pos)
+ elseif type(GetNodeOwnerName) == "function" then -- ...is a recent version
+ ownername = GetNodeOwnerName(pos)
+ else
+ ownername = S("someone")
+ end
+ end
+ end
+
+ elseif type(isprotect) == "function" then -- glomie's protection mod
+ if not isprotect(5, pos, placer) then
+ ownername = S("someone")
+ end
+ elseif type(protector) == "table" and type(protector.can_dig) == "function" then -- Zeg9's protection mod
+ if not protector.can_dig(5, pos, placer) then
+ ownername = S("someone")
+ end
+ end
+
+ if ownername ~= false then
+ minetest.chat_send_player(placer:get_player_name(), S("Sorry, %s owns that spot."):format(ownername) )
+ return true
+ else
+ return false
+ end
+end
+
+local dirs1 = {20, 23, 22, 21}
+local dirs2 = {9, 18, 7, 12}
+
+local technic_homedecor_rotate_and_place = function(itemstack, placer, pointed_thing)
+ if not technic_homedecor_node_is_owned(pointed_thing.under, placer)
+ and not technic_homedecor_node_is_owned(pointed_thing.above, placer) then
+ local node = minetest.get_node(pointed_thing.under)
+ if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].on_rightclick then
+
+ local above = pointed_thing.above
+ local under = pointed_thing.under
+ local pitch = placer:get_look_pitch()
+ local pname = minetest.get_node(under).name
+ local node = minetest.get_node(above)
+ local fdir = minetest.dir_to_facedir(placer:get_look_dir())
+ local wield_name = itemstack:get_name()
+
+ if not minetest.registered_nodes[pname]
+ or not minetest.registered_nodes[pname].on_rightclick then
+
+ local iswall = (above.x ~= under.x) or (above.z ~= under.z)
+ local isceiling = (above.x == under.x) and (above.z == under.z) and (pitch > 0)
+ local pos1 = above
+
+ if minetest.registered_nodes[pname]["buildable_to"] then
+ pos1 = under
+ iswall = false
+ end
+
+ if not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end
+
+ if iswall then
+ minetest.add_node(pos1, {name = wield_name, param2 = dirs2[fdir+1] }) -- place wall variant
+ elseif isceiling then
+ minetest.add_node(pos1, {name = wield_name, param2 = 20 }) -- place upside down variant
+ else
+ minetest.add_node(pos1, {name = wield_name, param2 = 0 }) -- place right side up
+ end
+
+ if not homedecor_expect_infinite_stacks then
+ itemstack:take_item()
+ return itemstack
+ end
+ end
+ else
+ minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack)
+ end
+ end
+end
+
+-- Yellow -- Half node
+minetest.register_node('technic:homedecor_glowlight_half_yellow', {
+ description = S("Yellow Glowlight (thick)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_yellow_tb.png',
+ 'technic_homedecor_glowlight_yellow_tb.png',
+ 'technic_homedecor_glowlight_thick_yellow_sides.png',
+ 'technic_homedecor_glowlight_thick_yellow_sides.png',
+ 'technic_homedecor_glowlight_thick_yellow_sides.png',
+ 'technic_homedecor_glowlight_thick_yellow_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3 },
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thick)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_half_yellow_active")
+ end
+})
+
+minetest.register_node('technic:homedecor_glowlight_half_yellow_active', {
+ description = S("Yellow Glowlight (thick)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_yellow_tb.png',
+ 'technic_homedecor_glowlight_yellow_tb.png',
+ 'technic_homedecor_glowlight_thick_yellow_sides.png',
+ 'technic_homedecor_glowlight_thick_yellow_sides.png',
+ 'technic_homedecor_glowlight_thick_yellow_sides.png',
+ 'technic_homedecor_glowlight_thick_yellow_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ light_source = LIGHT_MAX,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3, not_in_creative_inventory=1},
+ drop="technic:homedecor_glowlight_half_yellow",
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thick)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_half_yellow")
+ end
+})
+
+-- Yellow -- Quarter node
+minetest.register_node('technic:homedecor_glowlight_quarter_yellow', {
+ description = S("Yellow Glowlight (thin)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_yellow_tb.png',
+ 'technic_homedecor_glowlight_yellow_tb.png',
+ 'technic_homedecor_glowlight_thin_yellow_sides.png',
+ 'technic_homedecor_glowlight_thin_yellow_sides.png',
+ 'technic_homedecor_glowlight_thin_yellow_sides.png',
+ 'technic_homedecor_glowlight_thin_yellow_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3 },
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thin)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_quarter_yellow_active")
+ end
+})
+
+minetest.register_node('technic:homedecor_glowlight_quarter_yellow_active', {
+ description = S("Yellow Glowlight (thin)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_yellow_tb.png',
+ 'technic_homedecor_glowlight_yellow_tb.png',
+ 'technic_homedecor_glowlight_thin_yellow_sides.png',
+ 'technic_homedecor_glowlight_thin_yellow_sides.png',
+ 'technic_homedecor_glowlight_thin_yellow_sides.png',
+ 'technic_homedecor_glowlight_thin_yellow_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ light_source = LIGHT_MAX-1,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3, not_in_creative_inventory=1},
+ drop="technic:homedecor_glowlight_quarter_yellow",
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 100, "Yellow Glowlight (thin)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_quarter_yellow")
+ end
+})
+
+
+-- White -- half node
+minetest.register_node('technic:homedecor_glowlight_half_white', {
+ description = S("White Glowlight (thick)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_white_tb.png',
+ 'technic_homedecor_glowlight_white_tb.png',
+ 'technic_homedecor_glowlight_thick_white_sides.png',
+ 'technic_homedecor_glowlight_thick_white_sides.png',
+ 'technic_homedecor_glowlight_thick_white_sides.png',
+ 'technic_homedecor_glowlight_thick_white_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3 },
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 100, "White Glowlight (thick)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_half_white_active")
+ end
+})
+
+minetest.register_node('technic:homedecor_glowlight_half_white_active', {
+ description = S("White Glowlight (thick)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_white_tb.png',
+ 'technic_homedecor_glowlight_white_tb.png',
+ 'technic_homedecor_glowlight_thick_white_sides.png',
+ 'technic_homedecor_glowlight_thick_white_sides.png',
+ 'technic_homedecor_glowlight_thick_white_sides.png',
+ 'technic_homedecor_glowlight_thick_white_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ light_source = LIGHT_MAX,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3, not_in_creative_inventory=1},
+ drop="technic:homedecor_glowlight_half_white",
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 100, "White Glowlight (thick)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_half_white")
+ end
+})
+
+-- White -- Quarter node
+minetest.register_node('technic:homedecor_glowlight_quarter_white', {
+ description = S("White Glowlight (thin)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_white_tb.png',
+ 'technic_homedecor_glowlight_white_tb.png',
+ 'technic_homedecor_glowlight_thin_white_sides.png',
+ 'technic_homedecor_glowlight_thin_white_sides.png',
+ 'technic_homedecor_glowlight_thin_white_sides.png',
+ 'technic_homedecor_glowlight_thin_white_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3 },
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 100, "White Glowlight (thin)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_off(pos, 100, "technic:homedecor_glowlight_quarter_white_active")
+ end
+})
+
+minetest.register_node('technic:homedecor_glowlight_quarter_white_active', {
+ description = S("White Glowlight (thin)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_white_tb.png',
+ 'technic_homedecor_glowlight_white_tb.png',
+ 'technic_homedecor_glowlight_thin_white_sides.png',
+ 'technic_homedecor_glowlight_thin_white_sides.png',
+ 'technic_homedecor_glowlight_thin_white_sides.png',
+ 'technic_homedecor_glowlight_thin_white_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ light_source = LIGHT_MAX-1,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3, not_in_creative_inventory=1},
+ drop="technic:homedecor_glowlight_quarter_white",
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 100, "White Glowlight (thin)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_quarter_white")
+ end
+})
+
+-- Glowlight "cubes" - yellow
+minetest.register_node('technic:homedecor_glowlight_small_cube_yellow', {
+ description = S("Yellow Glowlight (small cube)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_cube_yellow_tb.png',
+ 'technic_homedecor_glowlight_cube_yellow_tb.png',
+ 'technic_homedecor_glowlight_cube_yellow_sides.png',
+ 'technic_homedecor_glowlight_cube_yellow_sides.png',
+ 'technic_homedecor_glowlight_cube_yellow_sides.png',
+ 'technic_homedecor_glowlight_cube_yellow_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3 },
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 50, "Yellow Glowlight (small cube)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_off(pos, 50, "technic:homedecor_glowlight_small_cube_yellow_active")
+ end
+})
+
+minetest.register_node('technic:homedecor_glowlight_small_cube_yellow_active', {
+ description = S("Yellow Glowlight (small cube)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_cube_yellow_tb.png',
+ 'technic_homedecor_glowlight_cube_yellow_tb.png',
+ 'technic_homedecor_glowlight_cube_yellow_sides.png',
+ 'technic_homedecor_glowlight_cube_yellow_sides.png',
+ 'technic_homedecor_glowlight_cube_yellow_sides.png',
+ 'technic_homedecor_glowlight_cube_yellow_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ light_source = LIGHT_MAX-1,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3, not_in_creative_inventory=1},
+ drop="technic:homedecor_glowlight_small_cube_yellow",
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 50, "Yellow Glowlight (small cube)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_small_cube_yellow")
+ end
+})
+
+-- Glowlight "cubes" - white
+minetest.register_node('technic:homedecor_glowlight_small_cube_white', {
+ description = S("White Glowlight (small cube)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_cube_white_tb.png',
+ 'technic_homedecor_glowlight_cube_white_tb.png',
+ 'technic_homedecor_glowlight_cube_white_sides.png',
+ 'technic_homedecor_glowlight_cube_white_sides.png',
+ 'technic_homedecor_glowlight_cube_white_sides.png',
+ 'technic_homedecor_glowlight_cube_white_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3 },
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 50, "White Glowlight (small cube)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_off(pos, 50, "technic:homedecor_glowlight_small_cube_white_active")
+ end
+})
+
+minetest.register_node('technic:homedecor_glowlight_small_cube_white_active', {
+ description = S("White Glowlight (small cube)"),
+ drawtype = "nodebox",
+ tiles = {
+ 'technic_homedecor_glowlight_cube_white_tb.png',
+ 'technic_homedecor_glowlight_cube_white_tb.png',
+ 'technic_homedecor_glowlight_cube_white_sides.png',
+ 'technic_homedecor_glowlight_cube_white_sides.png',
+ 'technic_homedecor_glowlight_cube_white_sides.png',
+ 'technic_homedecor_glowlight_cube_white_sides.png'
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 }
+ },
+ node_box = {
+ type = "fixed",
+ fixed = { -0.25, -0.5, -0.25, 0.25, 0, 0.25 }
+ },
+
+ sunlight_propagates = false,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ walkable = true,
+ light_source = LIGHT_MAX-1,
+ sounds = default.node_sound_wood_defaults(),
+
+ groups = { snappy = 3, not_in_creative_inventory=1},
+ drop="technic:homedecor_glowlight_small_cube_white",
+ on_place = function(itemstack, placer, pointed_thing)
+ technic_homedecor_rotate_and_place(itemstack, placer, pointed_thing)
+ return itemstack
+ end,
+ on_construct = function(pos)
+ technic.inductive_on_construct(pos, 50, "White Glowlight (small cube)")
+ end,
+ on_punch = function(pos, node, puncher)
+ technic.inductive_on_punch_on(pos, 0, "technic:homedecor_glowlight_small_cube_white")
+ end
+})
+
+technic.register_inductive_machine("technic:homedecor_glowlight_half_yellow")
+technic.register_inductive_machine("technic:homedecor_glowlight_half_white")
+technic.register_inductive_machine("technic:homedecor_glowlight_quarter_yellow")
+technic.register_inductive_machine("technic:homedecor_glowlight_quarter_white")
+technic.register_inductive_machine("technic:homedecor_glowlight_small_cube_yellow")
+technic.register_inductive_machine("technic:homedecor_glowlight_small_cube_white")
diff --git a/technic/technic/machines/MV/power_radiator.lua b/technic/technic/machines/MV/power_radiator.lua
new file mode 100644
index 0000000..560f8a9
--- /dev/null
+++ b/technic/technic/machines/MV/power_radiator.lua
@@ -0,0 +1,220 @@
+-- The power radiator fuctions like an inductive charger
+-- only better in the game setting.
+-- The purpose is to allow small appliances to receive power
+-- without the overhead of the wiring needed for larger machines.
+--
+-- The power radiator will consume power corresponding to the
+-- sum(power rating of the attached appliances)/0.06
+-- Using inductive power transfer is very inefficient so this is
+-- set to the factor 0.06.
+--
+-- Punching the radiator will toggle the power state of all attached appliances.
+
+local power_radius = 12
+
+------------------------------------------------------------------
+-- API for inductive powered nodes:
+-- Use the functions below to set the corresponding callbacks
+-- Also two nodes are needed: The inactive and the active one. The active must be called <name>_active .
+------------------------------------------------------------------
+-- Register a new appliance using this function
+
+technic.inductive_nodes = {}
+technic.register_inductive_machine = function(name)
+ table.insert(technic.inductive_nodes, name)
+ table.insert(technic.inductive_nodes, name.."_active")
+end
+
+-- Appliances:
+-- has_supply: pos of supply node if the appliance has a power radiator near with sufficient power for the demand else ""
+-- EU_demand: The power demand of the device.
+-- EU_charge: Actual use. set to EU_demand if active==1
+-- active: set to 1 if the device is on
+technic.inductive_on_construct = function(pos, eu_demand, infotext)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", infotext)
+ meta:set_int("technic_inductive_power_machine", 1)
+ meta:set_int("EU_demand", eu_demand) -- The power demand of this appliance
+ meta:set_int("EU_charge", 0) -- The actual power draw of this appliance
+ meta:set_string("has_supply", "") -- Register whether we are powered or not. For use with several radiators.
+ meta:set_int("active", 0) -- If the appliance can be turned on and off by using it use this.
+end
+
+technic.inductive_on_punch_off = function(pos, eu_charge, swapnode)
+ local meta = minetest.get_meta(pos)
+ if meta:get_string("has_supply") ~= "" then
+ technic.swap_node(pos, swapnode)
+ meta:set_int("active", 1)
+ meta:set_int("EU_charge",eu_charge)
+ --print("-----------")
+ --print("Turn on:")
+ --print("EU_charge: "..meta:get_int("EU_charge"))
+ --print("has_supply: "..meta:get_string("has_supply"))
+ --print("<----------->")
+ end
+end
+
+technic.inductive_on_punch_on = function(pos, eu_charge, swapnode)
+ local meta = minetest.get_meta(pos)
+ technic.swap_node(pos, swapnode)
+ meta:set_int("active", 0)
+ meta:set_int("EU_charge",eu_charge)
+ --print("-----------")
+ --print("Turn off:")
+ --print("EU_charge: "..meta:get_int("EU_charge"))
+ --print("has_supply: "..meta:get_string("has_supply"))
+ --print("<---------->")
+end
+
+local shutdown_inductive_appliances = function(pos)
+ -- The supply radius
+ local rad = power_radius
+ -- If the radiator is removed. turn off all appliances in region
+ -- If another radiator is near it will turn on the appliances again
+ local positions = minetest.find_nodes_in_area(
+ {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad},
+ {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad},
+ technic.inductive_nodes)
+ for _, pos1 in pairs(positions) do
+ local meta1 = minetest.get_meta(pos1)
+ -- If the appliance is belonging to this node
+ if meta1:get_string("has_supply") == pos.x..pos.y..pos.z then
+ local nodename = minetest.get_node(pos1).name
+ -- Swap the node and make sure it is off and unpowered
+ if string.sub(nodename, -7) == "_active" then
+ technic.swap_node(pos1, string.sub(nodename, 1, -8))
+ meta1:set_int("active", 0)
+ meta1:set_int("EU_charge", 0)
+ end
+ meta1:set_string("has_supply", "")
+ end
+ end
+end
+
+local toggle_on_off_inductive_appliances = function(pos, node, puncher)
+ if pos == nil then return end
+ -- The supply radius
+ local rad = power_radius
+ local positions = minetest.find_nodes_in_area(
+ {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad},
+ {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad},
+ technic.inductive_nodes)
+ for _, pos1 in pairs(positions) do
+ local meta1 = minetest.get_meta(pos1)
+ if meta1:get_string("has_supply") == pos.x..pos.y..pos.z then
+ minetest.punch_node(pos1)
+ end
+ end
+end
+
+minetest.register_node("technic:power_radiator", {
+ description = "MV Power Radiator",
+ tiles = {"technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png",
+ "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"},
+ groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
+ sounds = default.node_sound_wood_defaults(),
+ drawtype = "nodebox",
+ paramtype = "light",
+ is_ground_content = true,
+ node_box = {
+ type = "fixed",
+ fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_int("MV_EU_demand",1) -- Demand on the primary side when idle
+ meta:set_int("connected_EU_demand",0) -- Potential demand of connected appliances
+ meta:set_string("infotext", "MV Power Radiator")
+ end,
+ on_dig = function(pos, node, digger)
+ shutdown_inductive_appliances(pos)
+ return minetest.node_dig(pos, node, digger)
+ end,
+ on_punch = function(pos, node, puncher)
+ toggle_on_off_inductive_appliances(pos, node, puncher)
+ end
+})
+
+minetest.register_craft({
+ output = 'technic:power_radiator 1',
+ recipe = {
+ {'technic:stainless_steel_ingot', 'technic:mv_transformer', 'technic:stainless_steel_ingot'},
+ {'technic:copper_coil', 'technic:machine_casing', 'technic:copper_coil'},
+ {'technic:rubber', 'technic:mv_cable0', 'technic:rubber'},
+ }
+})
+
+minetest.register_abm({
+ nodenames = {"technic:power_radiator"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ local meta = minetest.get_meta(pos)
+ local eu_input = meta:get_int("MV_EU_input")
+ local eu_demand = meta:get_int("MV_EU_demand")
+
+ -- Power off automatically if no longer connected to a switching station
+ technic.switching_station_timeout_count(pos, "MV")
+
+ if eu_input == 0 then
+ -- No power
+ meta:set_string("infotext", "MV Power Radiator is unpowered");
+ -- meta:set_int("active", 1) -- used for setting textures someday maybe
+ shutdown_inductive_appliances(pos)
+ meta:set_int("connected_EU_demand", 0)
+ meta:set_int("MV_EU_demand",1)
+ elseif eu_input == eu_demand then
+ -- Powered and ready
+
+ -- The maximum EU sourcing a single radiator can provide.
+ local max_charge = 30000 -- == the max EU demand of the radiator
+ local connected_EU_demand = meta:get_int("connected_EU_demand")
+
+ -- Efficiency factor
+ local eff_factor = 0.06
+ -- The supply radius
+ local rad = power_radius
+
+ local meta1 = nil
+ local pos1 = {}
+ local used_charge = 0
+
+ -- Index all nodes within supply range
+ local positions = minetest.find_nodes_in_area(
+ {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad},
+ {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad},
+ technic.inductive_nodes)
+ for _, pos1 in pairs(positions) do
+ local meta1 = minetest.get_meta(pos1)
+ -- If not supplied see if this node can handle it.
+ if meta1:get_string("has_supply") == "" then
+ -- if demand surpasses the capacity of this node, don't bother adding it.
+ local app_eu_demand = math.floor(meta1:get_int("EU_demand") / eff_factor)
+ if connected_EU_demand + app_eu_demand <= max_charge then
+ -- We can power the appliance. Register, and spend power if it is on.
+ connected_EU_demand = connected_EU_demand + app_eu_demand
+
+ meta1:set_string("has_supply", pos.x..pos.y..pos.z)
+ --Always 0: used_charge = math.floor(used_charge + meta1:get_int("EU_charge") / eff_factor)
+ end
+ elseif meta1:get_string("has_supply") == pos.x..pos.y..pos.z then
+ -- The appliance has power from this node. Spend power if it is on.
+ used_charge = used_charge + math.floor(meta1:get_int("EU_charge") / eff_factor)
+ end
+ meta:set_string("infotext", "MV Power Radiator is powered ("
+ ..math.floor(used_charge / max_charge * 100)
+ .."% of maximum power)");
+ if used_charge == 0 then
+ meta:set_int("MV_EU_demand", 1) -- Still idle
+ else
+ meta:set_int("MV_EU_demand", used_charge)
+ end
+ end
+ -- Save state
+ meta:set_int("connected_EU_demand", connected_EU_demand)
+ end
+ end,
+})
+
+technic.register_machine("MV", "technic:power_radiator", technic.receiver)
+
diff --git a/technic/technic/machines/MV/solar_array.lua b/technic/technic/machines/MV/solar_array.lua
new file mode 100644
index 0000000..227d8ee
--- /dev/null
+++ b/technic/technic/machines/MV/solar_array.lua
@@ -0,0 +1,14 @@
+
+minetest.register_craft({
+ output = 'technic:solar_array_mv 1',
+ recipe = {
+ {'technic:solar_array_lv', 'technic:solar_array_lv', 'technic:solar_array_lv'},
+ {'technic:carbon_steel_ingot', 'technic:mv_transformer', 'technic:carbon_steel_ingot'},
+ {'', 'technic:mv_cable0', ''},
+ }
+})
+
+technic.register_solar_array({tier="MV", power=30})
+
+-- compatibility alias for upgrading from old versions of technic
+minetest.register_alias("technic:solar_panel_mv", "technic:solar_array_mv")
diff --git a/technic/technic/machines/MV/tool_workshop.lua b/technic/technic/machines/MV/tool_workshop.lua
new file mode 100644
index 0000000..318b1ec
--- /dev/null
+++ b/technic/technic/machines/MV/tool_workshop.lua
@@ -0,0 +1,117 @@
+-- Tool workshop
+-- This machine repairs tools.
+
+minetest.register_alias("tool_workshop", "technic:tool_workshop")
+
+local S = technic.getter
+
+minetest.register_craft({
+ output = 'technic:tool_workshop',
+ recipe = {
+ {'group:wood', 'default:diamond', 'group:wood'},
+ {'mesecons_pistons:piston_sticky_off', 'technic:machine_casing', 'technic:carbon_cloth'},
+ {'default:obsidian', 'technic:mv_cable0', 'default:obsidian'},
+ }
+})
+
+local workshop_demand = {5000, 3500, 2000}
+
+local workshop_formspec =
+ "invsize[8,9;]"..
+ "list[current_name;src;3,1;1,1;]"..
+ "label[0,0;"..S("%s Tool Workshop"):format("MV").."]"..
+ "list[current_name;upgrade1;1,3;1,1;]"..
+ "list[current_name;upgrade2;2,3;1,1;]"..
+ "label[1,4;"..S("Upgrade Slots").."]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]"..
+ "listring[current_name;upgrade1]"..
+ "listring[current_player;main]"..
+ "listring[current_name;upgrade2]"..
+ "listring[current_player;main]"
+
+local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local eu_input = meta:get_int("MV_EU_input")
+ local machine_name = S("%s Tool Workshop"):format("MV")
+ local machine_node = "technic:tool_workshop"
+
+ -- Setup meta data if it does not exist.
+ if not eu_input then
+ meta:set_int("MV_EU_demand", workshop_demand[1])
+ meta:set_int("MV_EU_input", 0)
+ return
+ end
+
+ local EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
+
+ local repairable = false
+ local srcstack = inv:get_stack("src", 1)
+ if not srcstack:is_empty() then
+ local itemdef = minetest.registered_items[srcstack:get_name()]
+ if itemdef and
+ (not itemdef.wear_represents or
+ itemdef.wear_represents == "mechanical_wear") and
+ srcstack:get_wear() ~= 0 then
+ repairable = true
+ end
+ end
+ technic.handle_machine_pipeworks(pos, tube_upgrade, function (pos, x_velocity, z_velocity)
+ if not repairable then
+ technic.send_items(pos, x_velocity, z_velocity, "src")
+ end
+ end)
+ if not repairable then
+ meta:set_string("infotext", S("%s Idle"):format(machine_name))
+ meta:set_int("MV_EU_demand", 0)
+ return
+ end
+
+ if eu_input < workshop_demand[EU_upgrade+1] then
+ meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
+ elseif eu_input >= workshop_demand[EU_upgrade+1] then
+ meta:set_string("infotext", S("%s Active"):format(machine_name))
+ srcstack:add_wear(-1000)
+ inv:set_stack("src", 1, srcstack)
+ end
+ meta:set_int("MV_EU_demand", workshop_demand[EU_upgrade+1])
+end
+
+minetest.register_node("technic:tool_workshop", {
+ description = S("%s Tool Workshop"):format("MV"),
+ paramtype2 = "facedir",
+ 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, technic_machine=1, tubedevice=1, tubedevice_receiver=1},
+ sounds = default.node_sound_wood_defaults(),
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("%s Tool Workshop"):format("MV"))
+ meta:set_string("formspec", workshop_formspec)
+ local inv = meta:get_inventory()
+ inv:set_size("src", 1)
+ inv:set_size("upgrade1", 1)
+ inv:set_size("upgrade2", 1)
+ end,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ tube = {
+ can_insert = function (pos, node, stack, direction)
+ return minetest.get_meta(pos):get_inventory():room_for_item("src", stack)
+ end,
+ insert_object = function (pos, node, stack, direction)
+ return minetest.get_meta(pos):get_inventory():add_item("src", stack)
+ end,
+ connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
+ },
+ technic_run = run,
+ after_place_node = pipeworks.after_place,
+ after_dig_node = technic.machine_after_dig_node
+})
+
+technic.register_machine("MV", "technic:tool_workshop", technic.receiver)
+
diff --git a/technic/technic/machines/MV/wind_mill.lua b/technic/technic/machines/MV/wind_mill.lua
new file mode 100644
index 0000000..c553051
--- /dev/null
+++ b/technic/technic/machines/MV/wind_mill.lua
@@ -0,0 +1,87 @@
+
+local S = technic.getter
+
+minetest.register_craft({
+ output = 'technic:wind_mill_frame 5',
+ recipe = {
+ {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'},
+ {'', 'technic:carbon_steel_ingot', ''},
+ {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:wind_mill',
+ recipe = {
+ {'', 'technic:motor', ''},
+ {'technic:carbon_steel_ingot', 'technic:carbon_steel_block', 'technic:carbon_steel_ingot'},
+ {'', 'technic:mv_cable0', ''},
+ }
+})
+
+minetest.register_node("technic:wind_mill_frame", {
+ description = S("Wind Mill Frame"),
+ drawtype = "glasslike_framed",
+ tiles = {"technic_carbon_steel_block.png", "default_glass.png"},
+ sunlight_propagates = true,
+ groups = {cracky=3},
+ sounds = default.node_sound_stone_defaults(),
+ paramtype = "light",
+})
+
+local function check_wind_mill(pos)
+ if pos.y < 30 then
+ return false
+ end
+ for i = 1, 20 do
+ local node = minetest.get_node({x=pos.x, y=pos.y-i, z=pos.z})
+ if node.name ~= "technic:wind_mill_frame" then
+ return false
+ end
+ end
+ return true
+end
+
+local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local machine_name = S("Wind %s Generator"):format("MV")
+ local power = math.min(pos.y * 100, 5000)
+
+ if not check_wind_mill(pos) then
+ meta:set_int("MV_EU_supply", 0)
+ meta:set_string("infotext", S("%s Improperly Placed"):format(machine_name))
+ return
+ else
+ meta:set_int("MV_EU_supply", power)
+ end
+
+ meta:set_string("infotext", S("@1 (@2 EU)", machine_name, technic.prettynum(power)))
+end
+
+minetest.register_node("technic:wind_mill", {
+ description = S("Wind %s Generator"):format("MV"),
+ tiles = {"technic_carbon_steel_block.png"},
+ paramtype2 = "facedir",
+ groups = {cracky=1, technic_machine=1},
+ sounds = default.node_sound_stone_defaults(),
+ drawtype = "nodebox",
+ paramtype = "light",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Main box
+ {-0.1, -0.1, -0.5, 0.1, 0.1, -0.6}, -- Shaft
+ {-0.1, -1, -0.6, 0.1, 1, -0.7}, -- Vertical blades
+ {-1, -0.1, -0.6, 1, 0.1, -0.7}, -- Horizontal blades
+ }
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("Wind %s Generator"):format("MV"))
+ meta:set_int("MV_EU_supply", 0)
+ end,
+ technic_run = run,
+})
+
+technic.register_machine("MV", "technic:wind_mill", technic.producer)
+
diff --git a/technic/technic/machines/init.lua b/technic/technic/machines/init.lua
new file mode 100644
index 0000000..ad79eab
--- /dev/null
+++ b/technic/technic/machines/init.lua
@@ -0,0 +1,14 @@
+local path = technic.modpath.."/machines"
+
+dofile(path.."/register/init.lua")
+
+-- Tiers
+dofile(path.."/LV/init.lua")
+dofile(path.."/MV/init.lua")
+dofile(path.."/HV/init.lua")
+
+dofile(path.."/switching_station.lua")
+dofile(path.."/supply_converter.lua")
+
+dofile(path.."/other/init.lua")
+
diff --git a/technic/technic/machines/other/anchor.lua b/technic/technic/machines/other/anchor.lua
new file mode 100644
index 0000000..1c15bd2
--- /dev/null
+++ b/technic/technic/machines/other/anchor.lua
@@ -0,0 +1,109 @@
+local S = technic.getter
+
+local desc = S("Administrative World Anchor")
+
+local function compute_forceload_positions(pos, meta)
+ local radius = meta:get_int("radius")
+ local minpos = vector.subtract(pos, vector.new(radius, radius, radius))
+ local maxpos = vector.add(pos, vector.new(radius, radius, radius))
+ local minbpos = {}
+ local maxbpos = {}
+ for _, coord in ipairs({"x","y","z"}) do
+ minbpos[coord] = math.floor(minpos[coord] / 16) * 16
+ maxbpos[coord] = math.floor(maxpos[coord] / 16) * 16
+ end
+ local flposes = {}
+ for x = minbpos.x, maxbpos.x, 16 do
+ for y = minbpos.y, maxbpos.y, 16 do
+ for z = minbpos.z, maxbpos.z, 16 do
+ table.insert(flposes, vector.new(x, y, z))
+ end
+ end
+ end
+ return flposes
+end
+
+local function currently_forceloaded_positions(meta)
+ local ser = meta:get_string("forceloaded")
+ return ser == "" and {} or minetest.deserialize(ser)
+end
+
+local function forceload_off(meta)
+ local flposes = currently_forceloaded_positions(meta)
+ meta:set_string("forceloaded", "")
+ for _, p in ipairs(flposes) do
+ minetest.forceload_free_block(p)
+ end
+end
+
+local function forceload_on(pos, meta)
+ local want_flposes = compute_forceload_positions(pos, meta)
+ local have_flposes = {}
+ for _, p in ipairs(want_flposes) do
+ if minetest.forceload_block(p) then
+ table.insert(have_flposes, p)
+ end
+ end
+ meta:set_string("forceloaded", #have_flposes == 0 and "" or minetest.serialize(have_flposes))
+end
+
+local function set_display(pos, meta)
+ meta:set_string("infotext", S(meta:get_int("enabled") ~= 0 and "%s Enabled" or "%s Disabled"):format(desc))
+ meta:set_string("formspec",
+ "size[5,3.5]"..
+ "item_image[0,0;1,1;technic:admin_anchor]"..
+ "label[1,0;"..minetest.formspec_escape(desc).."]"..
+ "label[0,1;"..minetest.formspec_escape(S("Owner:").." "..meta:get_string("owner")).."]"..
+ (meta:get_int("locked") == 0 and
+ "button[3,1;2,1;lock;"..minetest.formspec_escape(S("Unlocked")).."]" or
+ "button[3,1;2,1;unlock;"..minetest.formspec_escape(S("Locked")).."]")..
+ "field[0.25,2.3;1,1;radius;"..minetest.formspec_escape(S("Radius:"))..";"..meta:get_int("radius").."]"..
+ (meta:get_int("enabled") == 0 and
+ "button[3,2;2,1;enable;"..minetest.formspec_escape(S("Disabled")).."]" or
+ "button[3,2;2,1;disable;"..minetest.formspec_escape(S("Enabled")).."]")..
+ "label[0,3;"..minetest.formspec_escape(S("Keeping %d/%d map blocks loaded"):format(#currently_forceloaded_positions(meta), #compute_forceload_positions(pos, meta))).."]")
+end
+
+minetest.register_node("technic:admin_anchor", {
+ description = desc,
+ drawtype = "normal",
+ tiles = {"technic_admin_anchor.png"},
+ is_ground_content = true,
+ groups = {cracky=3, not_in_creative_inventory=1},
+ sounds = default.node_sound_stone_defaults(),
+ after_place_node = function (pos, placer)
+ local meta = minetest.get_meta(pos)
+ if placer and placer:is_player() then
+ meta:set_string("owner", placer:get_player_name())
+ end
+ set_display(pos, meta)
+ end,
+ can_dig = function (pos, player)
+ local meta = minetest.get_meta(pos)
+ return meta:get_int("locked") == 0 or (player and player:is_player() and player:get_player_name() == meta:get_string("owner"))
+ end,
+ on_destruct = function (pos)
+ local meta = minetest.get_meta(pos)
+ forceload_off(meta)
+ end,
+ on_receive_fields = function (pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ if (meta:get_int("locked") ~= 0 or fields.lock) and
+ not (sender and sender:is_player() and
+ sender:get_player_name() == meta:get_string("owner")) then
+ return
+ end
+ if fields.unlock then meta:set_int("locked", 0) end
+ if fields.lock then meta:set_int("locked", 1) end
+ if fields.disable or fields.enable or fields.radius then
+ forceload_off(meta)
+ if fields.disable then meta:set_int("enabled", 0) end
+ if fields.enable then meta:set_int("enabled", 1) end
+ if fields.radius and string.find(fields.radius, "^[0-9]+$") and tonumber(fields.radius) < 256 then meta:set_int("radius", fields.radius) end
+ if meta:get_int("enabled") ~= 0 then
+ forceload_on(pos, meta)
+ end
+ end
+ set_display(pos, meta)
+ end,
+})
diff --git a/technic/technic/machines/other/coal_alloy_furnace.lua b/technic/technic/machines/other/coal_alloy_furnace.lua
new file mode 100644
index 0000000..58af679
--- /dev/null
+++ b/technic/technic/machines/other/coal_alloy_furnace.lua
@@ -0,0 +1,177 @@
+
+-- Fuel driven alloy furnace. This uses no EUs:
+
+local S = technic.getter
+
+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'},
+ }
+})
+
+local machine_name = S("Fuel-Fired Alloy Furnace")
+local formspec =
+ "size[8,9]"..
+ "label[0,0;"..machine_name.."]"..
+ "image[2,2;1,1;default_furnace_fire_bg.png]"..
+ "list[current_name;fuel;2,3;1,1;]"..
+ "list[current_name;src;2,1;2,1;]"..
+ "list[current_name;dst;5,1;2,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[current_name;dst]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]"..
+ "listring[current_name;fuel]"..
+ "listring[current_player;main]"
+
+minetest.register_node("technic:coal_alloy_furnace", {
+ description = machine_name,
+ 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.get_meta(pos)
+ meta:set_string("formspec", formspec)
+ meta:set_string("infotext", machine_name)
+ local inv = meta:get_inventory()
+ inv:set_size("fuel", 1)
+ inv:set_size("src", 2)
+ inv:set_size("dst", 4)
+ end,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+})
+
+minetest.register_node("technic:coal_alloy_furnace_active", {
+ description = machine_name,
+ 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 = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+})
+
+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.get_meta(pos)
+ local inv = meta:get_inventory()
+
+ if inv:get_size("src") == 1 then -- Old furnace -> convert it
+ inv:set_size("src", 2)
+ inv:set_stack("src", 2, inv:get_stack("src2", 1))
+ inv:set_size("src2", 0)
+ end
+
+ local recipe = nil
+
+ for i, name in pairs({
+ "fuel_totaltime",
+ "fuel_time",
+ "src_totaltime",
+ "src_time"}) do
+ if not meta:get_float(name) then
+ meta:set_float(name, 0.0)
+ end
+ end
+
+ -- Get what to cook if anything
+ local result = technic.get_recipe("alloy", inv:get_list("src"))
+
+ local was_active = false
+
+ if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
+ was_active = true
+ meta:set_int("fuel_time", meta:get_int("fuel_time") + 1)
+ if result then
+ meta:set_int("src_time", meta:get_int("src_time") + 1)
+ if meta:get_int("src_time") >= result.time then
+ meta:set_int("src_time", 0)
+ local result_stack = ItemStack(result.output)
+ if inv:room_for_item("dst", result_stack) then
+ inv:set_list("src", result.new_input)
+ inv:add_item("dst", result_stack)
+ end
+ end
+ else
+ meta:set_int("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", S("%s Active"):format(machine_name).." ("..percent.."%)")
+ technic.swap_node(pos, "technic:coal_alloy_furnace_active")
+ meta:set_string("formspec",
+ "size[8,9]"..
+ "label[0,0;"..machine_name.."]"..
+ "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;2,1;]"..
+ "list[current_name;dst;5,1;2,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[current_name;dst]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]"..
+ "listring[current_name;fuel]"..
+ "listring[current_player;main]")
+ return
+ end
+
+ local recipe = technic.get_recipe("alloy", inv:get_list("src"))
+
+ if not recipe then
+ if was_active then
+ meta:set_string("infotext", S("%s is empty"):format(machine_name))
+ technic.swap_node(pos, "technic:coal_alloy_furnace")
+ meta:set_string("formspec", formspec)
+ end
+ return
+ end
+
+ -- Next take a hard look at the fuel situation
+ local fuel = nil
+ local afterfuel
+ local fuellist = inv:get_list("fuel")
+
+ if fuellist then
+ fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
+ end
+
+ if fuel.time <= 0 then
+ meta:set_string("infotext", S("%s Out Of Fuel"):format(machine_name))
+ technic.swap_node(pos, "technic:coal_alloy_furnace")
+ meta:set_string("formspec", formspec)
+ return
+ end
+
+ meta:set_string("fuel_totaltime", fuel.time)
+ meta:set_string("fuel_time", 0)
+
+ inv:set_stack("fuel", 1, afterfuel.items[1])
+ end,
+})
+
diff --git a/technic/technic/machines/other/coal_furnace.lua b/technic/technic/machines/other/coal_furnace.lua
new file mode 100644
index 0000000..53a0f8b
--- /dev/null
+++ b/technic/technic/machines/other/coal_furnace.lua
@@ -0,0 +1,5 @@
+local S = technic.getter
+
+if minetest.registered_nodes["default:furnace"].description == "Furnace" then
+ minetest.override_item("default:furnace", { description = S("Fuel-Fired Furnace") })
+end
diff --git a/technic/technic/machines/other/constructor.lua b/technic/technic/machines/other/constructor.lua
new file mode 100644
index 0000000..3396ac7
--- /dev/null
+++ b/technic/technic/machines/other/constructor.lua
@@ -0,0 +1,189 @@
+
+local S = technic.getter
+
+local function deploy_node(inv, slot_name, pos, node, machine_node)
+ if node.name ~= "air" then
+ if node.name == "ignore" or
+ node.name == "default:lava_source" or
+ node.name == "default:lava_flowing" or
+ node.name == "default:water_source" or
+ node.name == "default:water_flowing" then
+ return
+ end
+ local drops = minetest.get_node_drops(node.name, "")
+ local remove_to = false
+ for i, item in ipairs(drops) do
+ if not inv:room_for_item(slot_name, item) then
+ remove_to = i - 1
+ break
+ end
+ inv:add_item(slot_name, item)
+ end
+ if remove_to then
+ for i = 1, remove_to do
+ inv:remove_item(drops[i])
+ end
+ else
+ minetest.remove_node(pos)
+ end
+ return
+ end
+ if not inv:is_empty(slot_name) then
+ local stack = inv:get_list(slot_name)[1]
+ local def = stack:get_definition()
+ if def.type == "node" then
+ minetest.set_node(pos, {
+ name = stack:get_name(),
+ param2 = machine_node.param2
+ })
+ stack:take_item()
+ inv:set_stack(slot_name, 1, stack)
+ elseif def.type == "craft" then
+ if def.on_place then
+ -- Use pcall to avoid nil placer errors.
+ -- TODO: Do without pcall.
+ local ok, stk = pcall(def.on_place, stack, nil, {
+ -- Fake pointed_thing
+ type = "node",
+ above = pos,
+ under = {x=pos.x, y=pos.y-1, z=pos.z},
+ })
+ if ok then
+ inv:set_stack(slot_name, 1, stk or stack)
+ return
+ end
+ end
+ minetest.item_place_object(stack, nil, {
+ -- Fake pointed_thing
+ type = "node",
+ above = pos,
+ under = pos,
+ })
+ inv:set_stack(slot_name, 1, nil)
+ end
+ end
+end
+
+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'},
+
+})
+
+local function make_on(mark, length)
+ return function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local dir = vector.new()
+ if node.param2 == 3 then dir.x = 1 end
+ if node.param2 == 2 then dir.z = 1 end
+ if node.param2 == 1 then dir.x = -1 end
+ if node.param2 == 0 then dir.z = -1 end
+
+ local place_pos = vector.new(pos)
+
+ if node.name == "technic:constructor_mk"..mark.."_off" then
+ technic.swap_node(pos, "technic:constructor_mk"..mark.."_on")
+ nodeupdate(pos)
+ for i = 1, length do
+ place_pos = vector.add(place_pos, dir)
+ local place_node = minetest.get_node(place_pos)
+ deploy_node(inv, "slot"..i, place_pos, place_node, node)
+ end
+ end
+ end
+end
+
+local function make_off(mark)
+ return function(pos, node)
+ if node.name == "technic:constructor_mk"..mark.."_on" then
+ technic.swap_node(pos,"technic:constructor_mk"..mark.."_off")
+ nodeupdate(pos)
+ end
+ end
+end
+
+
+local function make_constructor(mark, length)
+ minetest.register_node("technic:constructor_mk"..mark.."_off", {
+ description = S("Constructor Mk%d"):format(mark),
+ tiles = {"technic_constructor_mk"..mark.."_top_off.png",
+ "technic_constructor_mk"..mark.."_bottom_off.png",
+ "technic_constructor_mk"..mark.."_side2_off.png",
+ "technic_constructor_mk"..mark.."_side1_off.png",
+ "technic_constructor_back.png",
+ "technic_constructor_front_off.png"},
+ paramtype2 = "facedir",
+ groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, mesecon = 2},
+ mesecons = {effector = {action_on = make_on(mark, length)}},
+ sounds = default.node_sound_stone_defaults(),
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ local formspec = "size[8,9;]"..
+ "label[0,0;"..S("Constructor Mk%d"):format(mark).."]"..
+ "list[current_player;main;0,5;8,4;]"
+ for i = 1, length do
+ formspec = formspec
+ .."label[5,"..(i - 1)..";"..S("Slot %d"):format(i).."]"
+ .."list[current_name;slot"..i
+ ..";6,"..(i - 1)..";1,1;]"
+ end
+ meta:set_string("formspec", formspec)
+ meta:set_string("infotext", S("Constructor Mk%d"):format(mark))
+ local inv = meta:get_inventory()
+ for i = 1, length do
+ inv:set_size("slot"..i, 1)
+ end
+ end,
+ can_dig = function(pos, player)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ for i = 1, length do
+ if not inv:is_empty("slot"..i) then
+ return false
+ end
+ end
+ return true
+ end,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ })
+
+ minetest.register_node("technic:constructor_mk"..mark.."_on", {
+ tiles = {"technic_constructor_mk"..mark.."_top_on.png",
+ "technic_constructor_mk"..mark.."_bottom_on.png",
+ "technic_constructor_mk"..mark.."_side2_on.png",
+ "technic_constructor_mk"..mark.."_side1_on.png",
+ "technic_constructor_back.png",
+ "technic_constructor_front_on.png"},
+ paramtype2 = "facedir",
+ drop = "technic:constructor_mk"..mark.."_off",
+ groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
+ mesecon=2, not_in_creative_inventory=1},
+ mesecons= {effector = {action_off = make_off(mark)}},
+ sounds = default.node_sound_stone_defaults(),
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ })
+end
+
+make_constructor(1, 1)
+make_constructor(2, 2)
+make_constructor(3, 4)
+
diff --git a/technic/technic/machines/other/frames.lua b/technic/technic/machines/other/frames.lua
new file mode 100644
index 0000000..b3f39b9
--- /dev/null
+++ b/technic/technic/machines/other/frames.lua
@@ -0,0 +1,928 @@
+
+local S = technic.getter
+
+frames = {}
+
+local infinite_stacks = minetest.setting_getbool("creative_mode") and minetest.get_modpath("unified_inventory") == nil
+
+local frames_pos = {}
+
+-- Helpers
+
+local function get_face(pos,ppos,pvect)
+ -- Raytracer to get which face has been clicked
+ ppos={x=ppos.x-pos.x,y=ppos.y-pos.y+1.5,z=ppos.z-pos.z}
+ if pvect.x>0 then
+ local t=(-0.5-ppos.x)/pvect.x
+ local y_int=ppos.y+t*pvect.y
+ local z_int=ppos.z+t*pvect.z
+ if y_int>-0.45 and y_int<0.45 and z_int>-0.45 and z_int<0.45 then return 1 end
+ elseif pvect.x<0 then
+ local t=(0.5-ppos.x)/pvect.x
+ local y_int=ppos.y+t*pvect.y
+ local z_int=ppos.z+t*pvect.z
+ if y_int>-0.45 and y_int<0.45 and z_int>-0.45 and z_int<0.45 then return 2 end
+ end
+ if pvect.y>0 then
+ local t=(-0.5-ppos.y)/pvect.y
+ local x_int=ppos.x+t*pvect.x
+ local z_int=ppos.z+t*pvect.z
+ if x_int>-0.45 and x_int<0.45 and z_int>-0.45 and z_int<0.45 then return 3 end
+ elseif pvect.y<0 then
+ local t=(0.5-ppos.y)/pvect.y
+ local x_int=ppos.x+t*pvect.x
+ local z_int=ppos.z+t*pvect.z
+ if x_int>-0.45 and x_int<0.45 and z_int>-0.45 and z_int<0.45 then return 4 end
+ end
+ if pvect.z>0 then
+ local t=(-0.5-ppos.z)/pvect.z
+ local x_int=ppos.x+t*pvect.x
+ local y_int=ppos.y+t*pvect.y
+ if x_int>-0.45 and x_int<0.45 and y_int>-0.45 and y_int<0.45 then return 5 end
+ elseif pvect.z<0 then
+ local t=(0.5-ppos.z)/pvect.z
+ local x_int=ppos.x+t*pvect.x
+ local y_int=ppos.y+t*pvect.y
+ if x_int>-0.45 and x_int<0.45 and y_int>-0.45 and y_int<0.45 then return 6 end
+ end
+end
+
+local function lines(str)
+ local t = {}
+ local function helper(line) table.insert(t, line) return "" end
+ helper((str:gsub("(.-)\r?\n", helper)))
+ return t
+end
+
+local function pos_to_string(pos)
+ if pos.x == 0 then pos.x = 0 end -- Fix for signed 0
+ if pos.y == 0 then pos.y = 0 end -- Fix for signed 0
+ if pos.z == 0 then pos.z = 0 end -- Fix for signed 0
+ return tostring(pos.x).."\n"..tostring(pos.y).."\n"..tostring(pos.z)
+end
+
+local function pos_from_string(str)
+ local l = lines(str)
+ return {x = tonumber(l[1]), y = tonumber(l[2]), z = tonumber(l[3])}
+end
+
+local function pos_in_list(l,pos)
+ for _,p in ipairs(l) do
+ if p.x==pos.x and p.y==pos.y and p.z==pos.z then return true end
+ end
+ return false
+end
+
+local function table_empty(table)
+ for _, __ in pairs(table) do
+ return false
+ end
+ return true
+end
+
+local function add_table(table,toadd)
+ local i = 1
+ while true do
+ o = table[i]
+ if o == toadd then return end
+ if o == nil then break end
+ i = i+1
+ end
+ table[i] = toadd
+end
+
+local function move_nodes_vect(poslist,vect,must_not_move,owner)
+ if minetest.is_protected then
+ for _,pos in ipairs(poslist) do
+ local npos=vector.add(pos,vect)
+ if minetest.is_protected(pos, owner) or minetest.is_protected(npos, owner) then
+ return
+ end
+ end
+ end
+ for _,pos in ipairs(poslist) do
+ local npos=vector.add(pos,vect)
+ local name = minetest.get_node(npos).name
+ if ((name~="air" and minetest.registered_nodes[name].liquidtype=="none") or frames_pos[pos_to_string(npos)]) and not(pos_in_list(poslist,npos)) then
+ return
+ end
+ --[[if pos.x==must_not_move.x and pos.y==must_not_move.y and pos.z==must_not_move.z then
+ return
+ end]]
+ end
+ local nodelist = {}
+ for _, pos in ipairs(poslist) do
+ local node = minetest.get_node(pos)
+ local meta = minetest.get_meta(pos):to_table()
+ nodelist[#(nodelist)+1] = {oldpos = pos, pos = vector.add(pos, vect), node = node, meta = meta}
+ end
+ local objects = {}
+ for _, pos in ipairs(poslist) do
+ for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
+ local entity = object:get_luaentity()
+ if not entity or not mesecon.is_mvps_unmov(entity.name) then
+ add_table(objects, object)
+ end
+ end
+ end
+ for _, obj in ipairs(objects) do
+ obj:setpos(vector.add(obj:getpos(), vect))
+ end
+ for _,n in ipairs(nodelist) do
+ local npos = n.pos
+ minetest.set_node(npos, n.node)
+ local meta = minetest.get_meta(npos)
+ meta:from_table(n.meta)
+ for __,pos in ipairs(poslist) do
+ if npos.x == pos.x and npos.y == pos.y and npos.z == pos.z then
+ table.remove(poslist, __)
+ break
+ end
+ end
+ end
+ for __, pos in ipairs(poslist) do
+ minetest.remove_node(pos)
+ end
+ for _, callback in ipairs(mesecon.on_mvps_move) do
+ callback(nodelist)
+ end
+end
+
+local function is_supported_node(name)
+ return ((string.find(name, "tube") ~= nil) and (string.find(name, "pipeworks") ~= nil))
+end
+
+
+-- Frames
+for xm=0,1 do
+for xp=0,1 do
+for ym=0,1 do
+for yp=0,1 do
+for zm=0,1 do
+for zp=0,1 do
+
+local a=8/16
+local b=7/16
+local nodeboxes= {
+ { -a, -a, -a, -b, a, -b },
+ { -a, -a, b, -b, a, a },
+ { b, -a, b, a, a, a },
+ { b, -a, -a, a, a, -b },
+
+ { -b, b, -a, b, a, -b },
+ { -b, -a, -a, b, -b, -b },
+
+ { -b, b, b, b, a, a },
+ { -b, -a, b, b, -b, a },
+
+ { b, b, -b, a, a, b },
+ { b, -a, -b, a, -b, b },
+
+ { -a, b, -b, -b, a, b },
+ { -a, -a, -b, -b, -b, b },
+ }
+
+ if yp==0 then
+ table.insert(nodeboxes, {-b,b,-b, b,a,b})
+ end
+ if ym==0 then
+ table.insert(nodeboxes, {-b,-a,-b, b,-b,b})
+ end
+ if xp==0 then
+ table.insert(nodeboxes, {b,b,b,a,-b,-b})
+ end
+ if xm==0 then
+ table.insert(nodeboxes, {-a,-b,-b,-b,b,b})
+ end
+ if zp==0 then
+ table.insert(nodeboxes, {-b,-b,b, b,b,a})
+ end
+ if zm==0 then
+ table.insert(nodeboxes, {-b,-b,-a, b,b,-b})
+ end
+
+ local nameext=tostring(xm)..tostring(xp)..tostring(ym)..tostring(yp)..tostring(zm)..tostring(zp)
+ local groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}
+ if nameext~="111111" then groups.not_in_creative_inventory=1 end
+
+
+ minetest.register_node("technic:frame_"..nameext,{
+ description = S("Frame"),
+ tiles = {"technic_frame.png"},
+ groups=groups,
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed=nodeboxes,
+ },
+ selection_box = {
+ type="fixed",
+ fixed={-0.5,-0.5,-0.5,0.5,0.5,0.5}
+ },
+ paramtype = "light",
+ frame=1,
+ drop="technic:frame_111111",
+ sunlight_propagates = true,
+ frame_connect_all=function(nodename)
+ l2={}
+ l1={{x=-1,y=0,z=0},{x=1,y=0,z=0},{x=0,y=-1,z=0},{x=0,y=1,z=0},{x=0,y=0,z=-1},{x=0,y=0,z=1}}
+ for i,dir in ipairs(l1) do
+ if string.sub(nodename,-7+i,-7+i)=="1" then
+ l2[#(l2)+1]=dir
+ end
+ end
+ return l2
+ end,
+ on_punch=function(pos,node,puncher)
+ local ppos=puncher:getpos()
+ local pvect=puncher:get_look_dir()
+ local pface=get_face(pos,ppos,pvect)
+ if pface==nil then return end
+ local nodename=node.name
+ local newstate=tostring(1-tonumber(string.sub(nodename,-7+pface,-7+pface)))
+ if pface<=5 then
+ nodename=string.sub(nodename,1,-7+pface-1)..newstate..string.sub(nodename,-7+pface+1)
+ else
+ nodename=string.sub(nodename,1,-2)..newstate
+ end
+ node.name=nodename
+ minetest.set_node(pos,node)
+ end,
+ on_place = function(itemstack, placer, pointed_thing)
+ local pos = pointed_thing.above
+ if minetest.is_protected(pos, placer:get_player_name()) then
+ minetest.log("action", placer:get_player_name()
+ .. " tried to place " .. itemstack:get_name()
+ .. " at protected position "
+ .. minetest.pos_to_string(pos))
+ minetest.record_protection_violation(pos, placer:get_player_name())
+ return itemstack
+ end
+ if pos == nil then return end
+ local node = minetest.get_node(pos)
+ if node.name ~= "air" then
+ if is_supported_node(node.name) then
+ obj = minetest.add_entity(pos, "technic:frame_entity")
+ obj:get_luaentity():set_node({name=itemstack:get_name()})
+ end
+ else
+ minetest.set_node(pos, {name = itemstack:get_name()})
+ end
+ if not infinite_stacks then
+ itemstack:take_item()
+ end
+ return itemstack
+ end,
+ on_rightclick = function(pos, node, placer, itemstack, pointed_thing)
+ if is_supported_node(itemstack:get_name()) then
+ if minetest.is_protected(pos, placer:get_player_name()) then
+ minetest.log("action", placer:get_player_name()
+ .. " tried to place " .. itemstack:get_name()
+ .. " at protected position "
+ .. minetest.pos_to_string(pos))
+ minetest.record_protection_violation(pos, placer:get_player_name())
+ return itemstack
+ end
+
+ minetest.set_node(pos, {name = itemstack:get_name()})
+
+ local take_item = true
+ local def = minetest.registered_items[itemstack:get_name()]
+ -- Run callback
+ if def.after_place_node then
+ -- Copy place_to because callback can modify it
+ local pos_copy = {x=pos.x, y=pos.y, z=pos.z}
+ if def.after_place_node(pos_copy, placer, itemstack) then
+ take_item = false
+ end
+ end
+
+ -- Run script hook
+ local _, callback
+ for _, callback in ipairs(minetest.registered_on_placenodes) do
+ -- Copy pos and node because callback can modify them
+ local pos_copy = {x=pos.x, y=pos.y, z=pos.z}
+ local newnode_copy = {name=def.name, param1=0, param2=0}
+ local oldnode_copy = {name="air", param1=0, param2=0}
+ if callback(pos_copy, newnode_copy, placer, oldnode_copy, itemstack) then
+ take_item = false
+ end
+ end
+
+ if take_item then
+ itemstack:take_item()
+ end
+
+ obj = minetest.add_entity(pos, "technic:frame_entity")
+ obj:get_luaentity():set_node({name=node.name})
+
+ return itemstack
+ else
+ --local pointed_thing = {type = "node", under = pos}
+ if pointed_thing then
+ minetest.item_place_node(itemstack, placer, pointed_thing)
+ end
+ end
+ end,
+ })
+
+end
+end
+end
+end
+end
+end
+
+minetest.register_entity("technic:frame_entity", {
+ initial_properties = {
+ physical = true,
+ collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
+ visual = "wielditem",
+ textures = {},
+ visual_size = {x=0.667, y=0.667},
+ },
+
+ node = {},
+
+ set_node = function(self, node)
+ self.node = node
+ local pos = self.object:getpos()
+ pos = {x = math.floor(pos.x+0.5), y = math.floor(pos.y+0.5), z = math.floor(pos.z+0.5)}
+ frames_pos[pos_to_string(pos)] = node.name
+ local stack = ItemStack(node.name)
+ 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,
+ textures = {node.name},
+ }
+ self.object:set_properties(prop)
+ end,
+
+ get_staticdata = function(self)
+ return self.node.name
+ end,
+
+ on_activate = function(self, staticdata)
+ self.object:set_armor_groups({immortal=1})
+ self:set_node({name=staticdata})
+ end,
+
+ dig = function(self)
+ minetest.handle_node_drops(self.object:getpos(), {ItemStack("technic:frame_111111")}, self.last_puncher)
+ local pos = self.object:getpos()
+ pos = {x = math.floor(pos.x+0.5), y = math.floor(pos.y+0.5), z = math.floor(pos.z+0.5)}
+ frames_pos[pos_to_string(pos)] = nil
+ self.object:remove()
+ end,
+
+ on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
+ local pos = self.object:getpos()
+ if self.damage_object == nil then
+ self.damage_object = minetest.add_entity(pos, "technic:damage_entity")
+ self.damage_object:get_luaentity().remaining_time = 0.25
+ self.damage_object:get_luaentity().frame_object = self
+ self.damage_object:get_luaentity().texture_index = 0
+ self.damage_object:get_luaentity().texture_change_time = 0.15
+ else
+ self.damage_object:get_luaentity().remaining_time = 0.25
+ end
+ self.last_puncher = puncher
+ local ppos = puncher:getpos()
+ local pvect = puncher:get_look_dir()
+ local pface = get_face(pos,ppos,pvect)
+ if pface == nil then return end
+ local nodename = self.node.name
+ local newstate = tostring(1-tonumber(string.sub(nodename, -7+pface, -7+pface)))
+ if pface <= 5 then
+ nodename = string.sub(nodename, 1, -7+pface-1)..newstate..string.sub(nodename, -7+pface+1)
+ else
+ nodename = string.sub(nodename, 1, -2)..newstate
+ end
+ self.node.name = nodename
+ self:set_node(self.node)
+ end,
+
+ on_rightclick = function(self, clicker)
+ local pos = self.object:getpos()
+ local ppos = clicker:getpos()
+ local pvect = clicker:get_look_dir()
+ local pface = get_face(pos, ppos, pvect)
+ if pface == nil then return end
+ local pos_under = {x = math.floor(pos.x+0.5), y = math.floor(pos.y+0.5), z = math.floor(pos.z+0.5)}
+ local pos_above = {x = pos_under.x, y = pos_under.y, z = pos_under.z}
+ local index = ({"x", "y", "z"})[math.floor((pface+1)/2)]
+ pos_above[index] = pos_above[index] + 2*((pface+1)%2) - 1
+ local pointed_thing = {type = "node", under = pos_under, above = pos_above}
+ local itemstack = clicker:get_wielded_item()
+ local itemdef = minetest.registered_items[itemstack:get_name()]
+ if itemdef ~= nil then
+ itemdef.on_place(itemstack, clicker, pointed_thing)
+ end
+ end,
+})
+
+local crack = "crack_anylength.png^[verticalframe:5:0"
+minetest.register_entity("technic:damage_entity", {
+ initial_properties = {
+ visual = "cube",
+ visual_size = {x=1.01, y=1.01},
+ textures = {crack, crack, crack, crack, crack, crack},
+ collisionbox = {0, 0, 0, 0, 0, 0},
+ physical = false,
+ },
+ on_step = function(self, dtime)
+ if self.remaining_time == nil then
+ self.object:remove()
+ self.frame_object.damage_object = nil
+ end
+ self.remaining_time = self.remaining_time - dtime
+ if self.remaining_time < 0 then
+ self.object:remove()
+ self.frame_object.damage_object = nil
+ end
+ self.texture_change_time = self.texture_change_time - dtime
+ if self.texture_change_time < 0 then
+ self.texture_change_time = self.texture_change_time + 0.15
+ self.texture_index = self.texture_index + 1
+ if self.texture_index == 5 then
+ self.object:remove()
+ self.frame_object.damage_object = nil
+ self.frame_object:dig()
+ end
+ local ct = "crack_anylength.png^[verticalframe:5:"..self.texture_index
+ self.object:set_properties({textures = {ct, ct, ct, ct, ct, ct}})
+ end
+ end,
+})
+
+mesecon.register_mvps_unmov("technic:frame_entity")
+mesecon.register_mvps_unmov("technic:damage_entity")
+mesecon.register_on_mvps_move(function(moved_nodes)
+ local to_move = {}
+ for _, n in ipairs(moved_nodes) do
+ if frames_pos[pos_to_string(n.oldpos)] ~= nil then
+ to_move[#to_move+1] = {pos = n.pos, oldpos = n.oldpos, name = frames_pos[pos_to_string(n.oldpos)]}
+ frames_pos[pos_to_string(n.oldpos)] = nil
+ end
+ end
+ if #to_move > 0 then
+ for _, t in ipairs(to_move) do
+ frames_pos[pos_to_string(t.pos)] = t.name
+ local objects = minetest.get_objects_inside_radius(t.oldpos, 0.1)
+ for _, obj in ipairs(objects) do
+ local entity = obj:get_luaentity()
+ if entity and (entity.name == "technic:frame_entity" or entity.name == "technic:damage_entity") then
+ obj:setpos(t.pos)
+ end
+ end
+ end
+ end
+end)
+
+minetest.register_on_dignode(function(pos, node)
+ if frames_pos[pos_to_string(pos)] ~= nil then
+ minetest.set_node(pos, {name = frames_pos[pos_to_string(pos)]})
+ frames_pos[pos_to_string(pos)] = nil
+ local objects = minetest.get_objects_inside_radius(pos, 0.1)
+ for _, obj in ipairs(objects) do
+ local entity = obj:get_luaentity()
+ if entity and (entity.name == "technic:frame_entity" or entity.name == "technic:damage_entity") then
+ obj:remove()
+ end
+ end
+ end
+end)
+
+-- Frame motor
+local function connected(pos,c,adj)
+ for _,vect in ipairs(adj) do
+ local pos1=vector.add(pos,vect)
+ local nodename=minetest.get_node(pos1).name
+ if frames_pos[pos_to_string(pos1)] then
+ nodename = frames_pos[pos_to_string(pos1)]
+ end
+ if not(pos_in_list(c,pos1)) and nodename~="air" and
+ (minetest.registered_nodes[nodename].frames_can_connect==nil or
+ minetest.registered_nodes[nodename].frames_can_connect(pos1,vect)) then
+ c[#(c)+1]=pos1
+ if minetest.registered_nodes[nodename].frame==1 then
+ local adj=minetest.registered_nodes[nodename].frame_connect_all(nodename)
+ connected(pos1,c,adj)
+ end
+ end
+ end
+end
+
+local function get_connected_nodes(pos)
+ c={pos}
+ local nodename=minetest.get_node(pos).name
+ if frames_pos[pos_to_string(pos)] then
+ nodename = frames_pos[pos_to_string(pos)]
+ end
+ connected(pos,c,minetest.registered_nodes[nodename].frame_connect_all(nodename))
+ return c
+end
+
+local function frame_motor_on(pos, node)
+ local dirs = {{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}}
+ local nnodepos = vector.add(pos, dirs[math.floor(node.param2/4)+1])
+ local dir = minetest.facedir_to_dir(node.param2)
+ local nnode=minetest.get_node(nnodepos)
+ if frames_pos[pos_to_string(nnodepos)] then
+ nnode.name = frames_pos[pos_to_string(nnodepos)]
+ end
+ local meta = minetest.get_meta(pos)
+ if meta:get_int("last_moved") == minetest.get_gametime() then
+ return
+ end
+ local owner = meta:get_string("owner")
+ if minetest.registered_nodes[nnode.name].frame==1 then
+ local connected_nodes=get_connected_nodes(nnodepos)
+ move_nodes_vect(connected_nodes,dir,pos,owner)
+ end
+ minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime())
+end
+
+minetest.register_node("technic:frame_motor",{
+ description = S("Frame Motor"),
+ tiles = {"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png",
+ "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"},
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
+ paramtype2 = "facedir",
+ mesecons={effector={action_on=frame_motor_on}},
+ after_place_node = function(pos, placer, itemstack)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("owner", placer:get_player_name())
+ end,
+ frames_can_connect=function(pos,dir)
+ local node = minetest.get_node(pos)
+ local dir2 = ({{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}})[math.floor(node.param2/4)+1]
+ return dir2.x~=-dir.x or dir2.y~=-dir.y or dir2.z~=-dir.z
+ end
+})
+
+
+
+-- Templates
+local function template_connected(pos,c,connectors)
+ for _,vect in ipairs({{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}}) do
+ local pos1=vector.add(pos,vect)
+ local nodename=minetest.get_node(pos1).name
+ if not(pos_in_list(c,pos1)) and (nodename=="technic:template" or nodename == "technic:template_connector")then
+ local meta = minetest.get_meta(pos1)
+ if meta:get_string("connected") == "" then
+ c[#(c)+1]=pos1
+ template_connected(pos1,c,connectors)
+ if nodename == "technic:template_connector" then
+ connectors[#connectors+1] = pos1
+ end
+ end
+ end
+ end
+end
+
+local function get_templates(pos)
+ local c = {pos}
+ local connectors
+ if minetest.get_node(pos).name == "technic:template_connector" then
+ connectors = {pos}
+ else
+ connectors = {}
+ end
+ template_connected(pos,c,connectors)
+ return c, connectors
+end
+
+local function swap_template(pos, new)
+ local meta = minetest.get_meta(pos)
+ local saved_node = meta:get_string("saved_node")
+ meta:set_string("saved_node", "")
+ technic.swap_node(pos, new)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("saved_node", saved_node)
+end
+
+local function save_node(pos)
+ local node = minetest.get_node(pos)
+ if node.name == "air" then
+ minetest.set_node(pos, {name="technic:template"})
+ return
+ end
+ if node.name == "technic:template" then
+ swap_template(pos, "technic:template_connector")
+ local meta = minetest.get_meta(pos)
+ meta:set_string("connected", "")
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ local meta0 = meta:to_table()
+ for _, list in pairs(meta0.inventory) do
+ for key, stack in pairs(list) do
+ list[key] = stack:to_string()
+ end
+ end
+ node.meta = meta0
+ minetest.set_node(pos, {name="technic:template"})
+ return node
+end
+
+local function restore_node(pos, node)
+ minetest.set_node(pos, node)
+ local meta = minetest.get_meta(pos)
+ for _, list in pairs(node.meta.inventory) do
+ for key, stack in pairs(list) do
+ list[key] = ItemStack(stack)
+ end
+ end
+ meta:from_table(node.meta)
+end
+
+local function expand_template(pos)
+ local meta = minetest.get_meta(pos)
+ local c = meta:get_string("connected")
+ if c == "" then return end
+ c = minetest.deserialize(c)
+ for _, vect in ipairs(c) do
+ local pos1 = vector.add(pos, vect)
+ local saved_node = save_node(pos1)
+ local meta1 = minetest.get_meta(pos1)
+ if saved_node ~= nil then
+ meta1:set_string("saved_node", minetest.serialize(saved_node))
+ else
+ --meta1:set_string("saved_node", "")
+ end
+ end
+end
+
+local function compress_templates(pos)
+ local templates, connectors = get_templates(pos)
+ if #connectors == 0 then
+ connectors = {pos}
+ end
+ for _, cn in ipairs(connectors) do
+ local meta = minetest.get_meta(cn)
+ local c = {}
+ for _,p in ipairs(templates) do
+ local np = vector.subtract(p, cn)
+ if not pos_in_list(c,np) then
+ c[#c+1] = np
+ end
+ end
+ local cc = {}
+ for _,p in ipairs(connectors) do
+ local np = vector.subtract(p, cn)
+ if (np.x ~= 0 or np.y ~= 0 or np.z ~= 0) then
+ cc[pos_to_string(np)] = true
+ end
+ end
+ swap_template(cn, "technic:template")
+ meta:set_string("connected", minetest.serialize(c))
+ meta:set_string("connectors_connected", minetest.serialize(cc))
+ end
+
+ for _,p in ipairs(templates) do
+ if not pos_in_list(connectors, p) then
+ minetest.set_node(p, {name = "air"})
+ end
+ end
+end
+
+local function template_drops(pos, node, oldmeta, digger)
+ local c = oldmeta.fields.connected
+ local cc = oldmeta.fields.connectors_connected
+ local drops
+ if c == "" or c == nil then
+ drops = {"technic:template 1"}
+ else
+ if cc == "" or cc == nil then
+ drops = {"technic:template 1"}
+ else
+ local dcc = minetest.deserialize(cc)
+ if not table_empty(dcc) then
+ drops = {}
+ for sp, _ in pairs(dcc) do
+ local ssp = pos_from_string(sp)
+ local p = vector.add(ssp, pos)
+ local meta = minetest.get_meta(p)
+ local d = minetest.deserialize(meta:get_string("connectors_connected"))
+ if d ~= nil then
+ d[pos_to_string({x=-ssp.x, y=-ssp.y, z=-ssp.z})] = nil
+ meta:set_string("connectors_connected", minetest.serialize(d))
+ end
+ end
+ else
+ local stack_max = 99
+ local num = #(minetest.deserialize(c))
+ drops = {}
+ while num > stack_max do
+ drops[#drops+1] = "technic:template "..stack_max
+ num = num - stack_max
+ end
+ drops[#drops+1] = "technic:template "..num
+ end
+ end
+ end
+ minetest.handle_node_drops(pos, drops, digger)
+end
+
+local function template_on_destruct(pos, node)
+ local meta = minetest.get_meta(pos)
+ local saved_node = meta:get_string("saved_node")
+ if saved_node ~= "" then
+ local nnode = minetest.deserialize(saved_node)
+ minetest.after(0, restore_node, pos, nnode)
+ end
+end
+
+minetest.register_node("technic:template",{
+ description = S("Template"),
+ tiles = {"technic_mv_cable.png"},
+ drop = "",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
+ on_destruct = template_on_destruct,
+ after_dig_node = template_drops,
+ on_punch = function(pos,node,puncher)
+ swap_template(pos, "technic:template_disabled")
+ end
+})
+
+minetest.register_node("technic:template_disabled",{
+ description = S("Template"),
+ tiles = {"technic_hv_cable.png"},
+ drop = "",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
+ on_destruct = template_on_destruct,
+ after_dig_node = template_drops,
+ on_punch = function(pos,node,puncher)
+ local meta = minetest.get_meta(pos)
+ swap_template(pos, "technic:template_connector")
+ end
+})
+
+minetest.register_node("technic:template_connector",{
+ description = S("Template"),
+ tiles = {"technic_lv_cable.png"},
+ drop = "",
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1},
+ on_destruct = template_on_destruct,
+ after_dig_node = template_drops,
+ on_punch = function(pos,node,puncher)
+ swap_template(pos, "technic:template")
+ end
+})
+
+minetest.register_craftitem("technic:template_replacer",{
+ description = S("Template (replacing)"),
+ inventory_image = "technic_template_replacer.png",
+ on_place = function(itemstack, placer, pointed_thing)
+ local p = pointed_thing.under
+ if minetest.is_protected and minetest.is_protected(p, placer:get_player_name()) then
+ return nil
+ end
+ local node = minetest.get_node(p)
+ if node.name == "technic:template" then return end
+ local saved_node = save_node(p)
+ itemstack:take_item()
+ if saved_node ~= nil then
+ local meta = minetest.get_meta(p)
+ meta:set_string("saved_node", minetest.serialize(saved_node))
+ end
+ return itemstack
+ end
+})
+
+minetest.register_tool("technic:template_tool",{
+ description = S("Template Tool"),
+ inventory_image = "technic_template_tool.png",
+ on_use = function(itemstack, puncher, pointed_thing)
+ local pos = pointed_thing.under
+ if pos == nil or (minetest.is_protected and minetest.is_protected(pos, puncher:get_player_name())) then
+ return nil
+ end
+ local node = minetest.get_node(pos)
+ if node.name ~= "technic:template" and node.name ~= "technic:template_connector" then return end
+ local meta = minetest.get_meta(pos)
+ local c2 = meta:get_string("connected")
+ if c2 ~= "" then
+ expand_template(pos)
+ else
+ compress_templates(pos)
+ end
+
+ end
+})
+
+
+
+-- Template motor
+local function get_template_nodes(pos)
+ local meta = minetest.get_meta(pos)
+ local connected = meta:get_string("connected")
+ if connected == "" then return {} end
+ local adj = minetest.deserialize(connected)
+ local c = {}
+ for _,vect in ipairs(adj) do
+ local pos1=vector.add(pos,vect)
+ local nodename=minetest.get_node(pos1).name
+ if not(pos_in_list(c,pos1)) and nodename~="air" then
+ c[#(c)+1]=pos1
+ end
+ end
+ return c
+end
+
+local function template_motor_on(pos, node)
+ local dirs = {{x=0,y=1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=-1,z=0}}
+ local nnodepos = vector.add(pos, dirs[math.floor(node.param2/4)+1])
+ local dir = minetest.facedir_to_dir(node.param2)
+ local nnode=minetest.get_node(nnodepos)
+ local meta = minetest.get_meta(pos)
+ if meta:get_int("last_moved") == minetest.get_gametime() then
+ return
+ end
+ local owner = meta:get_string("owner")
+ if nnode.name == "technic:template" then
+ local connected_nodes=get_template_nodes(nnodepos)
+ move_nodes_vect(connected_nodes,dir,pos,owner)
+ end
+ minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime())
+end
+
+minetest.register_node("technic:template_motor",{
+ description = S("Template Motor"),
+ tiles = {"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png",
+ "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"},
+ groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
+ paramtype2 = "facedir",
+ mesecons={effector={action_on=template_motor_on}},
+ after_place_node = function(pos, placer, itemstack)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("owner", placer:get_player_name())
+ end,
+})
+
+-- Crafts
+minetest.register_craft({
+ output = 'technic:frame_111111',
+ recipe = {
+ {'', 'default:stick', ''},
+ {'default:stick', 'technic:brass_ingot', 'default:stick'},
+ {'', 'default:stick', ''},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:frame_motor',
+ recipe = {
+ {'', 'technic:frame_111111', ''},
+ {'group:mesecon_conductor_craftable', 'technic:motor', 'group:mesecon_conductor_craftable'},
+ {'', 'technic:frame_111111', ''},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:template 10',
+ recipe = {
+ {'', 'technic:brass_ingot', ''},
+ {'technic:brass_ingot', 'default:mese_crystal', 'technic:brass_ingot'},
+ {'', 'technic:brass_ingot', ''},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:template_replacer',
+ recipe = {{'technic:template'}}
+})
+
+minetest.register_craft({
+ output = 'technic:template',
+ recipe = {{'technic:template_replacer'}}
+})
+
+minetest.register_craft({
+ output = 'technic:template_motor',
+ recipe = {
+ {'', 'technic:template', ''},
+ {'group:mesecon_conductor_craftable', 'technic:motor', 'group:mesecon_conductor_craftable'},
+ {'', 'technic:template', ''},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:template_tool',
+ recipe = {
+ {'', 'technic:template', ''},
+ {'default:mese_crystal', 'default:stick', 'default:mese_crystal'},
+ {'', 'default:stick', ''},
+ }
+})
diff --git a/technic/technic/machines/other/init.lua b/technic/technic/machines/other/init.lua
new file mode 100644
index 0000000..f4a82f0
--- /dev/null
+++ b/technic/technic/machines/other/init.lua
@@ -0,0 +1,15 @@
+local path = technic.modpath.."/machines/other"
+
+-- mesecons and tubes related
+dofile(path.."/injector.lua")
+dofile(path.."/constructor.lua")
+
+if technic.config:get_bool("enable_frames") and minetest.get_modpath("mesecons_mvps") ~= nil then
+ dofile(path.."/frames.lua")
+end
+
+-- Coal-powered machines
+dofile(path.."/coal_alloy_furnace.lua")
+dofile(path.."/coal_furnace.lua")
+
+dofile(path.."/anchor.lua")
diff --git a/technic/technic/machines/other/injector.lua b/technic/technic/machines/other/injector.lua
new file mode 100644
index 0000000..ec8966c
--- /dev/null
+++ b/technic/technic/machines/other/injector.lua
@@ -0,0 +1,118 @@
+
+local S = technic.getter
+
+local function inject_items (pos)
+ local meta=minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local mode=meta:get_string("mode")
+ if mode=="single items" then
+ local i=0
+ for _,stack in ipairs(inv:get_list("main")) do
+ i=i+1
+ if stack then
+ local item0=stack:to_table()
+ if item0 then
+ item0["count"] = "1"
+ technic.tube_inject_item(pos, pos, vector.new(0, -1, 0), item0)
+ stack:take_item(1)
+ inv:set_stack("main", i, stack)
+ return
+ end
+ end
+ end
+ end
+ if mode=="whole stacks" then
+ local i=0
+ for _,stack in ipairs(inv:get_list("main")) do
+ i=i+1
+ if stack then
+ local item0=stack:to_table()
+ if item0 then
+ technic.tube_inject_item(pos, pos, vector.new(0, -1, 0), item0)
+ stack:clear()
+ inv:set_stack("main", i, stack)
+ return
+ end
+ end
+ end
+ end
+
+end
+
+minetest.register_craft({
+ output = 'technic:injector 1',
+ recipe = {
+ {'', 'technic:control_logic_unit',''},
+ {'', 'default:chest',''},
+ {'', 'pipeworks:tube_1',''},
+ }
+})
+
+local function set_injector_formspec(meta)
+ local is_stack = meta:get_string("mode") == "whole stacks"
+ meta:set_string("formspec",
+ "invsize[8,9;]"..
+ "item_image[0,0;1,1;technic:injector]"..
+ "label[1,0;"..S("Self-Contained Injector").."]"..
+ (is_stack and
+ "button[0,1;2,1;mode_item;"..S("Stackwise").."]" or
+ "button[0,1;2,1;mode_stack;"..S("Itemwise").."]")..
+ "list[current_name;main;0,2;8,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[]")
+end
+
+minetest.register_node("technic:injector", {
+ description = S("Self-Contained Injector"),
+ tiles = {"technic_injector_top.png", "technic_injector_bottom.png", "technic_injector_side.png",
+ "technic_injector_side.png", "technic_injector_side.png", "technic_injector_side.png"},
+ groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, tubedevice=1, tubedevice_receiver=1},
+ tube = {
+ can_insert = function(pos, node, stack, direction)
+ return minetest.get_meta(pos):get_inventory():room_for_item("main",stack)
+ end,
+ insert_object = function(pos, node, stack, direction)
+ return minetest.get_meta(pos):get_inventory():add_item("main",stack)
+ end,
+ connect_sides = {left=1, right=1, front=1, back=1, top=1, bottom=1},
+ },
+ sounds = default.node_sound_wood_defaults(),
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("Self-Contained Injector"))
+ local inv = meta:get_inventory()
+ inv:set_size("main", 8*4)
+ meta:set_string("mode","single items")
+ set_injector_formspec(meta)
+ end,
+ can_dig = function(pos,player)
+ local meta = minetest.get_meta(pos);
+ local inv = meta:get_inventory()
+ return inv:is_empty("main")
+ end,
+ on_receive_fields = function(pos, formanme, fields, sender)
+ local meta = minetest.get_meta(pos)
+ if fields.mode_item then meta:set_string("mode", "single items") end
+ if fields.mode_stack then meta:set_string("mode", "whole stacks") end
+ set_injector_formspec(meta)
+ end,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ after_place_node = pipeworks.after_place,
+ after_dig_node = pipeworks.after_dig
+})
+
+minetest.register_abm({
+ nodenames = {"technic:injector"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ local pos1 = vector.add(pos, vector.new(0, -1, 0))
+ local node1 = minetest.get_node(pos1)
+ if minetest.get_item_group(node1.name, "tubedevice") > 0 then
+ inject_items(pos)
+ end
+ end,
+})
+
diff --git a/technic/technic/machines/register/alloy_furnace.lua b/technic/technic/machines/register/alloy_furnace.lua
new file mode 100644
index 0000000..879e528
--- /dev/null
+++ b/technic/technic/machines/register/alloy_furnace.lua
@@ -0,0 +1,10 @@
+
+local S = technic.getter
+
+function technic.register_alloy_furnace(data)
+ data.typename = "alloy"
+ data.machine_name = "alloy_furnace"
+ data.machine_desc = S("%s Alloy Furnace")
+ technic.register_base_machine(data)
+end
+
diff --git a/technic/technic/machines/register/alloy_recipes.lua b/technic/technic/machines/register/alloy_recipes.lua
new file mode 100644
index 0000000..bd09bd6
--- /dev/null
+++ b/technic/technic/machines/register/alloy_recipes.lua
@@ -0,0 +1,35 @@
+
+local S = technic.getter
+
+technic.register_recipe_type("alloy", {
+ description = S("Alloying"),
+ input_size = 2,
+})
+
+function technic.register_alloy_recipe(data)
+ data.time = data.time or 6
+ technic.register_recipe("alloy", data)
+end
+
+local recipes = {
+ {"technic:copper_dust 3", "technic:tin_dust", "technic:bronze_dust 4"},
+ {"default:copper_ingot 3", "moreores:tin_ingot", "default:bronze_ingot 4"},
+ {"technic:wrought_iron_dust", "technic:coal_dust", "technic:carbon_steel_dust", 3},
+ {"technic:wrought_iron_ingot", "technic:coal_dust", "technic:carbon_steel_ingot", 3},
+ {"technic:carbon_steel_dust", "technic:coal_dust", "technic:cast_iron_dust", 3},
+ {"technic:carbon_steel_ingot", "technic:coal_dust", "technic:cast_iron_ingot", 3},
+ {"technic:carbon_steel_dust 3", "technic:chromium_dust", "technic:stainless_steel_dust 4"},
+ {"technic:carbon_steel_ingot 3", "technic:chromium_ingot", "technic:stainless_steel_ingot 4"},
+ {"technic:copper_dust 2", "technic:zinc_dust", "technic:brass_dust 3"},
+ {"default:copper_ingot 2", "technic:zinc_ingot", "technic:brass_ingot 3"},
+ {"default:sand 2", "technic:coal_dust 2", "technic:silicon_wafer"},
+ {"technic:silicon_wafer", "technic:gold_dust", "technic:doped_silicon_wafer"},
+ -- from https://en.wikipedia.org/wiki/Carbon_black
+ -- The highest volume use of carbon black is as a reinforcing filler in rubber products, especially tires.
+ -- "[Compounding a] pure gum vulcanizate … with 50% of its weight of carbon black improves its tensile strength and wear resistance …"
+ {"technic:raw_latex 4", "technic:coal_dust 2", "technic:rubber 6", 2},
+}
+
+for _, data in pairs(recipes) do
+ technic.register_alloy_recipe({input = {data[1], data[2]}, output = data[3], time = data[4]})
+end
diff --git a/technic/technic/machines/register/battery_box.lua b/technic/technic/machines/register/battery_box.lua
new file mode 100644
index 0000000..82edca0
--- /dev/null
+++ b/technic/technic/machines/register/battery_box.lua
@@ -0,0 +1,291 @@
+
+local S = technic.getter
+
+technic.register_power_tool("technic:battery", 10000)
+technic.register_power_tool("technic:red_energy_crystal", 50000)
+technic.register_power_tool("technic:green_energy_crystal", 150000)
+technic.register_power_tool("technic:blue_energy_crystal", 450000)
+
+minetest.register_craft({
+ output = 'technic:battery',
+ recipe = {
+ {'group:wood', 'default:copper_ingot', 'group:wood'},
+ {'group:wood', 'moreores:tin_ingot', 'group:wood'},
+ {'group:wood', 'default:copper_ingot', 'group:wood'},
+ }
+})
+
+minetest.register_tool("technic:battery", {
+ description = S("RE Battery"),
+ inventory_image = "technic_battery.png",
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ tool_capabilities = {
+ charge = 0,
+ max_drop_level = 0,
+ groupcaps = {
+ fleshy = {times={}, uses=10000, maxlevel=0}
+ }
+ }
+})
+
+local tube = {
+ insert_object = function(pos, node, stack, direction)
+ if direction.y == 0 then
+ return stack
+ end
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ if direction.y > 0 then
+ return inv:add_item("src", stack)
+ else
+ return inv:add_item("dst", stack)
+ end
+ end,
+ can_insert = function(pos, node, stack, direction)
+ if direction.y == 0 then
+ return false
+ end
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ if direction.y > 0 then
+ return inv:room_for_item("src", stack)
+ else
+ return inv:room_for_item("dst", stack)
+ end
+ end,
+ connect_sides = {left=1, right=1, back=1, top=1, bottom=1},
+}
+
+function technic.register_battery_box(data)
+ local tier = data.tier
+ local ltier = string.lower(tier)
+
+ local 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;"..S("%s Battery Box"):format(tier).."]"..
+ "label[3,0;"..S("Charge").."]"..
+ "label[5,0;"..S("Discharge").."]"..
+ "label[1,3;"..S("Power level").."]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "listring[current_name;dst]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]"
+
+ if data.upgrade then
+ formspec = formspec..
+ "list[current_name;upgrade1;3.5,3;1,1;]"..
+ "list[current_name;upgrade2;4.5,3;1,1;]"..
+ "label[3.5,4;"..S("Upgrade Slots").."]"..
+ "listring[current_name;upgrade1]"..
+ "listring[current_player;main]"..
+ "listring[current_name;upgrade2]"..
+ "listring[current_player;main]"
+ end
+
+ local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local eu_input = meta:get_int(tier.."_EU_input")
+ local current_charge = meta:get_int("internal_EU_charge")
+
+ local EU_upgrade, tube_upgrade = 0, 0
+ if data.upgrade then
+ EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
+ end
+ local max_charge = data.max_charge * (1 + EU_upgrade / 10)
+
+ -- Charge/discharge the battery with the input EUs
+ if eu_input >= 0 then
+ current_charge = math.min(current_charge + eu_input, max_charge)
+ else
+ current_charge = math.max(current_charge + eu_input, 0)
+ end
+
+ -- Charging/discharging tools here
+ local tool_full, tool_empty
+ current_charge, tool_full = technic.charge_tools(meta,
+ current_charge, data.charge_step)
+ current_charge, tool_empty = technic.discharge_tools(meta,
+ current_charge, data.discharge_step,
+ max_charge)
+
+ if data.tube then
+ local inv = meta:get_inventory()
+ technic.handle_machine_pipeworks(pos, tube_upgrade,
+ function(pos, x_velocity, z_velocity)
+ if tool_full and not inv:is_empty("src") then
+ technic.send_items(pos, x_velocity, z_velocity, "src")
+ elseif tool_empty and not inv:is_empty("dst") then
+ technic.send_items(pos, x_velocity, z_velocity, "dst")
+ end
+ end)
+ end
+
+ -- We allow batteries to charge on less than the demand
+ meta:set_int(tier.."_EU_demand",
+ math.min(data.charge_rate, max_charge - current_charge))
+ meta:set_int(tier.."_EU_supply",
+ math.min(data.discharge_rate, current_charge))
+ meta:set_int("internal_EU_charge", current_charge)
+
+ -- Select node textures
+ local charge_count = math.ceil((current_charge / max_charge) * 8)
+ charge_count = math.min(charge_count, 8)
+ charge_count = math.max(charge_count, 0)
+ local last_count = meta:get_float("last_side_shown")
+ if charge_count ~= last_count then
+ technic.swap_node(pos,"technic:"..ltier.."_battery_box"..charge_count)
+ meta:set_float("last_side_shown", charge_count)
+ end
+
+ local charge_percent = math.floor(current_charge / max_charge * 100)
+ meta:set_string("formspec",
+ formspec..
+ "image[1,1;1,2;technic_power_meter_bg.png"
+ .."^[lowpart:"..charge_percent
+ ..":technic_power_meter_fg.png]")
+
+ local infotext = S("@1 Battery Box: @2/@3", tier,
+ technic.prettynum(current_charge), technic.prettynum(max_charge))
+ if eu_input == 0 then
+ infotext = S("%s Idle"):format(infotext)
+ end
+ meta:set_string("infotext", infotext)
+ end
+
+ for i = 0, 8 do
+ local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1}
+ if i ~= 0 then
+ groups.not_in_creative_inventory = 1
+ end
+
+ if data.tube then
+ groups.tubedevice = 1
+ groups.tubedevice_receiver = 1
+ end
+
+ minetest.register_node("technic:"..ltier.."_battery_box"..i, {
+ description = S("%s Battery Box"):format(tier),
+ tiles = {"technic_"..ltier.."_battery_box_top.png",
+ "technic_"..ltier.."_battery_box_bottom.png",
+ "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
+ "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
+ "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png",
+ "technic_"..ltier.."_battery_box_side.png^technic_power_meter"..i..".png"},
+ groups = groups,
+ tube = data.tube and tube or nil,
+ paramtype2 = "facedir",
+ sounds = default.node_sound_wood_defaults(),
+ drop = "technic:"..ltier.."_battery_box0",
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local node = minetest.get_node(pos)
+
+ meta:set_string("infotext", S("%s Battery Box"):format(tier))
+ meta:set_string("formspec", formspec)
+ meta:set_int(tier.."_EU_demand", 0)
+ meta:set_int(tier.."_EU_supply", 0)
+ meta:set_int(tier.."_EU_input", 0)
+ meta:set_float("internal_EU_charge", 0)
+ inv:set_size("src", 1)
+ inv:set_size("dst", 1)
+ inv:set_size("upgrade1", 1)
+ inv:set_size("upgrade2", 1)
+ end,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ technic_run = run,
+ after_place_node = data.tube and pipeworks.after_place,
+ after_dig_node = technic.machine_after_dig_node
+ })
+ end
+
+ -- Register as a battery type
+ -- Battery type machines function as power reservoirs and can both receive and give back power
+ for i = 0, 8 do
+ technic.register_machine(tier, "technic:"..ltier.."_battery_box"..i, technic.battery)
+ end
+
+end -- End registration
+
+
+function technic.charge_tools(meta, batt_charge, charge_step)
+ local inv = meta:get_inventory()
+ if inv:is_empty("src") then
+ return batt_charge, false
+ end
+ local src_stack = inv:get_stack("src", 1)
+
+ local tool_name = src_stack:get_name()
+ if not technic.power_tools[tool_name] then
+ return batt_charge, false
+ end
+ -- Set meta data for the tool if it didn't do it itself
+ local src_meta = minetest.deserialize(src_stack:get_metadata()) or {}
+ if not src_meta.charge then
+ src_meta.charge = 0
+ end
+ -- Do the charging
+ local item_max_charge = technic.power_tools[tool_name]
+ local tool_charge = src_meta.charge
+ if tool_charge >= item_max_charge then
+ return batt_charge, true
+ elseif batt_charge <= 0 then
+ return batt_charge, false
+ end
+ charge_step = math.min(charge_step, batt_charge)
+ charge_step = math.min(charge_step, item_max_charge - tool_charge)
+ tool_charge = tool_charge + charge_step
+ batt_charge = batt_charge - charge_step
+ technic.set_RE_wear(src_stack, tool_charge, item_max_charge)
+ src_meta.charge = tool_charge
+ src_stack:set_metadata(minetest.serialize(src_meta))
+ inv:set_stack("src", 1, src_stack)
+ return batt_charge, (tool_charge == item_max_charge)
+end
+
+
+function technic.discharge_tools(meta, batt_charge, charge_step, max_charge)
+ local inv = meta:get_inventory()
+ if inv:is_empty("dst") then
+ return batt_charge, false
+ end
+ srcstack = inv:get_stack("dst", 1)
+ local toolname = srcstack:get_name()
+ if technic.power_tools[toolname] == nil then
+ return batt_charge, false
+ end
+ -- Set meta data for the tool if it didn't do it itself :-(
+ local src_meta = minetest.deserialize(srcstack:get_metadata())
+ src_meta = src_meta or {}
+ if not src_meta.charge then
+ src_meta.charge = 0
+ end
+
+ -- Do the discharging
+ local item_max_charge = technic.power_tools[toolname]
+ local tool_charge = src_meta.charge
+ if tool_charge <= 0 then
+ return batt_charge, true
+ elseif batt_charge >= max_charge then
+ return batt_charge, false
+ end
+ charge_step = math.min(charge_step, max_charge - batt_charge)
+ charge_step = math.min(charge_step, tool_charge)
+ tool_charge = tool_charge - charge_step
+ batt_charge = batt_charge + charge_step
+ technic.set_RE_wear(srcstack, tool_charge, item_max_charge)
+ src_meta.charge = tool_charge
+ srcstack:set_metadata(minetest.serialize(src_meta))
+ inv:set_stack("dst", 1, srcstack)
+ return batt_charge, (tool_charge == 0)
+end
+
diff --git a/technic/technic/machines/register/cables.lua b/technic/technic/machines/register/cables.lua
new file mode 100644
index 0000000..a1e7bc8
--- /dev/null
+++ b/technic/technic/machines/register/cables.lua
@@ -0,0 +1,177 @@
+
+local S = technic.getter
+
+local cable_itstr_to_tier = {}
+
+function technic.register_cable(tier, size)
+ local ltier = string.lower(tier)
+
+ for x1 = 0, 1 do
+ for x2 = 0, 1 do
+ for y1 = 0, 1 do
+ for y2 = 0, 1 do
+ for z1 = 0, 1 do
+ for z2 = 0, 1 do
+ local id = technic.get_cable_id({x1, x2, y1, y2, z1, z2})
+
+ cable_itstr_to_tier["technic:"..ltier.."_cable"..id] = tier
+
+ local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}
+ if id ~= 0 then
+ groups.not_in_creative_inventory = 1
+ end
+
+ minetest.register_node("technic:"..ltier.."_cable"..id, {
+ description = S("%s Cable"):format(tier),
+ tiles = {"technic_"..ltier.."_cable.png"},
+ inventory_image = "technic_"..ltier.."_cable_wield.png",
+ wield_image = "technic_"..ltier.."_cable_wield.png",
+ groups = groups,
+ sounds = default.node_sound_wood_defaults(),
+ drop = "technic:"..ltier.."_cable0",
+ paramtype = "light",
+ sunlight_propagates = true,
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = technic.gen_cable_nodebox(x1, y1, z1, x2, y2, z2, size)
+ },
+ on_construct = function()
+ technic.networks = {}
+ end,
+ on_destruct = function()
+ technic.networks = {}
+ end,
+ after_place_node = function(pos)
+ local node = minetest.get_node(pos)
+ technic.update_cables(pos, technic.get_cable_tier(node.name))
+ end,
+ after_dig_node = function(pos, oldnode)
+ local tier = technic.get_cable_tier(oldnode.name)
+ technic.update_cables(pos, tier, true)
+ end
+ })
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+minetest.register_on_placenode(function(pos, node)
+ for tier, machine_list in pairs(technic.machines) do
+ if machine_list[node.name] ~= nil then
+ technic.update_cables(pos, tier, true)
+ technic.networks = {}
+ end
+ end
+end)
+
+
+minetest.register_on_dignode(function(pos, node)
+ for tier, machine_list in pairs(technic.machines) do
+ if machine_list[node.name] ~= nil then
+ technic.update_cables(pos, tier, true)
+ technic.networks = {}
+ end
+ end
+end)
+
+function technic.get_cable_id(links)
+ return (links[6] * 1) + (links[5] * 2)
+ + (links[4] * 4) + (links[3] * 8)
+ + (links[2] * 16) + (links[1] * 32)
+end
+
+function technic.update_cables(pos, tier, no_set, secondrun)
+ local link_positions = {
+ {x=pos.x+1, y=pos.y, z=pos.z},
+ {x=pos.x-1, y=pos.y, z=pos.z},
+ {x=pos.x, y=pos.y+1, z=pos.z},
+ {x=pos.x, y=pos.y-1, z=pos.z},
+ {x=pos.x, y=pos.y, z=pos.z+1},
+ {x=pos.x, y=pos.y, z=pos.z-1}}
+
+ local links = {0, 0, 0, 0, 0, 0}
+
+ for i, link_pos in pairs(link_positions) do
+ local connect_type = technic.cables_should_connect(pos, link_pos, tier)
+ if connect_type then
+ links[i] = 1
+ -- Have cables next to us update theirselves,
+ -- but only once. (We don't want to update the entire
+ -- network or start an infinite loop of updates)
+ if not secondrun and connect_type == "cable" then
+ technic.update_cables(link_pos, tier, false, true)
+ end
+ end
+ end
+ -- We don't want to set ourselves if we have been removed or we are
+ -- updating a machine
+ if not no_set then
+ minetest.set_node(pos, {name="technic:"..string.lower(tier)
+ .."_cable"..technic.get_cable_id(links)})
+
+ end
+end
+
+
+function technic.is_tier_cable(name, tier)
+ return cable_itstr_to_tier[name] and cable_itstr_to_tier[name] == tier
+end
+
+
+function technic.get_cable_tier(name)
+ return cable_itstr_to_tier[name]
+end
+
+
+function technic.cables_should_connect(pos1, pos2, tier)
+ local name = minetest.get_node(pos2).name
+
+ if name == "technic:switching_station" then
+ return pos2.y == pos1.y + 1 and "machine" or false
+ elseif name == "technic:supply_converter" then
+ return math.abs(pos2.y - pos1.y) == 1 and "machine" or false
+ elseif technic.is_tier_cable(name, tier) then
+ return "cable"
+ elseif technic.machines[tier][name] then
+ return "machine"
+ end
+ return false
+end
+
+
+function technic.gen_cable_nodebox(x1, y1, z1, x2, y2, z2, size)
+ -- Nodeboxes
+ local box_center = {-size, -size, -size, size, size, size}
+ local box_y1 = {-size, -size, -size, size, 0.5, size} -- y+
+ local box_x1 = {-size, -size, -size, 0.5, size, size} -- x+
+ local box_z1 = {-size, -size, size, size, size, 0.5} -- z+
+ local box_z2 = {-size, -size, -0.5, size, size, size} -- z-
+ local box_y2 = {-size, -0.5, -size, size, size, size} -- y-
+ local box_x2 = {-0.5, -size, -size, size, size, size} -- x-
+
+ local box = {box_center}
+ if x1 == 1 then
+ table.insert(box, box_x1)
+ end
+ if y1 == 1 then
+ table.insert(box, box_y1)
+ end
+ if z1 == 1 then
+ table.insert(box, box_z1)
+ end
+ if x2 == 1 then
+ table.insert(box, box_x2)
+ end
+ if y2 == 1 then
+ table.insert(box, box_y2)
+ end
+ if z2 == 1 then
+ table.insert(box, box_z2)
+ end
+ return box
+end
+
diff --git a/technic/technic/machines/register/centrifuge.lua b/technic/technic/machines/register/centrifuge.lua
new file mode 100644
index 0000000..dd05977
--- /dev/null
+++ b/technic/technic/machines/register/centrifuge.lua
@@ -0,0 +1,8 @@
+local S = technic.getter
+
+function technic.register_centrifuge(data)
+ data.typename = "separating"
+ data.machine_name = "centrifuge"
+ data.machine_desc = S("%s Centrifuge")
+ technic.register_base_machine(data)
+end
diff --git a/technic/technic/machines/register/centrifuge_recipes.lua b/technic/technic/machines/register/centrifuge_recipes.lua
new file mode 100644
index 0000000..05642f5
--- /dev/null
+++ b/technic/technic/machines/register/centrifuge_recipes.lua
@@ -0,0 +1,38 @@
+local S = technic.getter
+
+technic.register_recipe_type("separating", {
+ description = S("Separating"),
+ output_size = 2,
+})
+
+function technic.register_separating_recipe(data)
+ data.time = data.time or 10
+ technic.register_recipe("separating", data)
+end
+
+local recipes = {
+ { "technic:bronze_dust 4", "technic:copper_dust 3", "technic:tin_dust" },
+ { "technic:stainless_steel_dust 4", "technic:wrought_iron_dust 3", "technic:chromium_dust" },
+ { "technic:brass_dust 3", "technic:copper_dust 2", "technic:zinc_dust" },
+}
+
+local function uranium_dust(p)
+ return "technic:uranium"..(p == 7 and "" or p).."_dust"
+end
+for p = 1, 34 do
+ table.insert(recipes, { uranium_dust(p).." 2", uranium_dust(p-1), uranium_dust(p+1) })
+end
+
+if minetest.get_modpath("bushes_classic") then
+ for _, berry in ipairs({ "blackberry", "blueberry", "gooseberry", "raspberry", "strawberry" }) do
+ table.insert(recipes, { "bushes:"..berry.."_bush", "default:stick 20", "bushes:"..berry.." 4" })
+ end
+end
+
+if minetest.get_modpath("farming") then
+ table.insert(recipes, { "farming:wheat 4", "farming:seed_wheat 3", "default:dry_shrub 1" })
+end
+
+for _, data in pairs(recipes) do
+ technic.register_separating_recipe({ input = { data[1] }, output = { data[2], data[3] } })
+end
diff --git a/technic/technic/machines/register/common.lua b/technic/technic/machines/register/common.lua
new file mode 100644
index 0000000..ce0eee6
--- /dev/null
+++ b/technic/technic/machines/register/common.lua
@@ -0,0 +1,214 @@
+
+local S = technic.getter
+
+-- handles the machine upgrades every tick
+function technic.handle_machine_upgrades(meta)
+ -- Get the names of the upgrades
+ local inv = meta:get_inventory()
+
+ local srcstack = inv:get_stack("upgrade1", 1)
+ local upg_item1 = srcstack and srcstack:get_name()
+
+ srcstack = inv:get_stack("upgrade2", 1)
+ local upg_item2 = srcstack and srcstack:get_name()
+
+ -- Save some power by installing battery upgrades.
+ -- Tube loading speed can be upgraded using control logic units.
+ local EU_upgrade = 0
+ local tube_upgrade = 0
+
+ if upg_item1 == "technic:control_logic_unit" then
+ tube_upgrade = tube_upgrade + 1
+ elseif upg_item1 == "technic:battery" then
+ EU_upgrade = EU_upgrade + 1
+ end
+
+ if upg_item2 == "technic:control_logic_unit" then
+ tube_upgrade = tube_upgrade + 1
+ elseif upg_item2 == "technic:battery" then
+ EU_upgrade = EU_upgrade + 1
+ end
+
+ return EU_upgrade, tube_upgrade
+end
+
+-- handles the machine upgrades when set or removed
+local function on_machine_upgrade(meta, stack)
+ local stack_name = stack:get_name()
+ if stack_name == "default:chest" then
+ meta:set_int("public", 1)
+ return 1
+ elseif stack_name ~= "technic:control_logic_unit"
+ and stack_name ~= "technic:battery" then
+ return 0
+ end
+ return 1
+end
+
+-- something is about to be removed
+local function on_machine_downgrade(meta, stack, list)
+ if stack:get_name() == "default:chest" then
+ local inv = meta:get_inventory()
+ local upg1, upg2 = inv:get_stack("upgrade1", 1), inv:get_stack("upgrade2", 1)
+
+ -- only set 0 if theres not a nother chest in the other list too
+ if (not upg1 or not upg2 or upg1:get_name() ~= upg2:get_name()) then
+ meta:set_int("public", 0)
+ end
+ end
+ return 1
+end
+
+
+function technic.send_items(pos, x_velocity, z_velocity, output_name)
+ -- Send items on their way in the pipe system.
+ if output_name == nil then
+ output_name = "dst"
+ end
+
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local i = 0
+ for _, stack in ipairs(inv:get_list(output_name)) do
+ i = i + 1
+ if stack then
+ local item0 = stack:to_table()
+ if item0 then
+ item0["count"] = "1"
+ technic.tube_inject_item(pos, pos, vector.new(x_velocity, 0, z_velocity), item0)
+ stack:take_item(1)
+ inv:set_stack(output_name, i, stack)
+ return
+ end
+ end
+ end
+end
+
+
+function technic.smelt_item(meta, result, speed)
+ local inv = meta:get_inventory()
+ meta:set_int("cook_time", meta:get_int("cook_time") + 1)
+ if meta:get_int("cook_time") < result.time / speed then
+ return
+ end
+ local result
+ local afterfuel
+ result, afterfuel = minetest.get_craft_result({method = "cooking", width = 1, items = inv:get_list("src")})
+
+ if result and result.item then
+ meta:set_int("cook_time", 0)
+ -- check if there's room for output in "dst" list
+ if inv:room_for_item("dst", result.item) then
+ inv:set_stack("src", 1, afterfuel.items[1])
+ inv:add_item("dst", result.item)
+ end
+ end
+end
+
+function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function)
+ if send_function == nil then
+ send_function = technic.send_items
+ end
+
+ local node = minetest.get_node(pos)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local pos1 = vector.new(pos)
+ local x_velocity = 0
+ local z_velocity = 0
+
+ -- Output is on the left side of the furnace
+ if node.param2 == 3 then pos1.z = pos1.z - 1 z_velocity = -1 end
+ if node.param2 == 2 then pos1.x = pos1.x - 1 x_velocity = -1 end
+ if node.param2 == 1 then pos1.z = pos1.z + 1 z_velocity = 1 end
+ if node.param2 == 0 then pos1.x = pos1.x + 1 x_velocity = 1 end
+
+ local output_tube_connected = false
+ local node1 = minetest.get_node(pos1)
+ if minetest.get_item_group(node1.name, "tubedevice") > 0 then
+ output_tube_connected = true
+ end
+ local tube_time = meta:get_int("tube_time") + tube_upgrade
+ if tube_time >= 2 then
+ tube_time = 0
+ if output_tube_connected then
+ send_function(pos, x_velocity, z_velocity)
+ end
+ end
+ meta:set_int("tube_time", tube_time)
+end
+
+function technic.machine_can_dig(pos, player)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ if not inv:is_empty("src") or not inv:is_empty("dst") then
+ if player then
+ minetest.chat_send_player(player:get_player_name(),
+ S("Machine cannot be removed because it is not empty"))
+ end
+ return false
+ end
+
+ return true
+end
+
+function technic.machine_after_dig_node(pos, oldnode, oldmetadata, player)
+ if oldmetadata.inventory then
+ if oldmetadata.inventory.upgrade1 and oldmetadata.inventory.upgrade1[1] then
+ local stack = ItemStack(oldmetadata.inventory.upgrade1[1])
+ if not stack:is_empty() then
+ minetest.item_drop(stack, "", pos)
+ end
+ end
+ if oldmetadata.inventory.upgrade2 and oldmetadata.inventory.upgrade2[1] then
+ local stack = ItemStack(oldmetadata.inventory.upgrade2[1])
+ if not stack:is_empty() then
+ minetest.item_drop(stack, "", pos)
+ end
+ end
+ end
+
+ if minetest.registered_nodes[oldnode.name].tube then
+ pipeworks.after_dig(pos, oldnode, oldmetadata, player)
+ end
+end
+
+local function inv_change(pos, player, count, from_list, to_list, stack)
+ local playername = player:get_player_name()
+ local meta = minetest.get_meta(pos);
+ local public = (meta:get_int("public") == 1)
+ local to_upgrade = to_list == "upgrade1" or to_list == "upgrade2"
+ local from_upgrade = from_list == "upgrade1" or from_list == "upgrade2"
+
+ if (not public or to_upgrade or from_upgrade) and minetest.is_protected(pos, playername) then
+ minetest.chat_send_player(playername, S("Inventory move disallowed due to protection"))
+ return 0
+ end
+ if to_upgrade then
+ -- only place a single item into it, if it's empty
+ local empty = meta:get_inventory():is_empty(to_list)
+ if empty then
+ return on_machine_upgrade(meta, stack)
+ end
+ return 0
+ elseif from_upgrade then
+ -- only called on take (not move)
+ on_machine_downgrade(meta, stack, from_list)
+ end
+ return count
+end
+
+function technic.machine_inventory_put(pos, listname, index, stack, player)
+ return inv_change(pos, player, stack:get_count(), nil, listname, stack)
+end
+
+function technic.machine_inventory_take(pos, listname, index, stack, player)
+ return inv_change(pos, player, stack:get_count(), listname, nil, stack)
+end
+
+function technic.machine_inventory_move(pos, from_list, from_index,
+ to_list, to_index, count, player)
+ local stack = minetest.get_meta(pos):get_inventory():get_stack(from_list, from_index)
+ return inv_change(pos, player, count, from_list, to_list, stack)
+end
+
diff --git a/technic/technic/machines/register/compressor.lua b/technic/technic/machines/register/compressor.lua
new file mode 100644
index 0000000..49830d7
--- /dev/null
+++ b/technic/technic/machines/register/compressor.lua
@@ -0,0 +1,9 @@
+
+local S = technic.getter
+
+function technic.register_compressor(data)
+ data.typename = "compressing"
+ data.machine_name = "compressor"
+ data.machine_desc = S("%s Compressor")
+ technic.register_base_machine(data)
+end
diff --git a/technic/technic/machines/register/compressor_recipes.lua b/technic/technic/machines/register/compressor_recipes.lua
new file mode 100644
index 0000000..872be04
--- /dev/null
+++ b/technic/technic/machines/register/compressor_recipes.lua
@@ -0,0 +1,34 @@
+
+local S = technic.getter
+
+technic.register_recipe_type("compressing", { description = S("Compressing") })
+
+function technic.register_compressor_recipe(data)
+ data.time = data.time or 4
+ technic.register_recipe("compressing", data)
+end
+
+local recipes = {
+ {"default:snowblock", "default:ice"},
+ {"default:sand 2", "default:sandstone"},
+ {"default:desert_sand", "default:desert_stone"},
+ {"technic:mixed_metal_ingot", "technic:composite_plate"},
+ {"default:copper_ingot 5", "technic:copper_plate"},
+ {"technic:coal_dust 4", "technic:graphite"},
+ {"technic:carbon_cloth", "technic:carbon_plate"},
+ {"technic:uranium35_ingot 5", "technic:uranium_fuel"},
+}
+
+-- defuse the default sandstone recipe, since we have the compressor to take over in a more realistic manner
+minetest.register_craft({
+ output = "default:sand 0",
+ recipe = {
+ {'group:sand', 'group:sand'},
+ {'group:sand', 'group:sand'}
+ },
+})
+
+for _, data in pairs(recipes) do
+ technic.register_compressor_recipe({input = {data[1]}, output = data[2]})
+end
+
diff --git a/technic/technic/machines/register/electric_furnace.lua b/technic/technic/machines/register/electric_furnace.lua
new file mode 100644
index 0000000..44de16c
--- /dev/null
+++ b/technic/technic/machines/register/electric_furnace.lua
@@ -0,0 +1,9 @@
+
+local S = technic.getter
+
+function technic.register_electric_furnace(data)
+ data.typename = "cooking"
+ data.machine_name = "electric_furnace"
+ data.machine_desc = S("%s Furnace")
+ technic.register_base_machine(data)
+end
diff --git a/technic/technic/machines/register/extractor.lua b/technic/technic/machines/register/extractor.lua
new file mode 100644
index 0000000..eeef9ff
--- /dev/null
+++ b/technic/technic/machines/register/extractor.lua
@@ -0,0 +1,9 @@
+
+local S = technic.getter
+
+function technic.register_extractor(data)
+ data.typename = "extracting"
+ data.machine_name = "extractor"
+ data.machine_desc = S("%s Extractor")
+ technic.register_base_machine(data)
+end
diff --git a/technic/technic/machines/register/extractor_recipes.lua b/technic/technic/machines/register/extractor_recipes.lua
new file mode 100644
index 0000000..1de0ba0
--- /dev/null
+++ b/technic/technic/machines/register/extractor_recipes.lua
@@ -0,0 +1,59 @@
+
+local S = technic.getter
+
+technic.register_recipe_type("extracting", { description = S("Extracting") })
+
+function technic.register_extractor_recipe(data)
+ data.time = data.time or 4
+ technic.register_recipe("extracting", data)
+end
+
+if minetest.get_modpath("dye") then
+ -- check if we are using dye or unifieddyes
+ local unifieddyes = minetest.get_modpath("unifieddyes")
+
+ -- register recipes with the same crafting ratios as `dye` provides
+ local dye_recipes = {
+ {"technic:coal_dust", "dye:black 2"},
+ {"default:grass_1", "dye:green 1"},
+ {"default:dry_shrub", "dye:brown 1"},
+ {"default:junglegrass", "dye:green 2"},
+ {"default:cactus", "dye:green 4"},
+ {"flowers:geranium", "dye:blue 4"},
+ {"flowers:dandelion_white", "dye:white 4"},
+ {"flowers:dandelion_yellow", "dye:yellow 4"},
+ {"flowers:tulip", "dye:orange 4"},
+ {"flowers:rose", "dye:red 4"},
+ {"flowers:viola", "dye:violet 4"},
+ {"bushes:blackberry", unifieddyes and "unifieddyes:magenta_s50 4" or "dye:violet 4"},
+ {"bushes:blueberry", unifieddyes and "unifieddyes:magenta_s50 4" or "dye:magenta 4"},
+ }
+
+ for _, data in ipairs(dye_recipes) do
+ technic.register_extractor_recipe({input = {data[1]}, output = data[2]})
+ end
+
+ -- overwrite the existing crafting recipes
+ local dyes = {"white", "red", "yellow", "blue", "violet", "orange"}
+ for _, color in ipairs(dyes) do
+ minetest.register_craft({
+ type = "shapeless",
+ output = "dye:"..color.." 1",
+ recipe = {"group:flower,color_"..color},
+ })
+
+ end
+ minetest.register_craft({
+ type = "shapeless",
+ output = "dye:black 1",
+ recipe = {"group:coal"},
+ })
+
+ if unifieddyes then
+ minetest.register_craft({
+ type = "shapeless",
+ output = "dye:green 1",
+ recipe = {"default:cactus"},
+ })
+ end
+end
diff --git a/technic/technic/machines/register/generator.lua b/technic/technic/machines/register/generator.lua
new file mode 100644
index 0000000..31c1cef
--- /dev/null
+++ b/technic/technic/machines/register/generator.lua
@@ -0,0 +1,173 @@
+local S = technic.getter
+
+local tube = {
+ insert_object = function(pos, node, stack, direction)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:add_item("src", stack)
+ end,
+ can_insert = function(pos, node, stack, direction)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:room_for_item("src", stack)
+ end,
+ connect_sides = {left=1, right=1, back=1, top=1, bottom=1},
+}
+
+function technic.register_generator(data)
+ local tier = data.tier
+ local ltier = string.lower(tier)
+
+ local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1}
+ local active_groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1, not_in_creative_inventory=1}
+ if data.tube then
+ groups.tubedevice = 1
+ groups.tubedevice_receiver = 1
+ active_groups.tubedevice = 1
+ active_groups.tubedevice_receiver = 1
+ end
+
+ local generator_formspec =
+ "invsize[8,9;]"..
+ "label[0,0;"..S("Fuel-Fired %s Generator"):format(tier).."]"..
+ "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;]"..
+ "listring[]"
+
+ local desc = S("Fuel-Fired %s Generator"):format(tier)
+
+ local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local burn_time = meta:get_int("burn_time")
+ local burn_totaltime = meta:get_int("burn_totaltime")
+ -- If more to burn and the energy produced was used: produce some more
+ if burn_time > 0 then
+ meta:set_int(tier.."_EU_supply", data.supply)
+ burn_time = burn_time - 1
+ meta:set_int("burn_time", burn_time)
+ end
+ -- Burn another piece of fuel
+ if burn_time == 0 then
+ local inv = meta:get_inventory()
+ if not inv:is_empty("src") then
+ local fuellist = inv:get_list("src")
+ local fuel
+ local afterfuel
+ fuel, afterfuel = minetest.get_craft_result(
+ {method = "fuel", width = 1,
+ items = fuellist})
+ if not fuel or fuel.time == 0 then
+ meta:set_string("infotext", S("%s Out Of Fuel"):format(desc))
+ technic.swap_node(pos, "technic:"..ltier.."_generator")
+ meta:set_int(tier.."_EU_supply", 0)
+ return
+ end
+ meta:set_int("burn_time", fuel.time)
+ meta:set_int("burn_totaltime", fuel.time)
+ inv:set_stack("src", 1, afterfuel.items[1])
+ technic.swap_node(pos, "technic:"..ltier.."_generator_active")
+ meta:set_int(tier.."_EU_supply", data.supply)
+ else
+ technic.swap_node(pos, "technic:"..ltier.."_generator")
+ meta:set_int(tier.."_EU_supply", 0)
+ end
+ end
+ if burn_totaltime == 0 then burn_totaltime = 1 end
+ local percent = math.floor((burn_time / burn_totaltime) * 100)
+ meta:set_string("infotext", desc.." ("..percent.."%)")
+ meta:set_string("formspec",
+ "size[8, 9]"..
+ "label[0, 0;"..minetest.formspec_escape(desc).."]"..
+ "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;]"..
+ "listring[]")
+ end
+
+ minetest.register_node("technic:"..ltier.."_generator", {
+ description = desc,
+ tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
+ "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
+ "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front.png"},
+ paramtype2 = "facedir",
+ groups = groups,
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ tube = data.tube and tube or nil,
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", desc)
+ meta:set_int(data.tier.."_EU_supply", 0)
+ meta:set_int("burn_time", 0)
+ meta:set_int("tube_time", 0)
+ meta:set_string("formspec", generator_formspec)
+ local inv = meta:get_inventory()
+ inv:set_size("src", 1)
+ end,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ technic_run = run,
+ after_place_node = data.tube and pipeworks.after_place,
+ after_dig_node = technic.machine_after_dig_node
+ })
+
+ minetest.register_node("technic:"..ltier.."_generator_active", {
+ description = desc,
+ tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
+ "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
+ "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front_active.png"},
+ paramtype2 = "facedir",
+ groups = active_groups,
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ tube = data.tube and tube or nil,
+ drop = "technic:"..ltier.."_generator",
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ technic_run = run,
+ technic_on_disable = function(pos, node)
+ local timer = minetest.get_node_timer(pos)
+ timer:start(1)
+ end,
+ on_timer = function(pos, node)
+ local meta = minetest.get_meta(pos)
+
+ -- Connected back?
+ if meta:get_int(tier.."_EU_timeout") > 0 then return false end
+
+ local burn_time = meta:get_int("burn_time") or 0
+
+ if burn_time <= 0 then
+ meta:set_int(tier.."_EU_supply", 0)
+ meta:set_int("burn_time", 0)
+ technic.swap_node(pos, "technic:"..ltier.."_generator")
+ return false
+ end
+
+ local burn_totaltime = meta:get_int("burn_totaltime") or 0
+ if burn_totaltime == 0 then burn_totaltime = 1 end
+ burn_time = burn_time - 1
+ meta:set_int("burn_time", burn_time)
+ local percent = math.floor(burn_time / burn_totaltime * 100)
+ meta:set_string("formspec",
+ "size[8, 9]"..
+ "label[0, 0;"..minetest.formspec_escape(desc).."]"..
+ "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;]"..
+ "listring[]")
+ return true
+ end,
+ })
+
+ technic.register_machine(tier, "technic:"..ltier.."_generator", technic.producer)
+ technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer)
+end
+
diff --git a/technic/technic/machines/register/grinder.lua b/technic/technic/machines/register/grinder.lua
new file mode 100644
index 0000000..19ea094
--- /dev/null
+++ b/technic/technic/machines/register/grinder.lua
@@ -0,0 +1,9 @@
+
+local S = technic.getter
+
+function technic.register_grinder(data)
+ data.typename = "grinding"
+ data.machine_name = "grinder"
+ data.machine_desc = S("%s Grinder")
+ technic.register_base_machine(data)
+end
diff --git a/technic/technic/machines/register/grinder_recipes.lua b/technic/technic/machines/register/grinder_recipes.lua
new file mode 100644
index 0000000..87c6ade
--- /dev/null
+++ b/technic/technic/machines/register/grinder_recipes.lua
@@ -0,0 +1,161 @@
+
+local S = technic.getter
+
+technic.register_recipe_type("grinding", { description = S("Grinding") })
+
+function technic.register_grinder_recipe(data)
+ data.time = data.time or 3
+ technic.register_recipe("grinding", data)
+end
+
+local recipes = {
+ -- Dusts
+ {"default:coal_lump", "technic:coal_dust 2"},
+ {"default:copper_lump", "technic:copper_dust 2"},
+ {"default:desert_stone", "default:desert_sand"},
+ {"default:gold_lump", "technic:gold_dust 2"},
+ {"default:iron_lump", "technic:wrought_iron_dust 2"},
+ {"technic:chromium_lump", "technic:chromium_dust 2"},
+ {"technic:uranium_lump", "technic:uranium_dust 2"},
+ {"technic:zinc_lump", "technic:zinc_dust 2"},
+ {"technic:lead_lump", "technic:lead_dust 2"},
+ {"technic:sulfur_lump", "technic:sulfur_dust 2"},
+
+ -- Other
+ {"default:cobble", "default:gravel"},
+ {"default:gravel", "default:dirt"},
+ {"default:stone", "default:sand"},
+ {"default:sandstone", "default:sand 2"}, -- reverse recipe can be found in the compressor
+}
+
+-- defuse the sandstone -> 4 sand recipe to avoid infinite sand bugs (also consult the inverse compressor recipe)
+minetest.register_craft({
+ output = "default:sandstone 0",
+ recipe = {
+ {'default:sandstone'}
+ },
+})
+
+if minetest.get_modpath("farming") then
+ table.insert(recipes, {"farming:seed_wheat", "farming:flour 1"})
+end
+
+if minetest.get_modpath("moreores") then
+ table.insert(recipes, {"moreores:mithril_lump", "technic:mithril_dust 2"})
+ table.insert(recipes, {"moreores:silver_lump", "technic:silver_dust 2"})
+ table.insert(recipes, {"moreores:tin_lump", "technic:tin_dust 2"})
+end
+
+if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then
+ table.insert(recipes, {"gloopores:alatro_lump", "technic:alatro_dust 2"})
+ table.insert(recipes, {"gloopores:kalite_lump", "technic:kalite_dust 2"})
+ table.insert(recipes, {"gloopores:arol_lump", "technic:arol_dust 2"})
+ table.insert(recipes, {"gloopores:talinite_lump", "technic:talinite_dust 2"})
+ table.insert(recipes, {"gloopores:akalin_lump", "technic:akalin_dust 2"})
+end
+
+if minetest.get_modpath("homedecor") then
+ table.insert(recipes, {"home_decor:brass_ingot", "technic:brass_dust 1"})
+end
+
+for _, data in pairs(recipes) do
+ technic.register_grinder_recipe({input = {data[1]}, output = data[2]})
+end
+
+-- defuse common grinder unfriendly recipes
+if minetest.get_modpath("fake_fire") then -- from homedecor_modpack
+ minetest.register_craft({ output='default:cobble 0', recipe={{'default:cobble'}}})
+ minetest.register_craft({ output='default:gravel 0', recipe={{'default:gravel'}}})
+end
+
+-- dusts
+local function register_dust(name, ingot)
+ local lname = string.lower(name)
+ lname = string.gsub(lname, ' ', '_')
+ minetest.register_craftitem("technic:"..lname.."_dust", {
+ description = S("%s Dust"):format(S(name)),
+ inventory_image = "technic_"..lname.."_dust.png",
+ })
+ if ingot then
+ minetest.register_craft({
+ type = "cooking",
+ recipe = "technic:"..lname.."_dust",
+ output = ingot,
+ })
+ technic.register_grinder_recipe({ input = {ingot}, output = "technic:"..lname.."_dust 1" })
+ end
+end
+
+-- Sorted alphibeticaly
+register_dust("Brass", "technic:brass_ingot")
+register_dust("Bronze", "default:bronze_ingot")
+register_dust("Carbon Steel", "technic:carbon_steel_ingot")
+register_dust("Cast Iron", "technic:cast_iron_ingot")
+register_dust("Chromium", "technic:chromium_ingot")
+register_dust("Coal", nil)
+register_dust("Copper", "default:copper_ingot")
+register_dust("Lead", "technic:lead_ingot")
+register_dust("Gold", "default:gold_ingot")
+register_dust("Mithril", "moreores:mithril_ingot")
+register_dust("Silver", "moreores:silver_ingot")
+register_dust("Stainless Steel", "technic:stainless_steel_ingot")
+register_dust("Sulfur", nil)
+register_dust("Tin", "moreores:tin_ingot")
+register_dust("Wrought Iron", "technic:wrought_iron_ingot")
+register_dust("Zinc", "technic:zinc_ingot")
+if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then
+ register_dust("Akalin", "glooptest:akalin_ingot")
+ register_dust("Alatro", "glooptest:alatro_ingot")
+ register_dust("Arol", "glooptest:arol_ingot")
+ register_dust("Kalite", nil)
+ register_dust("Talinite", "glooptest:talinite_ingot")
+end
+
+for p = 0, 35 do
+ local nici = (p ~= 0 and p ~= 7 and p ~= 35) and 1 or nil
+ local psuffix = p == 7 and "" or p
+ local ingot = "technic:uranium"..psuffix.."_ingot"
+ local dust = "technic:uranium"..psuffix.."_dust"
+ minetest.register_craftitem(dust, {
+ description = S("%s Dust"):format(string.format(S("%.1f%%-Fissile Uranium"), p/10)),
+ inventory_image = "technic_uranium_dust.png",
+ on_place_on_ground = minetest.craftitem_place_item,
+ groups = {uranium_dust=1, not_in_creative_inventory=nici},
+ })
+ minetest.register_craft({
+ type = "cooking",
+ recipe = dust,
+ output = ingot,
+ })
+ technic.register_grinder_recipe({ input = {ingot}, output = dust })
+end
+
+local function uranium_dust(p)
+ return "technic:uranium"..(p == 7 and "" or p).."_dust"
+end
+for pa = 0, 34 do
+ for pb = pa+1, 35 do
+ local pc = (pa+pb)/2
+ if pc == math.floor(pc) then
+ minetest.register_craft({
+ type = "shapeless",
+ recipe = { uranium_dust(pa), uranium_dust(pb) },
+ output = uranium_dust(pc).." 2",
+ })
+ end
+ end
+end
+
+minetest.register_craft({
+ type = "fuel",
+ recipe = "technic:coal_dust",
+ burntime = 50,
+})
+
+if minetest.get_modpath("gloopores") or minetest.get_modpath("glooptest") then
+ minetest.register_craft({
+ type = "fuel",
+ recipe = "technic:kalite_dust",
+ burntime = 37.5,
+ })
+end
diff --git a/technic/technic/machines/register/grindings.lua b/technic/technic/machines/register/grindings.lua
new file mode 100644
index 0000000..9231166
--- /dev/null
+++ b/technic/technic/machines/register/grindings.lua
@@ -0,0 +1,62 @@
+local S = technic.getter
+local moretrees = minetest.get_modpath("moretrees")
+local mesecons_materials = minetest.get_modpath("mesecons_materials")
+local dye = minetest.get_modpath("dye")
+
+-- sawdust, the finest wood/tree grinding
+local sawdust = "technic:sawdust"
+minetest.register_craftitem(sawdust, {
+ description = S("Sawdust"),
+ inventory_image = "technic_sawdust.png",
+})
+minetest.register_craft({ type = "fuel", recipe = sawdust, burntime = 6 })
+technic.register_compressor_recipe({ input = {sawdust .. " 4"}, output = "default:wood" })
+
+-- tree/wood grindings
+local function register_tree_grinding(name, tree, wood, extract, grinding_color)
+ local lname = string.lower(name)
+ lname = string.gsub(lname, ' ', '_')
+ local grindings_name = "technic:"..lname.."_grindings"
+ local inventory_image = "technic_"..lname.."_grindings.png"
+ if grinding_color then
+ inventory_image = inventory_image .. "^[colorize:" .. grinding_color
+ end
+ minetest.register_craftitem(grindings_name, {
+ description = S("%s Grinding"):format(S(name)),
+ inventory_image = inventory_image,
+ })
+ minetest.register_craft({
+ type = "fuel",
+ recipe = grindings_name,
+ burntime = 8,
+ })
+ technic.register_grinder_recipe({ input = { tree }, output = grindings_name .. " 4" })
+ technic.register_grinder_recipe({ input = { grindings_name }, output = sawdust .. " 4" })
+ if wood then
+ technic.register_grinder_recipe({ input = { wood }, output = grindings_name })
+ end
+ if extract then
+ technic.register_extractor_recipe({ input = { grindings_name .. " 4" }, output = extract})
+ technic.register_separating_recipe({
+ input = { grindings_name .. " 4" },
+ output = { sawdust .. " 4", extract }
+ })
+ end
+end
+
+local rubber_tree_planks = moretrees and "moretrees:rubber_tree_planks"
+local default_extract = dye and "dye:brown 2"
+
+local grinding_recipes = {
+ {"Common Tree", "group:tree", "group:wood", default_extract },
+ {"Rubber Tree", "moretrees:rubber_tree_trunk", rubber_tree_planks, "technic:raw_latex"}
+}
+
+for _, data in pairs(grinding_recipes) do
+ register_tree_grinding(unpack(data))
+end
+
+if moretrees and dye then
+ -- https://en.wikipedia.org/wiki/Catechu ancient brown dye from the wood of acacia trees
+ register_tree_grinding("Acacia", "moretrees:acacia_trunk", "moretrees:acacia_planks", "dye:brown 8")
+end
diff --git a/technic/technic/machines/register/init.lua b/technic/technic/machines/register/init.lua
new file mode 100644
index 0000000..1667d75
--- /dev/null
+++ b/technic/technic/machines/register/init.lua
@@ -0,0 +1,33 @@
+local path = technic.modpath.."/machines/register"
+
+dofile(path.."/common.lua")
+
+-- Wiring stuff
+dofile(path.."/cables.lua")
+dofile(path.."/battery_box.lua")
+
+-- Generators
+dofile(path.."/solar_array.lua")
+dofile(path.."/generator.lua")
+
+-- API for machines
+dofile(path.."/recipes.lua")
+dofile(path.."/machine_base.lua")
+
+-- Recipes
+dofile(path.."/alloy_recipes.lua")
+dofile(path.."/grinder_recipes.lua")
+dofile(path.."/extractor_recipes.lua")
+dofile(path.."/compressor_recipes.lua")
+dofile(path.."/centrifuge_recipes.lua")
+
+-- Multi-Machine Recipes
+dofile(path.."/grindings.lua")
+
+-- Machines
+dofile(path.."/alloy_furnace.lua")
+dofile(path.."/electric_furnace.lua")
+dofile(path.."/grinder.lua")
+dofile(path.."/extractor.lua")
+dofile(path.."/compressor.lua")
+dofile(path.."/centrifuge.lua")
diff --git a/technic/technic/machines/register/machine_base.lua b/technic/technic/machines/register/machine_base.lua
new file mode 100644
index 0000000..0c46261
--- /dev/null
+++ b/technic/technic/machines/register/machine_base.lua
@@ -0,0 +1,197 @@
+
+local S = technic.getter
+
+local tube = {
+ insert_object = function(pos, node, stack, direction)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:add_item("src", stack)
+ end,
+ can_insert = function(pos, node, stack, direction)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:room_for_item("src", stack)
+ end,
+ connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
+}
+
+local function round(v)
+ return math.floor(v + 0.5)
+end
+
+function technic.register_base_machine(data)
+ local typename = data.typename
+ local input_size = technic.recipes[typename].input_size
+ local machine_name = data.machine_name
+ local machine_desc = data.machine_desc
+ local tier = data.tier
+ local ltier = string.lower(tier)
+
+ local groups = {cracky = 2, technic_machine = 1}
+ local active_groups = {cracky = 2, technic_machine = 1, not_in_creative_inventory = 1}
+ if data.tube then
+ groups.tubedevice = 1
+ groups.tubedevice_receiver = 1
+ active_groups.tubedevice = 1
+ active_groups.tubedevice_receiver = 1
+ end
+
+
+ local formspec =
+ "invsize[8,9;]"..
+ "list[current_name;src;"..(4-input_size)..",1;"..input_size..",1;]"..
+ "list[current_name;dst;5,1;2,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "label[0,0;"..machine_desc:format(tier).."]"..
+ "listring[current_name;dst]"..
+ "listring[current_player;main]"..
+ "listring[current_name;src]"..
+ "listring[current_player;main]"
+ if data.upgrade then
+ formspec = formspec..
+ "list[current_name;upgrade1;1,3;1,1;]"..
+ "list[current_name;upgrade2;2,3;1,1;]"..
+ "label[1,4;"..S("Upgrade Slots").."]"..
+ "listring[current_name;upgrade1]"..
+ "listring[current_player;main]"..
+ "listring[current_name;upgrade2]"..
+ "listring[current_player;main]"
+ end
+
+ local run = function(pos, node)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local eu_input = meta:get_int(tier.."_EU_input")
+
+ local machine_desc_tier = machine_desc:format(tier)
+ local machine_node = "technic:"..ltier.."_"..machine_name
+ local machine_demand = data.demand
+
+ -- Setup meta data if it does not exist.
+ if not eu_input then
+ meta:set_int(tier.."_EU_demand", machine_demand[1])
+ meta:set_int(tier.."_EU_input", 0)
+ return
+ end
+
+ local EU_upgrade, tube_upgrade = 0, 0
+ if data.upgrade then
+ EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
+ end
+ if data.tube then
+ technic.handle_machine_pipeworks(pos, tube_upgrade)
+ end
+
+ local powered = eu_input >= machine_demand[EU_upgrade+1]
+ if powered then
+ meta:set_int("src_time", meta:get_int("src_time") + round(data.speed*10))
+ end
+ while true do
+ local result = technic.get_recipe(typename, inv:get_list("src"))
+ if not result then
+ technic.swap_node(pos, machine_node)
+ meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
+ meta:set_int(tier.."_EU_demand", 0)
+ meta:set_int("src_time", 0)
+ return
+ end
+ meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
+ technic.swap_node(pos, machine_node.."_active")
+ meta:set_string("infotext", S("%s Active"):format(machine_desc_tier))
+ if meta:get_int("src_time") < round(result.time*10) then
+ if not powered then
+ technic.swap_node(pos, machine_node)
+ meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier))
+ end
+ return
+ end
+ local output = result.output
+ if type(output) ~= "table" then output = { output } end
+ local output_stacks = {}
+ for _, o in ipairs(output) do
+ table.insert(output_stacks, ItemStack(o))
+ end
+ local room_for_output = true
+ inv:set_size("dst_tmp", inv:get_size("dst"))
+ inv:set_list("dst_tmp", inv:get_list("dst"))
+ for _, o in ipairs(output_stacks) do
+ if not inv:room_for_item("dst_tmp", o) then
+ room_for_output = false
+ break
+ end
+ inv:add_item("dst_tmp", o)
+ end
+ if not room_for_output then
+ technic.swap_node(pos, machine_node)
+ meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
+ meta:set_int(tier.."_EU_demand", 0)
+ meta:set_int("src_time", round(result.time*10))
+ return
+ end
+ meta:set_int("src_time", meta:get_int("src_time") - round(result.time*10))
+ inv:set_list("src", result.new_input)
+ inv:set_list("dst", inv:get_list("dst_tmp"))
+ end
+ end
+
+ minetest.register_node("technic:"..ltier.."_"..machine_name, {
+ description = machine_desc:format(tier),
+ tiles = {"technic_"..ltier.."_"..machine_name.."_top.png",
+ "technic_"..ltier.."_"..machine_name.."_bottom.png",
+ "technic_"..ltier.."_"..machine_name.."_side.png",
+ "technic_"..ltier.."_"..machine_name.."_side.png",
+ "technic_"..ltier.."_"..machine_name.."_side.png",
+ "technic_"..ltier.."_"..machine_name.."_front.png"},
+ paramtype2 = "facedir",
+ groups = groups,
+ tube = data.tube and tube or nil,
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ on_construct = function(pos)
+ local node = minetest.get_node(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", machine_desc:format(tier))
+ meta:set_int("tube_time", 0)
+ meta:set_string("formspec", formspec)
+ local inv = meta:get_inventory()
+ inv:set_size("src", input_size)
+ inv:set_size("dst", 4)
+ inv:set_size("upgrade1", 1)
+ inv:set_size("upgrade2", 1)
+ end,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ technic_run = run,
+ after_place_node = data.tube and pipeworks.after_place,
+ after_dig_node = technic.machine_after_dig_node
+ })
+
+ minetest.register_node("technic:"..ltier.."_"..machine_name.."_active",{
+ description = machine_desc:format(tier),
+ tiles = {"technic_"..ltier.."_"..machine_name.."_top.png",
+ "technic_"..ltier.."_"..machine_name.."_bottom.png",
+ "technic_"..ltier.."_"..machine_name.."_side.png",
+ "technic_"..ltier.."_"..machine_name.."_side.png",
+ "technic_"..ltier.."_"..machine_name.."_side.png",
+ "technic_"..ltier.."_"..machine_name.."_front_active.png"},
+ paramtype2 = "facedir",
+ drop = "technic:"..ltier.."_"..machine_name,
+ groups = active_groups,
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ tube = data.tube and tube or nil,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ technic_run = run,
+ technic_disabled_machine_name = "technic:"..ltier.."_"..machine_name,
+ })
+
+ technic.register_machine(tier, "technic:"..ltier.."_"..machine_name, technic.receiver)
+ technic.register_machine(tier, "technic:"..ltier.."_"..machine_name.."_active", technic.receiver)
+
+end -- End registration
+
diff --git a/technic/technic/machines/register/recipes.lua b/technic/technic/machines/register/recipes.lua
new file mode 100644
index 0000000..d30fd4f
--- /dev/null
+++ b/technic/technic/machines/register/recipes.lua
@@ -0,0 +1,107 @@
+local have_ui = minetest.get_modpath("unified_inventory")
+
+technic.recipes = { cooking = { input_size = 1, output_size = 1 } }
+function technic.register_recipe_type(typename, origdata)
+ local data = {}
+ for k, v in pairs(origdata) do data[k] = v end
+ data.input_size = data.input_size or 1
+ data.output_size = data.output_size or 1
+ if have_ui and unified_inventory.register_craft_type and data.output_size == 1 then
+ unified_inventory.register_craft_type(typename, {
+ description = data.description,
+ width = data.input_size,
+ height = 1,
+ })
+ end
+ data.recipes = {}
+ technic.recipes[typename] = data
+end
+
+local function get_recipe_index(items)
+ if not items or type(items) ~= "table" then return false end
+ local l = {}
+ for i, stack in ipairs(items) do
+ l[i] = ItemStack(stack):get_name()
+ end
+ table.sort(l)
+ return table.concat(l, "/")
+end
+
+local function register_recipe(typename, data)
+ -- Handle aliases
+ for i, stack in ipairs(data.input) do
+ data.input[i] = ItemStack(stack):to_string()
+ end
+ if type(data.output) == "table" then
+ for i, v in ipairs(data.output) do
+ data.output[i] = ItemStack(data.output[i]):to_string()
+ end
+ else
+ data.output = ItemStack(data.output):to_string()
+ end
+
+ local recipe = {time = data.time, input = {}, output = data.output}
+ local index = get_recipe_index(data.input)
+ if not index then
+ print("[Technic] ignored registration of garbage recipe!")
+ return
+ end
+ for _, stack in ipairs(data.input) do
+ recipe.input[ItemStack(stack):get_name()] = ItemStack(stack):get_count()
+ end
+
+ technic.recipes[typename].recipes[index] = recipe
+ if unified_inventory and technic.recipes[typename].output_size == 1 then
+ unified_inventory.register_craft({
+ type = typename,
+ output = data.output,
+ items = data.input,
+ width = 0,
+ })
+ end
+end
+
+function technic.register_recipe(typename, data)
+ minetest.after(0.01, register_recipe, typename, data) -- Handle aliases
+end
+
+function technic.get_recipe(typename, items)
+ if typename == "cooking" then -- Already builtin in Minetest, so use that
+ local result, new_input = minetest.get_craft_result({
+ method = "cooking",
+ width = 1,
+ items = items})
+ -- Compatibility layer
+ if not result or result.time == 0 then
+ return nil
+ else
+ return {time = result.time,
+ new_input = new_input.items,
+ output = result.item}
+ end
+ end
+ local index = get_recipe_index(items)
+ if not index then
+ print("[Technic] ignored registration of garbage recipe!")
+ return
+ end
+ local recipe = technic.recipes[typename].recipes[index]
+ if recipe then
+ local new_input = {}
+ for i, stack in ipairs(items) do
+ if stack:get_count() < recipe.input[stack:get_name()] then
+ return nil
+ else
+ new_input[i] = ItemStack(stack)
+ new_input[i]:take_item(recipe.input[stack:get_name()])
+ end
+ end
+ return {time = recipe.time,
+ new_input = new_input,
+ output = recipe.output}
+ else
+ return nil
+ end
+end
+
+
diff --git a/technic/technic/machines/register/solar_array.lua b/technic/technic/machines/register/solar_array.lua
new file mode 100644
index 0000000..39f50d2
--- /dev/null
+++ b/technic/technic/machines/register/solar_array.lua
@@ -0,0 +1,65 @@
+
+local S = technic.getter
+
+function technic.register_solar_array(data)
+ local tier = data.tier
+ local ltier = string.lower(tier)
+
+ local run = function(pos, node)
+ -- The action here is to make the solar array produce power
+ -- Power is dependent on the light level and the height above ground
+ -- There are many ways to cheat by using other light sources like lamps.
+ -- As there is no way to determine if light is sunlight that is just a shame.
+ -- To take care of some of it solar panels do not work outside daylight hours or if
+ -- built below 0m
+ local pos1 = {}
+ local machine_name = S("Arrayed Solar %s Generator"):format(tier)
+ pos1.y = pos.y + 1
+ pos1.x = pos.x
+ pos1.z = pos.z
+
+ technic.get_or_load_node(pos1)
+ local light = minetest.get_node_light(pos1, nil)
+ local time_of_day = minetest.get_timeofday()
+ local meta = minetest.get_meta(pos)
+ light = light or 0
+
+ -- turn on array only during day time and if sufficient light
+ -- I know this is counter intuitive when cheating by using other light sources.
+ if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > 0 then
+ local charge_to_give = math.floor((light + pos.y) * data.power)
+ charge_to_give = math.max(charge_to_give, 0)
+ charge_to_give = math.min(charge_to_give, data.power * 50)
+ meta:set_string("infotext", S("@1 Active (@2 EU)", machine_name, technic.prettynum(charge_to_give)))
+ meta:set_int(tier.."_EU_supply", charge_to_give)
+ else
+ meta:set_string("infotext", S("%s Idle"):format(machine_name))
+ meta:set_int(tier.."_EU_supply", 0)
+ end
+ end
+
+ minetest.register_node("technic:solar_array_"..ltier, {
+ tiles = {"technic_"..ltier.."_solar_array_top.png", "technic_"..ltier.."_solar_array_bottom.png",
+ "technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png",
+ "technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png"},
+ groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1},
+ sounds = default.node_sound_wood_defaults(),
+ description = S("Arrayed Solar %s Generator"):format(tier),
+ active = false,
+ drawtype = "nodebox",
+ paramtype = "light",
+ node_box = {
+ type = "fixed",
+ fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ local name = minetest.get_node(pos).name
+ meta:set_int(tier.."_EU_supply", 0)
+ end,
+ technic_run = run,
+ })
+
+ technic.register_machine(tier, "technic:solar_array_"..ltier, technic.producer)
+end
+
diff --git a/technic/technic/machines/supply_converter.lua b/technic/technic/machines/supply_converter.lua
new file mode 100644
index 0000000..ffcd40d
--- /dev/null
+++ b/technic/technic/machines/supply_converter.lua
@@ -0,0 +1,80 @@
+-- The supply converter is a generic device which can convert from
+-- LV to MV and back, and HV to MV and back.
+-- The machine is configured by the wiring below and above it.
+--
+-- It works like this:
+-- The top side is setup as the receiver side, the bottom as the producer side.
+-- Once the receiver side is powered it will deliver power to the other side.
+-- Unused power is wasted just like any other producer!
+
+local S = technic.getter
+
+local run = function(pos, node)
+ local demand = 10000
+ local remain = 0.9
+ -- Machine information
+ local machine_name = S("Supply Converter")
+ local meta = minetest.get_meta(pos)
+
+ local pos_up = {x=pos.x, y=pos.y+1, z=pos.z}
+ local pos_down = {x=pos.x, y=pos.y-1, z=pos.z}
+ local name_up = minetest.get_node(pos_up).name
+ local name_down = minetest.get_node(pos_down).name
+
+ local from = technic.get_cable_tier(name_up)
+ local to = technic.get_cable_tier(name_down)
+
+ if from and to then
+ local input = meta:get_int(from.."_EU_input")
+ meta:set_int(from.."_EU_demand", demand)
+ meta:set_int(from.."_EU_supply", 0)
+ meta:set_int(to.."_EU_demand", 0)
+ meta:set_int(to.."_EU_supply", input * remain)
+ meta:set_string("infotext", S("@1 (@2 @3 -> @4 @5)", machine_name, technic.prettynum(input), from, technic.prettynum(input * remain), to))
+ else
+ meta:set_string("infotext", S("%s Has Bad Cabling"):format(machine_name))
+ if to then
+ meta:set_int(to.."_EU_supply", 0)
+ end
+ if from then
+ meta:set_int(from.."_EU_demand", 0)
+ end
+ return
+ end
+
+end
+
+minetest.register_node("technic:supply_converter", {
+ description = S("Supply Converter"),
+ tiles = {"technic_supply_converter_top.png", "technic_supply_converter_bottom.png",
+ "technic_supply_converter_side.png", "technic_supply_converter_side.png",
+ "technic_supply_converter_side.png", "technic_supply_converter_side.png"},
+ groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1},
+ sounds = default.node_sound_wood_defaults(),
+ drawtype = "nodebox",
+ paramtype = "light",
+ node_box = {
+ type = "fixed",
+ fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("Supply Converter"))
+ meta:set_float("active", false)
+ end,
+ technic_run = run,
+})
+
+minetest.register_craft({
+ output = 'technic:supply_converter 1',
+ recipe = {
+ {'technic:fine_gold_wire', 'technic:rubber', 'technic:doped_silicon_wafer'},
+ {'technic:mv_transformer', 'technic:machine_casing', 'technic:lv_transformer'},
+ {'technic:mv_cable0', 'technic:rubber', 'technic:lv_cable0'},
+ }
+})
+
+for tier, machines in pairs(technic.machines) do
+ technic.register_machine(tier, "technic:supply_converter", technic.producer_receiver)
+end
+
diff --git a/technic/technic/machines/switching_station.lua b/technic/technic/machines/switching_station.lua
new file mode 100644
index 0000000..d6f23a3
--- /dev/null
+++ b/technic/technic/machines/switching_station.lua
@@ -0,0 +1,404 @@
+-- SWITCHING STATION
+-- The switching station is the center of all power distribution on an electric network.
+--
+-- The station collects power from sources (PR), distributes it to sinks (RE),
+-- and uses the excess/shortfall to charge and discharge batteries (BA).
+--
+-- For now, all supply and demand values are expressed in kW.
+--
+-- It works like this:
+-- All PR,BA,RE nodes are indexed and tagged with the switching station.
+-- The tagging is to allow more stations to be built without allowing a cheat
+-- with duplicating power.
+-- All the RE nodes are queried for their current EU demand. Those which are off
+-- would require no or a small standby EU demand, while those which are on would
+-- require more.
+-- If the total demand is less than the available power they are all updated with the
+-- demand number.
+-- If any surplus exists from the PR nodes the batteries will be charged evenly with this.
+-- If the total demand requires draw on the batteries they will be discharged evenly.
+--
+-- If the total demand is more than the available power all RE nodes will be shut down.
+-- We have a brown-out situation.
+--
+-- Hence all the power distribution logic resides in this single node.
+--
+-- Nodes connected to the network will have one or more of these parameters as meta data:
+-- <LV|MV|HV>_EU_supply : Exists for PR and BA node types. This is the EU value supplied by the node. Output
+-- <LV|MV|HV>_EU_demand : Exists for RE and BA node types. This is the EU value the node requires to run. Output
+-- <LV|MV|HV>_EU_input : Exists for RE and BA node types. This is the actual EU value the network can give the node. Input
+--
+-- The reason the LV|MV|HV type is prepended toe meta data is because some machine could require several supplies to work.
+-- This way the supplies are separated per network.
+
+technic.networks = {}
+
+local S = technic.getter
+
+minetest.register_craft({
+ output = "technic:switching_station",
+ recipe = {
+ {"", "technic:lv_transformer", ""},
+ {"default:copper_ingot", "technic:machine_casing", "default:copper_ingot"},
+ {"technic:lv_cable0", "technic:lv_cable0", "technic:lv_cable0"}
+ }
+})
+
+minetest.register_node("technic:switching_station",{
+ description = S("Switching Station"),
+ tiles = {"technic_water_mill_top_active.png", "technic_water_mill_top_active.png",
+ "technic_water_mill_top_active.png", "technic_water_mill_top_active.png",
+ "technic_water_mill_top_active.png", "technic_water_mill_top_active.png"},
+ groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
+ sounds = default.node_sound_wood_defaults(),
+ drawtype = "nodebox",
+ paramtype = "light",
+ node_box = {
+ type = "fixed",
+ fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+ },
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("Switching Station"))
+ meta:set_string("active", 1)
+ end,
+})
+
+--------------------------------------------------
+-- Functions to traverse the electrical network
+--------------------------------------------------
+
+-- Add a wire node to the LV/MV/HV network
+local add_new_cable_node = function(nodes, pos)
+ -- Ignore if the node has already been added
+ for i = 1, #nodes do
+ if pos.x == nodes[i].x and
+ pos.y == nodes[i].y and
+ pos.z == nodes[i].z then
+ return false
+ end
+ end
+ table.insert(nodes, {x=pos.x, y=pos.y, z=pos.z, visited=1})
+ return true
+end
+
+-- Generic function to add found connected nodes to the right classification array
+local check_node_subp = function(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes, pos, machines, tier, sw_pos, from_below)
+ technic.get_or_load_node(pos)
+ local meta = minetest.get_meta(pos)
+ local name = minetest.get_node(pos).name
+
+ if technic.is_tier_cable(name, tier) then
+ add_new_cable_node(all_nodes, pos)
+ elseif machines[name] then
+ --dprint(name.." is a "..machines[name])
+ if machines[name] == technic.producer then
+ add_new_cable_node(PR_nodes, pos)
+ elseif machines[name] == technic.receiver then
+ add_new_cable_node(RE_nodes, pos)
+ elseif machines[name] == technic.producer_receiver then
+ add_new_cable_node(PR_nodes, pos)
+ add_new_cable_node(RE_nodes, pos)
+ elseif machines[name] == "SPECIAL" and
+ (pos.x ~= sw_pos.x or pos.y ~= sw_pos.y or pos.z ~= sw_pos.z) and
+ from_below then
+ -- Another switching station -> disable it
+ add_new_cable_node(SP_nodes, pos)
+ meta:set_int("active", 0)
+ meta:set_string("active_pos", minetest.serialize(sw_pos))
+ elseif machines[name] == technic.battery then
+ add_new_cable_node(BA_nodes, pos)
+ end
+
+ meta:set_int(tier.."_EU_timeout", 2) -- Touch node
+ end
+end
+
+-- Traverse a network given a list of machines and a cable type name
+local traverse_network = function(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes, i, machines, tier, sw_pos)
+ local pos = all_nodes[i]
+ local positions = {
+ {x=pos.x+1, y=pos.y, z=pos.z},
+ {x=pos.x-1, y=pos.y, z=pos.z},
+ {x=pos.x, y=pos.y+1, z=pos.z},
+ {x=pos.x, y=pos.y-1, z=pos.z},
+ {x=pos.x, y=pos.y, z=pos.z+1},
+ {x=pos.x, y=pos.y, z=pos.z-1}}
+ --print("ON")
+ for i, cur_pos in pairs(positions) do
+ check_node_subp(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes, cur_pos, machines, tier, sw_pos, i == 3)
+ end
+end
+
+local touch_nodes = function(list, tier)
+ for _, pos in ipairs(list) do
+ local meta = minetest.get_meta(pos)
+ meta:set_int(tier.."_EU_timeout", 2) -- Touch node
+ end
+end
+
+local get_network = function(sw_pos, pos1, tier)
+ local cached = technic.networks[minetest.hash_node_position(pos1)]
+ if cached and cached.tier == tier then
+ touch_nodes(cached.PR_nodes, tier)
+ touch_nodes(cached.BA_nodes, tier)
+ touch_nodes(cached.RE_nodes, tier)
+ for _, pos in ipairs(cached.SP_nodes) do
+ local meta = minetest.get_meta(pos)
+ meta:set_int("active", 0)
+ meta:set_string("active_pos", minetest.serialize(sw_pos))
+ end
+ return cached.PR_nodes, cached.BA_nodes, cached.RE_nodes
+ end
+ local i = 1
+ local PR_nodes = {}
+ local BA_nodes = {}
+ local RE_nodes = {}
+ local SP_nodes = {}
+ local all_nodes = {pos1}
+ repeat
+ traverse_network(PR_nodes, RE_nodes, BA_nodes, SP_nodes, all_nodes,
+ i, technic.machines[tier], tier, sw_pos)
+ i = i + 1
+ until all_nodes[i] == nil
+ technic.networks[minetest.hash_node_position(pos1)] = {tier = tier, PR_nodes = PR_nodes,
+ RE_nodes = RE_nodes, BA_nodes = BA_nodes, SP_nodes = SP_nodes}
+ return PR_nodes, BA_nodes, RE_nodes
+end
+
+-----------------------------------------------
+-- The action code for the switching station --
+-----------------------------------------------
+minetest.register_abm({
+ nodenames = {"technic:switching_station"},
+ label = "Switching Station", -- allows the mtt profiler to profile this abm individually
+ interval = 1,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ local meta = minetest.get_meta(pos)
+ local meta1 = nil
+ local pos1 = {}
+ local PR_EU = 0 -- EUs from PR nodes
+ local BA_PR_EU = 0 -- EUs from BA nodes (discharching)
+ local BA_RE_EU = 0 -- EUs to BA nodes (charging)
+ local RE_EU = 0 -- EUs to RE nodes
+
+ local tier = ""
+ local PR_nodes
+ local BA_nodes
+ local RE_nodes
+ local machine_name = S("Switching Station")
+
+ if meta:get_int("active") ~= 1 then
+ meta:set_int("active", 1)
+ local active_pos = minetest.deserialize(meta:get_string("active_pos"))
+ if active_pos then
+ local meta1 = minetest.get_meta(active_pos)
+ meta:set_string("infotext", S("%s (Slave)"):format(meta1:get_string("infotext")))
+ end
+ return
+ end
+
+ -- Which kind of network are we on:
+ pos1 = {x=pos.x, y=pos.y-1, z=pos.z}
+
+ local name = minetest.get_node(pos1).name
+ local tier = technic.get_cable_tier(name)
+ if tier then
+ PR_nodes, BA_nodes, RE_nodes = get_network(pos, pos1, tier)
+ else
+ --dprint("Not connected to a network")
+ meta:set_string("infotext", S("%s Has No Network"):format(machine_name))
+ return
+ end
+
+ -- Run all the nodes
+ local function run_nodes(list)
+ for _, pos2 in ipairs(list) do
+ technic.get_or_load_node(pos2)
+ local node2 = minetest.get_node(pos2)
+ local nodedef
+ if node2 and node2.name then
+ nodedef = minetest.registered_nodes[node2.name]
+ end
+ if nodedef and nodedef.technic_run then
+ nodedef.technic_run(pos2, node2)
+ end
+ end
+ end
+
+ run_nodes(PR_nodes)
+ run_nodes(RE_nodes)
+ run_nodes(BA_nodes)
+
+ -- Strings for the meta data
+ local eu_demand_str = tier.."_EU_demand"
+ local eu_input_str = tier.."_EU_input"
+ local eu_supply_str = tier.."_EU_supply"
+
+ -- Distribute charge equally across multiple batteries.
+ local charge_total = 0
+ local battery_count = 0
+
+ for n, pos1 in pairs(BA_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ local charge = meta1:get_int("internal_EU_charge")
+
+ if (meta1:get_int(eu_demand_str) ~= 0) then
+ charge_total = charge_total + charge
+ battery_count = battery_count + 1
+ end
+ end
+
+ local charge_distributed = math.floor(charge_total / battery_count)
+
+ for n, pos1 in pairs(BA_nodes) do
+ meta1 = minetest.get_meta(pos1)
+
+ if (meta1:get_int(eu_demand_str) ~= 0) then
+ meta1:set_int("internal_EU_charge", charge_distributed)
+ end
+ end
+
+ -- Get all the power from the PR nodes
+ local PR_eu_supply = 0 -- Total power
+ for _, pos1 in pairs(PR_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ PR_eu_supply = PR_eu_supply + meta1:get_int(eu_supply_str)
+ end
+ --dprint("Total PR supply:"..PR_eu_supply)
+
+ -- Get all the demand from the RE nodes
+ local RE_eu_demand = 0
+ for _, pos1 in pairs(RE_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ RE_eu_demand = RE_eu_demand + meta1:get_int(eu_demand_str)
+ end
+ --dprint("Total RE demand:"..RE_eu_demand)
+
+ -- Get all the power from the BA nodes
+ local BA_eu_supply = 0
+ for _, pos1 in pairs(BA_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ BA_eu_supply = BA_eu_supply + meta1:get_int(eu_supply_str)
+ end
+ --dprint("Total BA supply:"..BA_eu_supply)
+
+ -- Get all the demand from the BA nodes
+ local BA_eu_demand = 0
+ for _, pos1 in pairs(BA_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ BA_eu_demand = BA_eu_demand + meta1:get_int(eu_demand_str)
+ end
+ --dprint("Total BA demand:"..BA_eu_demand)
+
+ meta:set_string("infotext",
+ S("@1. Supply: @2 Demand: @3",
+ machine_name, technic.prettynum(PR_eu_supply), technic.prettynum(RE_eu_demand)))
+
+ -- If the PR supply is enough for the RE demand supply them all
+ if PR_eu_supply >= RE_eu_demand then
+ --dprint("PR_eu_supply"..PR_eu_supply.." >= RE_eu_demand"..RE_eu_demand)
+ for _, pos1 in pairs(RE_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ local eu_demand = meta1:get_int(eu_demand_str)
+ meta1:set_int(eu_input_str, eu_demand)
+ end
+ -- We have a surplus, so distribute the rest equally to the BA nodes
+ -- Let's calculate the factor of the demand
+ PR_eu_supply = PR_eu_supply - RE_eu_demand
+ local charge_factor = 0 -- Assume all batteries fully charged
+ if BA_eu_demand > 0 then
+ charge_factor = PR_eu_supply / BA_eu_demand
+ end
+ for n, pos1 in pairs(BA_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ local eu_demand = meta1:get_int(eu_demand_str)
+ meta1:set_int(eu_input_str, math.floor(eu_demand * charge_factor))
+ --dprint("Charging battery:"..math.floor(eu_demand*charge_factor))
+ end
+ return
+ end
+
+ -- If the PR supply is not enough for the RE demand we will discharge the batteries too
+ if PR_eu_supply + BA_eu_supply >= RE_eu_demand then
+ --dprint("PR_eu_supply "..PR_eu_supply.."+BA_eu_supply "..BA_eu_supply.." >= RE_eu_demand"..RE_eu_demand)
+ for _, pos1 in pairs(RE_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ local eu_demand = meta1:get_int(eu_demand_str)
+ meta1:set_int(eu_input_str, eu_demand)
+ end
+ -- We have a deficit, so distribute to the BA nodes
+ -- Let's calculate the factor of the supply
+ local charge_factor = 0 -- Assume all batteries depleted
+ if BA_eu_supply > 0 then
+ charge_factor = (PR_eu_supply - RE_eu_demand) / BA_eu_supply
+ end
+ for n,pos1 in pairs(BA_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ local eu_supply = meta1:get_int(eu_supply_str)
+ meta1:set_int(eu_input_str, math.floor(eu_supply * charge_factor))
+ --dprint("Discharging battery:"..math.floor(eu_supply*charge_factor))
+ end
+ return
+ end
+
+ -- If the PR+BA supply is not enough for the RE demand: Power only the batteries
+ local charge_factor = 0 -- Assume all batteries fully charged
+ if BA_eu_demand > 0 then
+ charge_factor = PR_eu_supply / BA_eu_demand
+ end
+ for n, pos1 in pairs(BA_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ local eu_demand = meta1:get_int(eu_demand_str)
+ meta1:set_int(eu_input_str, math.floor(eu_demand * charge_factor))
+ end
+ for n, pos1 in pairs(RE_nodes) do
+ meta1 = minetest.get_meta(pos1)
+ meta1:set_int(eu_input_str, 0)
+ end
+ end,
+})
+
+-- Timeout ABM
+-- Timeout for a node in case it was disconnected from the network
+-- A node must be touched by the station continuously in order to function
+local function switching_station_timeout_count(pos, tier)
+ local meta = minetest.get_meta(pos)
+ local timeout = meta:get_int(tier.."_EU_timeout")
+ if timeout <= 0 then
+ meta:set_int(tier.."_EU_input", 0) -- Not needed anymore <-- actually, it is for supply converter
+ return true
+ else
+ meta:set_int(tier.."_EU_timeout", timeout - 1)
+ return false
+ end
+end
+minetest.register_abm({
+ nodenames = {"group:technic_machine"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ for tier, machines in pairs(technic.machines) do
+ if machines[node.name] and switching_station_timeout_count(pos, tier) then
+ local nodedef = minetest.registered_nodes[node.name]
+ if nodedef and nodedef.technic_disabled_machine_name then
+ node.name = nodedef.technic_disabled_machine_name
+ minetest.swap_node(pos, node)
+ elseif nodedef and nodedef.technic_on_disable then
+ nodedef.technic_on_disable(pos, node)
+ end
+ if nodedef then
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("%s Has No Network"):format(nodedef.description))
+ end
+ end
+ end
+ end,
+})
+
+for tier, machines in pairs(technic.machines) do
+ -- SPECIAL will not be traversed
+ technic.register_machine(tier, "technic:switching_station", "SPECIAL")
+end
+
diff --git a/technic/technic/models/technic_cylinder.obj b/technic/technic/models/technic_cylinder.obj
new file mode 100644
index 0000000..2622347
--- /dev/null
+++ b/technic/technic/models/technic_cylinder.obj
@@ -0,0 +1,238 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_cylinder_onetexture.blend'
+# www.blender.org
+o Cylinder_Cylinder.001
+v 0.000000 -0.500000 -0.500000
+v 0.000000 0.500000 -0.500000
+v 0.097545 -0.500000 -0.490393
+v 0.097545 0.500000 -0.490393
+v 0.191342 -0.500000 -0.461940
+v 0.191342 0.500000 -0.461940
+v 0.277785 -0.500000 -0.415735
+v 0.277785 0.500000 -0.415735
+v 0.353553 -0.500000 -0.353554
+v 0.353553 0.500000 -0.353554
+v 0.415735 -0.500000 -0.277785
+v 0.415735 0.500000 -0.277785
+v 0.461940 -0.500000 -0.191342
+v 0.461940 0.500000 -0.191342
+v 0.490393 -0.500000 -0.097545
+v 0.490393 0.500000 -0.097545
+v 0.500000 -0.500000 -0.000000
+v 0.500000 0.500000 -0.000000
+v 0.490393 -0.500000 0.097545
+v 0.490393 0.500000 0.097545
+v 0.461940 -0.500000 0.191341
+v 0.461940 0.500000 0.191341
+v 0.415735 -0.500000 0.277785
+v 0.415735 0.500000 0.277785
+v 0.353553 -0.500000 0.353553
+v 0.353553 0.500000 0.353553
+v 0.277785 -0.500000 0.415735
+v 0.277785 0.500000 0.415735
+v 0.191342 -0.500000 0.461940
+v 0.191342 0.500000 0.461940
+v 0.097545 -0.500000 0.490392
+v 0.097545 0.500000 0.490392
+v -0.000000 -0.500000 0.500000
+v -0.000000 0.500000 0.500000
+v -0.097545 -0.500000 0.490392
+v -0.097545 0.500000 0.490392
+v -0.191342 -0.500000 0.461939
+v -0.191342 0.500000 0.461939
+v -0.277785 -0.500000 0.415734
+v -0.277785 0.500000 0.415734
+v -0.353554 -0.500000 0.353553
+v -0.353554 0.500000 0.353553
+v -0.415735 -0.500000 0.277785
+v -0.415735 0.500000 0.277785
+v -0.461940 -0.500000 0.191341
+v -0.461940 0.500000 0.191341
+v -0.490393 -0.500000 0.097545
+v -0.490393 0.500000 0.097545
+v -0.500000 -0.500000 -0.000001
+v -0.500000 0.500000 -0.000001
+v -0.490393 -0.500000 -0.097546
+v -0.490393 0.500000 -0.097546
+v -0.461940 -0.500000 -0.191342
+v -0.461940 0.500000 -0.191342
+v -0.415734 -0.500000 -0.277786
+v -0.415734 0.500000 -0.277786
+v -0.353553 -0.500000 -0.353554
+v -0.353553 0.500000 -0.353554
+v -0.277785 -0.500000 -0.415735
+v -0.277785 0.500000 -0.415735
+v -0.191341 -0.500000 -0.461940
+v -0.191341 0.500000 -0.461940
+v -0.097544 -0.500000 -0.490393
+v -0.097544 0.500000 -0.490393
+vt 0.499996 0.999997
+vt 0.499995 0.000005
+vt 0.562495 0.000004
+vt 0.562496 0.999997
+vt 0.624995 0.000003
+vt 0.624997 0.999997
+vt 0.687496 0.000002
+vt 0.687497 0.999998
+vt 0.749997 0.000001
+vt 0.749997 0.999998
+vt 0.812497 0.000001
+vt 0.812497 0.999998
+vt 0.874997 -0.000000
+vt 0.874997 0.999998
+vt 0.937498 -0.000000
+vt 0.937498 0.999998
+vt 0.999998 -0.000000
+vt 0.999998 0.999998
+vt 0.000005 0.999997
+vt 0.000001 0.000024
+vt 0.062500 0.000023
+vt 0.062505 0.999996
+vt 0.124999 0.000021
+vt 0.125004 0.999996
+vt 0.187498 0.000020
+vt 0.187503 0.999995
+vt 0.249997 0.000018
+vt 0.250003 0.999994
+vt 0.312497 0.000017
+vt 0.312502 0.999994
+vt 0.374997 0.000015
+vt 0.375002 0.999993
+vt 0.437496 0.000014
+vt 0.437501 0.999993
+vt 0.402487 0.009601
+vt 0.597576 0.009614
+vt 0.691371 0.038072
+vt 0.777811 0.084282
+vt 0.853576 0.146469
+vt 0.915753 0.222242
+vt 0.961953 0.308689
+vt 0.990399 0.402487
+vt 1.000000 0.500033
+vt 0.990386 0.597577
+vt 0.961928 0.691370
+vt 0.915717 0.777811
+vt 0.853531 0.853575
+vt 0.777758 0.915753
+vt 0.691312 0.961952
+vt 0.597514 0.990398
+vt 0.402424 0.990386
+vt 0.308630 0.961928
+vt 0.222188 0.915717
+vt 0.146424 0.853531
+vt 0.084248 0.777759
+vt 0.038049 0.691313
+vt 0.009602 0.597515
+vt 0.000000 0.499970
+vt 0.009614 0.402425
+vt 0.038073 0.308630
+vt 0.084283 0.222189
+vt 0.146470 0.146424
+vt 0.222243 0.084248
+vt 0.308689 0.038048
+vt 0.499927 0.999999
+vt 0.084226 0.777725
+vt 0.000000 0.499927
+vt 0.222277 0.084224
+vt 0.500074 0.000000
+vt 0.915777 0.222279
+vt 1.000000 0.500077
+vt 0.777724 0.915775
+vn 0.000000 -0.685700 -0.727900
+vn 0.000000 0.685700 -0.727900
+vn 0.142000 0.685700 -0.713900
+vn 0.142000 -0.685700 -0.713900
+vn 0.278500 0.685700 -0.672500
+vn 0.278500 -0.685700 -0.672500
+vn 0.404400 0.685700 -0.605200
+vn 0.404400 -0.685700 -0.605200
+vn 0.514700 0.685700 -0.514700
+vn 0.514700 -0.685700 -0.514700
+vn 0.605200 0.685700 -0.404400
+vn 0.605200 -0.685700 -0.404400
+vn 0.672500 0.685700 -0.278500
+vn 0.672500 -0.685700 -0.278500
+vn 0.713900 0.685700 -0.142000
+vn 0.713900 -0.685700 -0.142000
+vn 0.727900 0.685700 0.000000
+vn 0.727900 -0.685700 0.000000
+vn 0.713900 0.685700 0.142000
+vn 0.713900 -0.685700 0.142000
+vn 0.672500 0.685700 0.278500
+vn 0.672500 -0.685700 0.278500
+vn 0.605200 0.685700 0.404400
+vn 0.605200 -0.685700 0.404400
+vn 0.514700 0.685700 0.514700
+vn 0.514700 -0.685700 0.514700
+vn 0.404400 0.685700 0.605200
+vn 0.404400 -0.685700 0.605200
+vn 0.278500 0.685700 0.672500
+vn 0.278500 -0.685700 0.672500
+vn 0.142000 0.685700 0.713900
+vn 0.142000 -0.685700 0.713900
+vn 0.000000 0.685700 0.727900
+vn 0.000000 -0.685700 0.727900
+vn -0.142000 0.685700 0.713900
+vn -0.142000 -0.685700 0.713900
+vn -0.278500 0.685700 0.672500
+vn -0.278500 -0.685700 0.672500
+vn -0.404400 0.685700 0.605200
+vn -0.404400 -0.685700 0.605200
+vn -0.514700 0.685700 0.514700
+vn -0.514700 -0.685700 0.514700
+vn -0.605200 0.685700 0.404400
+vn -0.605200 -0.685700 0.404400
+vn -0.672500 0.685700 0.278500
+vn -0.672500 -0.685700 0.278500
+vn -0.713900 0.685700 0.142000
+vn -0.713900 -0.685700 0.142000
+vn -0.727900 0.685700 0.000000
+vn -0.727900 -0.685700 0.000000
+vn -0.713900 0.685700 -0.142000
+vn -0.713900 -0.685700 -0.142000
+vn -0.672500 0.685700 -0.278500
+vn -0.672500 -0.685700 -0.278500
+vn -0.605200 0.685700 -0.404400
+vn -0.605200 -0.685700 -0.404400
+vn -0.514700 0.685700 -0.514700
+vn -0.514700 -0.685700 -0.514700
+vn -0.404400 0.685700 -0.605200
+vn -0.404400 -0.685700 -0.605200
+vn -0.278500 0.685700 -0.672500
+vn -0.278500 -0.685700 -0.672500
+vn -0.142000 0.685700 -0.713900
+vn -0.142000 -0.685700 -0.713900
+s 1
+f 1/1/1 2/2/2 4/3/3 3/4/4
+f 3/4/4 4/3/3 6/5/5 5/6/6
+f 5/6/6 6/5/5 8/7/7 7/8/8
+f 7/8/8 8/7/7 10/9/9 9/10/10
+f 9/10/10 10/9/9 12/11/11 11/12/12
+f 11/12/12 12/11/11 14/13/13 13/14/14
+f 13/14/14 14/13/13 16/15/15 15/16/16
+f 15/16/16 16/15/15 18/17/17 17/18/18
+f 17/19/18 18/20/17 20/21/19 19/22/20
+f 19/22/20 20/21/19 22/23/21 21/24/22
+f 21/24/22 22/23/21 24/25/23 23/26/24
+f 23/26/24 24/25/23 26/27/25 25/28/26
+f 25/28/26 26/27/25 28/29/27 27/30/28
+f 27/30/28 28/29/27 30/31/29 29/32/30
+f 29/32/30 30/31/29 32/33/31 31/34/32
+f 31/34/32 32/33/31 34/2/33 33/1/34
+f 33/1/34 34/2/33 36/3/35 35/4/36
+f 35/4/36 36/3/35 38/5/37 37/6/38
+f 37/6/38 38/5/37 40/7/39 39/8/40
+f 39/8/40 40/7/39 42/9/41 41/10/42
+f 41/10/42 42/9/41 44/11/43 43/12/44
+f 43/12/44 44/11/43 46/13/45 45/14/46
+f 45/14/46 46/13/45 48/15/47 47/16/48
+f 47/16/48 48/15/47 50/17/49 49/18/50
+f 49/19/50 50/20/49 52/21/51 51/22/52
+f 51/22/52 52/21/51 54/23/53 53/24/54
+f 53/24/54 54/23/53 56/25/55 55/26/56
+f 55/26/56 56/25/55 58/27/57 57/28/58
+f 57/28/58 58/27/57 60/29/59 59/30/60
+f 59/30/60 60/29/59 62/31/61 61/32/62
+f 4/35/3 2/2/2 64/36/63 62/37/61 60/38/59 58/39/57 56/40/55 54/41/53 52/42/51 50/43/49 48/44/47 46/45/45 44/46/43 42/47/41 40/48/39 38/49/37 36/50/35 34/1/33 32/51/31 30/52/29 28/53/27 26/54/25 24/55/23 22/56/21 20/57/19 18/58/17 16/59/15 14/60/13 12/61/11 10/62/9 8/63/7 6/64/5
+f 63/34/64 64/33/63 2/2/2 1/1/1
+f 61/32/62 62/31/61 64/33/63 63/34/64
+f 1/65/1 3/51/4 5/52/6 7/53/8 9/54/10 11/66/12 13/56/14 15/57/16 17/67/18 19/59/20 21/60/22 23/61/24 25/62/26 27/68/28 29/64/30 31/35/32 33/69/34 35/36/36 37/37/38 39/38/40 41/39/42 43/70/44 45/41/46 47/42/48 49/71/50 51/44/52 53/45/54 55/46/56 57/47/58 59/72/60 61/49/62 63/50/64
diff --git a/technic/technic/models/technic_cylinder_horizontal.obj b/technic/technic/models/technic_cylinder_horizontal.obj
new file mode 100644
index 0000000..d00b1d6
--- /dev/null
+++ b/technic/technic/models/technic_cylinder_horizontal.obj
@@ -0,0 +1,238 @@
+# Blender v2.73 (sub 0) OBJ File: 'technic-cylinder-horizontal.blend'
+# www.blender.org
+o Cylinder_Cylinder.001
+v 0.500000 0.000000 -0.500000
+v -0.500000 0.000000 -0.500000
+v 0.500000 0.097545 -0.490393
+v -0.500000 0.097545 -0.490393
+v 0.500000 0.191342 -0.461940
+v -0.500000 0.191342 -0.461940
+v 0.500000 0.277785 -0.415735
+v -0.500000 0.277785 -0.415735
+v 0.500000 0.353553 -0.353553
+v -0.500000 0.353553 -0.353554
+v 0.500000 0.415735 -0.277785
+v -0.500000 0.415735 -0.277785
+v 0.500000 0.461940 -0.191342
+v -0.500000 0.461940 -0.191342
+v 0.500000 0.490393 -0.097545
+v -0.500000 0.490393 -0.097545
+v 0.500000 0.500000 -0.000000
+v -0.500000 0.500000 -0.000000
+v 0.500000 0.490393 0.097545
+v -0.500000 0.490393 0.097545
+v 0.500000 0.461940 0.191342
+v -0.500000 0.461940 0.191341
+v 0.500000 0.415735 0.277785
+v -0.500000 0.415735 0.277785
+v 0.500000 0.353553 0.353553
+v -0.500000 0.353553 0.353553
+v 0.500000 0.277785 0.415735
+v -0.500000 0.277785 0.415735
+v 0.500000 0.191342 0.461940
+v -0.500000 0.191342 0.461940
+v 0.500000 0.097545 0.490393
+v -0.500000 0.097545 0.490392
+v 0.500000 -0.000000 0.500000
+v -0.500000 -0.000000 0.500000
+v 0.500000 -0.097546 0.490392
+v -0.500000 -0.097545 0.490392
+v 0.500000 -0.191342 0.461940
+v -0.500000 -0.191342 0.461939
+v 0.500000 -0.277785 0.415734
+v -0.500000 -0.277785 0.415734
+v 0.500000 -0.353554 0.353553
+v -0.500000 -0.353554 0.353553
+v 0.500000 -0.415735 0.277785
+v -0.500000 -0.415735 0.277785
+v 0.500000 -0.461940 0.191341
+v -0.500000 -0.461940 0.191341
+v 0.500000 -0.490393 0.097545
+v -0.500000 -0.490393 0.097544
+v 0.500000 -0.500000 -0.000001
+v -0.500000 -0.500000 -0.000001
+v 0.500000 -0.490393 -0.097546
+v -0.500000 -0.490393 -0.097546
+v 0.500000 -0.461940 -0.191342
+v -0.500000 -0.461940 -0.191343
+v 0.500000 -0.415734 -0.277786
+v -0.500000 -0.415734 -0.277786
+v 0.500000 -0.353553 -0.353554
+v -0.500000 -0.353553 -0.353554
+v 0.500000 -0.277785 -0.415735
+v -0.500000 -0.277784 -0.415735
+v 0.500000 -0.191341 -0.461940
+v -0.500000 -0.191341 -0.461940
+v 0.500000 -0.097544 -0.490393
+v -0.500000 -0.097544 -0.490393
+vt 0.000003 0.499996
+vt 0.999995 0.499995
+vt 0.999996 0.562495
+vt 0.000002 0.562496
+vt 0.999997 0.624995
+vt 0.000003 0.624996
+vt 0.999998 0.687496
+vt 0.000002 0.687496
+vt 0.999999 0.749997
+vt 0.000002 0.749996
+vt 0.999999 0.812497
+vt 0.000002 0.812497
+vt 1.000000 0.874997
+vt 0.000001 0.874997
+vt 1.000000 0.937498
+vt 0.000001 0.937497
+vt 1.000000 0.999998
+vt 0.000001 0.999998
+vt 0.000003 0.000005
+vt 0.999976 0.000001
+vt 0.999977 0.062500
+vt 0.000003 0.062505
+vt 0.999978 0.124999
+vt 0.000004 0.125004
+vt 0.999980 0.187498
+vt 0.000005 0.187503
+vt 0.999982 0.249997
+vt 0.000005 0.250003
+vt 0.999983 0.312497
+vt 0.000006 0.312502
+vt 0.999985 0.374997
+vt 0.000007 0.375001
+vt 0.999986 0.437496
+vt 0.000007 0.437501
+vt 0.009601 0.597512
+vt 0.009614 0.402424
+vt 0.038072 0.308628
+vt 0.084283 0.222189
+vt 0.146469 0.146424
+vt 0.222242 0.084247
+vt 0.308689 0.038047
+vt 0.402487 0.009601
+vt 0.500033 -0.000000
+vt 0.597577 0.009613
+vt 0.691371 0.038072
+vt 0.777811 0.084283
+vt 0.853575 0.146469
+vt 0.915753 0.222242
+vt 0.961952 0.308688
+vt 0.990398 0.402486
+vt 0.990386 0.597576
+vt 0.961928 0.691370
+vt 0.915717 0.777812
+vt 0.853531 0.853576
+vt 0.777759 0.915752
+vt 0.691313 0.961951
+vt 0.597515 0.990398
+vt 0.499970 1.000000
+vt 0.402425 0.990386
+vt 0.308630 0.961927
+vt 0.222189 0.915717
+vt 0.146424 0.853530
+vt 0.084248 0.777757
+vt 0.038048 0.691311
+vt 0.999999 0.500073
+vt 0.777724 0.915774
+vt 0.499927 0.999999
+vt 0.084224 0.777723
+vt 0.000000 0.499925
+vt 0.222279 0.084223
+vt 0.500078 -0.000000
+vt 0.915775 0.222276
+vn 0.685700 0.000000 -0.727900
+vn -0.685700 0.000000 -0.727900
+vn -0.685700 0.142000 -0.713900
+vn 0.685700 0.142000 -0.713900
+vn -0.685700 0.278500 -0.672500
+vn 0.685700 0.278500 -0.672500
+vn -0.685700 0.404400 -0.605200
+vn 0.685700 0.404400 -0.605200
+vn -0.685700 0.514700 -0.514700
+vn 0.685700 0.514700 -0.514700
+vn -0.685700 0.605200 -0.404400
+vn 0.685700 0.605200 -0.404400
+vn -0.685700 0.672500 -0.278500
+vn 0.685700 0.672500 -0.278500
+vn -0.685700 0.713900 -0.142000
+vn 0.685700 0.713900 -0.142000
+vn -0.685700 0.727900 0.000000
+vn 0.685700 0.727900 0.000000
+vn -0.685700 0.713900 0.142000
+vn 0.685700 0.713900 0.142000
+vn -0.685700 0.672500 0.278500
+vn 0.685700 0.672500 0.278500
+vn -0.685700 0.605200 0.404400
+vn 0.685700 0.605200 0.404400
+vn -0.685700 0.514700 0.514700
+vn 0.685700 0.514700 0.514700
+vn -0.685700 0.404400 0.605200
+vn 0.685700 0.404400 0.605200
+vn -0.685700 0.278500 0.672500
+vn 0.685700 0.278500 0.672500
+vn -0.685700 0.142000 0.713900
+vn 0.685700 0.142000 0.713900
+vn -0.685700 0.000000 0.727900
+vn 0.685700 0.000000 0.727900
+vn -0.685700 -0.142000 0.713900
+vn 0.685700 -0.142000 0.713900
+vn -0.685700 -0.278500 0.672500
+vn 0.685700 -0.278500 0.672500
+vn -0.685700 -0.404400 0.605200
+vn 0.685700 -0.404400 0.605200
+vn -0.685700 -0.514700 0.514700
+vn 0.685700 -0.514700 0.514700
+vn -0.685700 -0.605200 0.404400
+vn 0.685700 -0.605200 0.404400
+vn -0.685700 -0.672500 0.278500
+vn 0.685700 -0.672500 0.278500
+vn -0.685700 -0.713900 0.142000
+vn 0.685700 -0.713900 0.142000
+vn -0.685700 -0.727900 0.000000
+vn 0.685700 -0.727900 0.000000
+vn -0.685700 -0.713900 -0.142000
+vn 0.685700 -0.713900 -0.142000
+vn -0.685700 -0.672500 -0.278500
+vn 0.685700 -0.672500 -0.278500
+vn -0.685700 -0.605200 -0.404400
+vn 0.685700 -0.605200 -0.404400
+vn -0.685700 -0.514700 -0.514700
+vn 0.685700 -0.514700 -0.514700
+vn -0.685700 -0.404400 -0.605200
+vn 0.685700 -0.404400 -0.605200
+vn -0.685700 -0.278500 -0.672500
+vn 0.685700 -0.278500 -0.672500
+vn -0.685700 -0.142000 -0.713900
+vn 0.685700 -0.142000 -0.713900
+s 1
+f 1/1/1 2/2/2 4/3/3 3/4/4
+f 3/4/4 4/3/3 6/5/5 5/6/6
+f 5/6/6 6/5/5 8/7/7 7/8/8
+f 7/8/8 8/7/7 10/9/9 9/10/10
+f 9/10/10 10/9/9 12/11/11 11/12/12
+f 11/12/12 12/11/11 14/13/13 13/14/14
+f 13/14/14 14/13/13 16/15/15 15/16/16
+f 15/16/16 16/15/15 18/17/17 17/18/18
+f 17/19/18 18/20/17 20/21/19 19/22/20
+f 19/22/20 20/21/19 22/23/21 21/24/22
+f 21/24/22 22/23/21 24/25/23 23/26/24
+f 23/26/24 24/25/23 26/27/25 25/28/26
+f 25/28/26 26/27/25 28/29/27 27/30/28
+f 27/30/28 28/29/27 30/31/29 29/32/30
+f 29/32/30 30/31/29 32/33/31 31/34/32
+f 31/34/32 32/33/31 34/2/33 33/1/34
+f 33/1/34 34/2/33 36/3/35 35/4/36
+f 35/4/36 36/3/35 38/5/37 37/6/38
+f 37/6/38 38/5/37 40/7/39 39/8/40
+f 39/8/40 40/7/39 42/9/41 41/10/42
+f 41/10/42 42/9/41 44/11/43 43/12/44
+f 43/12/44 44/11/43 46/13/45 45/14/46
+f 45/14/46 46/13/45 48/15/47 47/16/48
+f 47/16/48 48/15/47 50/17/49 49/18/50
+f 49/19/50 50/20/49 52/21/51 51/22/52
+f 51/22/52 52/21/51 54/23/53 53/24/54
+f 53/24/54 54/23/53 56/25/55 55/26/56
+f 55/26/56 56/25/55 58/27/57 57/28/58
+f 57/28/58 58/27/57 60/29/59 59/30/60
+f 59/30/60 60/29/59 62/31/61 61/32/62
+f 4/35/3 2/1/2 64/36/63 62/37/61 60/38/59 58/39/57 56/40/55 54/41/53 52/42/51 50/43/49 48/44/47 46/45/45 44/46/43 42/47/41 40/48/39 38/49/37 36/50/35 34/2/33 32/51/31 30/52/29 28/53/27 26/54/25 24/55/23 22/56/21 20/57/19 18/58/17 16/59/15 14/60/13 12/61/11 10/62/9 8/63/7 6/64/5
+f 63/34/64 64/33/63 2/2/2 1/1/1
+f 61/32/62 62/31/61 64/33/63 63/34/64
+f 1/65/1 3/51/4 5/52/6 7/53/8 9/54/10 11/66/12 13/56/14 15/57/16 17/67/18 19/59/20 21/60/22 23/61/24 25/62/26 27/68/28 29/64/30 31/35/32 33/69/34 35/36/36 37/37/38 39/38/40 41/39/42 43/70/44 45/41/46 47/42/48 49/71/50 51/44/52 53/45/54 55/46/56 57/47/58 59/72/60 61/49/62 63/50/64
diff --git a/technic/technic/models/technic_innercorner.obj b/technic/technic/models/technic_innercorner.obj
new file mode 100644
index 0000000..c962aeb
--- /dev/null
+++ b/technic/technic/models/technic_innercorner.obj
@@ -0,0 +1,33 @@
+# Blender v2.73 (sub 0) OBJ File: 'technic-icorner.blend'
+# www.blender.org
+o Cube_Cube.000
+v -0.500000 0.500000 0.500000
+v -0.500000 0.500000 -0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 -0.500000
+v 0.500000 0.500000 0.500000
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 -0.500000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vn -0.000000 -0.000000 1.000000
+vn -0.000000 -0.000000 -1.000000
+vn 0.707100 0.707100 -0.000000
+vn 1.000000 0.000000 -0.000000
+vn 0.000000 -1.000000 -0.000000
+vn -1.000000 -0.000000 -0.000000
+vn 0.000000 0.707100 -0.707100
+s off
+f 6/1/1 1/2/1 7/3/1 8/4/1
+f 2/1/2 5/3/2 3/4/2
+f 2/1/3 1/2/3 5/4/3
+f 6/2/4 8/3/4 9/4/4
+f 9/1/5 8/2/5 7/3/5 3/4/5
+f 3/3/6 7/4/6 1/1/6 2/2/6
+f 1/1/7 6/2/7 9/3/7
+l 1 4
+l 3 4
diff --git a/technic/technic/models/technic_innercorner_upsdown.obj b/technic/technic/models/technic_innercorner_upsdown.obj
new file mode 100644
index 0000000..68eb560
--- /dev/null
+++ b/technic/technic/models/technic_innercorner_upsdown.obj
@@ -0,0 +1,33 @@
+# Blender v2.73 (sub 0) OBJ File: 'technic-icorner-upsdown.blend'
+# www.blender.org
+o Cube_Cube.000
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 0.500000
+v 0.500000 0.500000 0.500000
+v -0.500000 0.500000 0.500000
+v 0.500000 0.500000 -0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.500000 0.500000 0.500000
+v -0.500000 0.500000 -0.500000
+v 0.500000 0.500000 -0.500000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn 1.000000 -0.000000 0.000000
+vn -0.000000 -0.707100 -0.707100
+vn -0.000000 0.000000 -1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.707100 -0.707100 -0.000000
+s off
+f 6/1/1 1/2/1 7/3/1 8/4/1
+f 2/1/2 5/3/2 3/4/2
+f 2/1/3 1/2/3 5/4/3
+f 6/2/4 8/3/4 9/4/4
+f 9/1/5 8/2/5 7/3/5 3/4/5
+f 3/3/6 7/4/6 1/1/6 2/2/6
+f 1/1/7 6/2/7 9/3/7
+l 1 4
+l 3 4
diff --git a/technic/technic/models/technic_oblate_spheroid.obj b/technic/technic/models/technic_oblate_spheroid.obj
new file mode 100644
index 0000000..e949f5b
--- /dev/null
+++ b/technic/technic/models/technic_oblate_spheroid.obj
@@ -0,0 +1,300 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_blob_onetexture.blend'
+# www.blender.org
+o Cube
+v 0.213679 -0.450000 -0.213679
+v -0.213679 -0.450000 0.213680
+v 0.213680 -0.450000 0.213680
+v -0.213679 -0.450000 -0.213679
+v 0.213679 0.450000 -0.213679
+v -0.213679 0.450000 -0.213679
+v 0.213679 0.450000 0.213680
+v 0.500000 -0.000003 0.500000
+v 0.277785 -0.415735 0.277785
+v -0.277785 -0.415735 0.277785
+v 0.353553 -0.353554 0.353553
+v -0.353553 -0.353554 0.353553
+v -0.500000 -0.000002 0.500000
+v 0.415735 -0.277786 0.415735
+v -0.277785 0.415735 0.277785
+v 0.277785 0.415735 0.277785
+v -0.415735 -0.277785 0.415735
+v 0.353554 0.353553 0.353554
+v -0.500000 -0.000002 -0.499983
+v 0.461940 -0.191342 0.461940
+v -0.461940 -0.191342 0.461940
+v -0.353553 0.353553 0.353554
+v 0.490393 -0.097546 0.490393
+v 0.500000 -0.000002 -0.500000
+v 0.490393 0.097545 -0.490392
+v 0.490393 0.097545 0.490393
+v -0.490393 -0.097546 0.490393
+v 0.490393 -0.097545 -0.490393
+v 0.461940 0.191341 0.461940
+v -0.461940 0.191341 0.461940
+v 0.461940 0.191342 -0.461940
+v -0.490393 0.097545 0.490393
+v 0.415735 0.277785 0.415735
+v -0.490393 0.097545 -0.490392
+v -0.415735 0.277785 0.415735
+v 0.461940 -0.191341 -0.461940
+v 0.415735 0.277785 -0.415735
+v -0.461940 0.191341 -0.461940
+v -0.415735 0.277785 -0.415735
+v 0.415735 -0.277785 -0.415735
+v -0.490393 -0.097546 -0.490392
+v 0.353553 0.353553 -0.353553
+v -0.213679 0.450000 0.213680
+v -0.353553 0.353553 -0.353553
+v 0.277785 0.415735 -0.277785
+v -0.461940 -0.191342 -0.461939
+v 0.353554 -0.353553 -0.353554
+v -0.277785 0.415735 -0.277785
+v -0.415735 -0.277785 -0.415734
+v 0.277786 -0.415735 -0.277785
+v -0.353553 -0.353554 -0.353553
+v -0.277785 -0.415735 -0.277784
+vt 0.038487 0.679029
+vt 0.010047 0.589789
+vt 0.990397 0.589790
+vt 0.915772 0.767073
+vt 0.084671 0.767071
+vt 0.961957 0.679029
+vt 0.852473 0.146294
+vt 0.914576 0.232749
+vt 0.084146 0.232744
+vt 0.712776 0.000003
+vt 0.221926 0.061588
+vt 0.285951 0.000000
+vt 0.285945 0.999818
+vt 0.221920 0.938229
+vt 0.712771 0.999818
+vt 0.009578 0.589789
+vt 0.989138 0.589792
+vt 0.960721 0.679031
+vt 0.286638 0.000000
+vt 0.777884 0.061589
+vt 0.222561 0.061589
+vt 0.777608 0.938229
+vt 0.222164 0.938229
+vt 0.146413 0.853527
+vt 0.286255 0.999818
+vt 0.713517 0.999818
+vt 0.776800 0.061592
+vt 0.146251 0.146290
+vt 0.000000 0.499907
+vt 0.989139 0.410032
+vt 0.998734 0.499910
+vt 0.853618 0.146291
+vt 0.915772 0.232746
+vt 0.146826 0.146290
+vt 0.961957 0.320789
+vt 0.084672 0.232745
+vt 0.990397 0.410029
+vt 0.038487 0.320789
+vt 0.776796 0.938230
+vt 0.777790 0.938229
+vt 0.146467 0.853526
+vt 0.853556 0.853527
+vt 0.146825 0.853526
+vt 1.000000 0.499907
+vt 0.010047 0.410028
+vt 0.146246 0.853527
+vt 0.222559 0.938228
+vt 0.777882 0.938230
+vt 0.915737 0.767073
+vt 0.084287 0.767072
+vt 0.038083 0.679029
+vt 0.961941 0.679029
+vt 0.037995 0.679029
+vt 0.960723 0.320792
+vt 0.037998 0.320787
+vt 0.009580 0.410028
+vt 0.990167 0.589790
+vt 0.999772 0.499909
+vt 0.961721 0.679029
+vt 0.084246 0.767072
+vt 0.915526 0.767072
+vt 0.853359 0.853527
+vt 0.914573 0.767074
+vt 0.084142 0.767072
+vt 0.852470 0.853528
+vt 0.777609 0.061590
+vt 0.853360 0.146293
+vt 0.222166 0.061589
+vt 0.146414 0.146291
+vt 0.915527 0.232748
+vt 0.084247 0.232746
+vt 0.961721 0.320791
+vt 0.038052 0.320789
+vt 0.990167 0.410031
+vt 0.713686 0.999818
+vt 0.749950 0.250050
+vt 0.749950 0.749950
+vt 0.250050 0.749950
+vt 0.250050 0.250050
+vt 0.713807 0.000000
+vt 0.286258 0.000000
+vt 0.713519 0.000001
+vt 0.250050 0.250050
+vt 0.749950 0.250050
+vt 0.749950 0.749950
+vt 0.286636 0.999817
+vt 0.777791 0.061589
+vt 0.146467 0.146291
+vt 0.084287 0.232745
+vt 0.915737 0.232746
+vt 0.961941 0.320789
+vt 0.000444 0.499907
+vt 0.713687 0.000000
+vt 0.713805 0.999818
+vn -0.620400 0.479600 0.620400
+vn -0.683900 0.254100 0.683900
+vn 0.683900 0.254100 0.683900
+vn 0.531000 0.660300 0.531000
+vn -0.531000 0.660300 0.531000
+vn 0.620400 0.479600 0.620400
+vn -0.429700 -0.794100 0.429700
+vn -0.531000 -0.660300 0.531000
+vn -0.531000 -0.660300 -0.531000
+vn -0.185700 -0.964900 0.185700
+vn -0.325800 -0.887500 -0.325800
+vn -0.185700 -0.964900 -0.185700
+vn -0.185700 0.964900 -0.185700
+vn -0.325800 0.887500 -0.325800
+vn -0.185700 0.964900 0.185700
+vn -0.683900 0.254000 -0.683900
+vn 0.325800 -0.887500 0.325800
+vn -0.325800 -0.887500 0.325800
+vn 0.325800 0.887500 -0.325800
+vn 0.429700 0.794100 -0.429700
+vn 0.185700 0.964900 -0.185700
+vn -0.429700 -0.794100 -0.429700
+vn -0.707100 0.000000 -0.707100
+vn -0.683900 -0.254100 0.683900
+vn -0.707100 0.000000 0.707100
+vn 0.429700 -0.794100 0.429700
+vn 0.531000 -0.660300 0.531000
+vn 0.620400 -0.479600 0.620400
+vn 0.683900 -0.254100 0.683900
+vn -0.620400 -0.479600 0.620400
+vn -0.325800 0.887500 0.325800
+vn 0.185700 0.964900 0.185700
+vn 0.325800 0.887500 0.325800
+vn 0.429700 0.794100 0.429700
+vn -0.429700 0.794100 0.429700
+vn 0.707100 0.000000 0.707100
+vn -0.429700 0.794100 -0.429700
+vn 0.531000 0.660300 -0.531000
+vn 0.683900 0.254100 -0.683900
+vn 0.707100 0.000000 -0.707100
+vn 0.620400 0.479600 -0.620400
+vn -0.620400 0.479600 -0.620400
+vn -0.620400 -0.479600 -0.620400
+vn -0.683900 -0.254000 -0.683900
+vn 0.683900 -0.254100 -0.683900
+vn -0.531000 0.660300 -0.531000
+vn 0.325800 -0.887500 -0.325800
+vn 0.429700 -0.794100 -0.429700
+vn 0.531000 -0.660300 -0.531000
+vn 0.620400 -0.479600 -0.620400
+vn 0.185700 -0.964900 -0.185700
+vn 0.185700 -0.964900 0.185700
+s 1
+f 30/1/1 32/2/2 26/3/3
+f 33/4/4 35/5/5 29/6/6
+f 12/7/7 17/8/8 49/9/9
+f 2/10/10 52/11/11 4/12/12
+f 6/13/13 48/14/14 43/15/15
+f 34/16/16 32/17/2 30/18/1
+f 2/19/10 9/20/17 10/21/18
+f 48/22/14 45/23/19 42/24/20
+f 5/25/21 45/23/19 6/26/13
+f 10/27/18 12/7/7 51/28/22
+f 19/29/23 27/30/24 13/31/25
+f 9/20/17 11/32/26 10/21/18
+f 11/32/26 14/33/27 12/34/7
+f 14/33/27 20/35/28 17/36/8
+f 20/35/28 23/37/29 21/38/30
+f 43/15/15 48/14/14 15/39/31
+f 7/25/32 16/23/33 45/40/19
+f 18/41/34 42/42/20 45/40/19
+f 29/6/6 30/1/1 26/3/3
+f 22/43/35 33/4/4 18/42/34
+f 26/3/3 32/2/2 8/44/36
+f 8/44/36 27/45/24 23/37/29
+f 11/32/26 12/34/7 10/21/18
+f 14/33/27 17/36/8 12/34/7
+f 20/35/28 21/38/30 17/36/8
+f 23/37/29 27/45/24 21/38/30
+f 10/27/18 52/11/11 2/10/10
+f 15/39/31 48/14/14 44/46/37
+f 22/43/35 35/5/5 33/4/4
+f 15/47/31 22/43/35 16/48/33
+f 37/49/38 42/42/20 18/41/34
+f 33/50/4 29/51/6 37/49/38
+f 8/29/36 25/3/39 26/16/3
+f 24/44/40 25/3/39 8/29/36
+f 29/51/6 26/16/3 31/52/41
+f 26/16/3 25/3/39 31/52/41
+f 29/51/6 31/52/41 37/49/38
+f 38/53/42 34/16/16 30/18/1
+f 19/29/23 32/17/2 34/16/16
+f 13/31/25 32/17/2 19/29/23
+f 17/8/8 21/54/30 46/55/43
+f 21/54/30 27/30/24 41/56/44
+f 8/29/36 28/37/45 24/44/40
+f 34/57/16 25/16/39 19/58/23
+f 38/59/42 31/51/41 34/57/16
+f 31/51/41 25/16/39 34/57/16
+f 37/60/38 38/59/42 39/61/46
+f 37/60/38 31/51/41 38/59/42
+f 44/62/37 42/24/20 37/60/38
+f 38/53/42 30/18/1 35/63/5
+f 39/64/46 35/63/5 22/65/35
+f 52/66/11 51/67/22 50/68/47
+f 51/67/22 47/69/48 50/68/47
+f 51/67/22 49/70/9 47/69/48
+f 49/70/9 40/71/49 47/69/48
+f 49/70/9 46/72/43 40/71/49
+f 46/72/43 36/73/50 40/71/49
+f 19/58/23 28/56/45 41/74/44
+f 46/72/43 41/74/44 36/73/50
+f 41/74/44 28/56/45 36/73/50
+f 22/43/35 18/42/34 16/48/33
+f 5/75/21 7/25/32 45/40/19
+f 2/76/10 4/77/12 1/78/51 3/79/52
+f 44/62/37 48/22/14 42/24/20
+f 35/5/5 30/1/1 29/6/6
+f 3/80/52 9/20/17 2/19/10
+f 45/23/19 48/22/14 6/26/13
+f 1/81/51 52/66/11 50/68/47
+f 39/61/46 44/62/37 37/60/38
+f 52/66/11 1/81/51 4/82/12
+f 24/29/40 28/56/45 19/58/23
+f 7/78/32 5/83/21 6/84/13 43/85/15
+f 24/29/40 19/58/23 25/16/39
+f 15/47/31 16/48/33 43/86/15
+f 22/65/35 44/46/37 39/64/46
+f 39/64/46 38/53/42 35/63/5
+f 41/56/44 27/30/24 19/29/23
+f 46/55/43 21/54/30 41/56/44
+f 49/9/9 17/8/8 46/55/43
+f 51/28/22 12/7/7 49/9/9
+f 52/11/11 10/27/18 51/28/22
+f 9/68/17 50/87/47 11/88/26
+f 50/87/47 47/32/48 11/88/26
+f 11/88/26 47/32/48 14/89/27
+f 47/32/48 40/90/49 14/89/27
+f 14/89/27 40/90/49 20/73/28
+f 40/90/49 36/91/50 20/73/28
+f 23/56/29 28/37/45 8/29/36
+f 20/73/28 36/91/50 23/56/29
+f 36/91/50 28/37/45 23/56/29
+f 13/92/25 8/44/36 32/2/2
+f 50/87/47 9/68/17 1/93/51
+f 13/92/25 27/45/24 8/44/36
+f 16/23/33 18/41/34 45/40/19
+f 22/65/35 15/39/31 44/46/37
+f 9/68/17 3/81/52 1/93/51
+f 33/50/4 37/49/38 18/41/34
+f 43/86/15 16/48/33 7/94/32
diff --git a/technic/technic/models/technic_one_curved_edge.obj b/technic/technic/models/technic_one_curved_edge.obj
new file mode 100644
index 0000000..bb82040
--- /dev/null
+++ b/technic/technic/models/technic_one_curved_edge.obj
@@ -0,0 +1,132 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_quarter_round_onetexture.blend'
+# www.blender.org
+o Cylinder
+v -0.500000 0.490393 -0.097545
+v 0.500000 0.490393 -0.097545
+v -0.500000 0.461940 -0.191342
+v 0.500000 0.461940 -0.191342
+v -0.500000 0.415735 -0.277785
+v 0.500000 0.415735 -0.277785
+v -0.500000 0.353553 -0.353553
+v 0.500000 0.353553 -0.353553
+v -0.500000 0.277785 -0.415735
+v 0.500000 0.277785 -0.415735
+v -0.500000 0.191342 -0.461940
+v 0.500000 0.191342 -0.461940
+v -0.500000 0.097545 -0.490393
+v 0.500000 0.097545 -0.490393
+v 0.500000 -0.000000 -0.500000
+v 0.500000 0.490393 -0.097545
+v -0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 -0.500000
+v -0.500000 0.500000 0.500000
+v 0.500000 0.500000 0.500000
+v -0.500000 0.000000 -0.500000
+v -0.500000 0.500000 -0.000000
+v 0.500000 0.500000 0.000000
+v -0.500000 0.490393 -0.097545
+v -0.500000 0.461940 -0.191342
+v -0.500000 0.415735 -0.277785
+v -0.500000 0.353553 -0.353553
+v -0.500000 0.277785 -0.415735
+v -0.500000 0.191342 -0.461940
+v -0.500000 0.097545 -0.490393
+v -0.500000 0.000000 0.000000
+v -0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.500000 0.500000 0.500000
+v -0.500000 0.000000 -0.500000
+v -0.500000 0.500000 -0.000000
+v 0.500000 0.461940 -0.191342
+v 0.500000 0.415735 -0.277785
+v 0.500000 0.353553 -0.353553
+v 0.500000 0.277785 -0.415735
+v 0.500000 0.191342 -0.461940
+v 0.500000 0.097545 -0.490393
+v 0.500000 -0.000000 -0.500000
+v 0.500000 -0.000000 -0.000000
+v 0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 0.500000
+v 0.500000 0.500000 0.500000
+v 0.500000 0.500000 0.000000
+v -0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 0.500000
+v -0.500000 0.500000 0.500000
+v 0.500000 0.500000 0.500000
+vt 1.000000 0.000000
+vt 1.000000 0.500000
+vt 0.500001 0.500000
+vt 0.500001 1.000000
+vt 0.000003 1.000000
+vt 0.000003 0.000000
+vt 0.597546 0.990393
+vt 0.691342 0.961940
+vt 1.000000 1.000000
+vt 0.990393 0.597545
+vt 0.961940 0.691341
+vt 0.777786 0.915735
+vt 0.853554 0.853553
+vt 0.915735 0.777785
+vt 0.146446 0.853552
+vt 0.084265 0.777783
+vt 0.038060 0.691340
+vt 0.308658 0.961938
+vt 0.222214 0.915733
+vt 0.000000 0.499999
+vt 0.402454 0.990391
+vt 0.009607 0.597544
+vt 1.000000 0.375000
+vt 0.000000 0.375000
+vt 0.000000 0.250000
+vt 1.000000 0.250000
+vt 0.000000 0.125000
+vt 1.000000 0.125000
+vt 0.000000 0.875000
+vt 1.000000 0.875000
+vt 0.000000 0.750000
+vt 1.000000 0.750000
+vt 0.000000 0.625000
+vt 1.000000 0.625000
+vn 1.000000 -0.000000 0.000000
+vn -0.000000 0.000000 1.000000
+vn -0.000000 -1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.980800 -0.195100
+vn 0.000000 0.923900 -0.382700
+vn -0.000000 0.831500 -0.555600
+vn -0.000000 0.707100 -0.707100
+vn -0.000000 0.555600 -0.831500
+vn -0.000000 0.382700 -0.923900
+vn -0.000000 0.195100 -0.980800
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 0.998800 -0.049100
+vn -0.000000 0.049100 -0.998800
+vn -0.000000 0.000000 -1.000000
+s off
+f 46/1/1 44/2/1 45/3/1 49/4/1 48/5/1 47/6/1
+f 16/7/1 49/4/1 45/3/1 38/8/1
+f 55/5/2 53/6/2 54/1/2 56/9/2
+f 43/10/1 42/11/1 45/3/1 44/2/1
+f 39/12/1 38/8/1 45/3/1 40/13/1
+f 41/14/1 40/13/1 45/3/1 42/11/1
+f 50/9/3 51/5/3 52/6/3 17/1/3
+f 28/15/4 29/16/4 30/17/4 32/3/4
+f 26/18/4 27/19/4 28/15/4 32/3/4
+f 35/9/4 37/4/4 32/3/4 36/20/4 34/6/4 33/1/4
+f 37/4/4 25/21/4 26/18/4 32/3/4
+f 30/17/4 31/22/4 36/20/4 32/3/4
+s 1
+f 1/23/5 2/24/5 4/25/6 3/26/6
+f 3/26/6 4/25/6 6/27/7 5/28/7
+f 5/28/7 6/27/7 8/6/8 7/1/8
+f 7/9/8 8/5/8 10/29/9 9/30/9
+f 9/30/9 10/29/9 12/31/10 11/32/10
+f 11/32/10 12/31/10 14/33/11 13/34/11
+f 21/5/12 24/20/13 23/2/13 20/9/12
+f 13/34/11 14/33/11 15/20/14 22/2/14
+f 23/2/13 24/20/13 2/24/5 1/23/5
+f 18/1/15 22/2/14 15/20/14 19/6/15
diff --git a/technic/technic/models/technic_outercorner.obj b/technic/technic/models/technic_outercorner.obj
new file mode 100644
index 0000000..60ccae6
--- /dev/null
+++ b/technic/technic/models/technic_outercorner.obj
@@ -0,0 +1,23 @@
+# Blender v2.73 (sub 0) OBJ File: 'technic-ocorner.blend'
+# www.blender.org
+o Cube_Cube.002
+v -0.500000 0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 0.500000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vn 0.000000 -1.000000 -0.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 -0.000000 0.000000
+vn -0.000000 0.707100 -0.707100
+vn 0.707100 0.707100 -0.000000
+s off
+f 3/1/1 2/2/1 4/3/1 5/4/1
+f 1/2/2 3/3/2 5/4/2
+f 1/1/3 2/3/3 3/4/3
+f 1/1/4 4/3/4 2/4/4
+f 1/2/5 5/3/5 4/4/5
diff --git a/technic/technic/models/technic_outercorner_upsdown.obj b/technic/technic/models/technic_outercorner_upsdown.obj
new file mode 100644
index 0000000..c89de8a
--- /dev/null
+++ b/technic/technic/models/technic_outercorner_upsdown.obj
@@ -0,0 +1,23 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_ocorner_onetexture.blend'
+# www.blender.org
+o Cube_Cube.002
+v -0.500000 -0.500000 0.500000
+v 0.500000 0.500000 0.500000
+v -0.500000 0.500000 0.500000
+v 0.500000 0.500000 -0.500000
+v -0.500000 0.500000 -0.500000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn 0.000000 1.000000 -0.000000
+vn -1.000000 0.000000 -0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.707100 -0.707100 0.000000
+vn -0.000000 -0.707100 -0.707100
+s off
+f 3/1/1 2/2/1 4/3/1 5/4/1
+f 1/2/2 3/3/2 5/4/2
+f 1/1/3 2/3/3 3/4/3
+f 1/1/4 4/3/4 2/4/4
+f 1/2/5 5/3/5 4/4/5
diff --git a/technic/technic/models/technic_pyramid.obj b/technic/technic/models/technic_pyramid.obj
new file mode 100644
index 0000000..a618dcf
--- /dev/null
+++ b/technic/technic/models/technic_pyramid.obj
@@ -0,0 +1,24 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_short_onetexture.blend'
+# www.blender.org
+o Cube
+v 0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.000000 0.000000 -0.000000
+vt 1.000000 0.500000
+vt 0.000000 0.500000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.500000 0.500000
+vn 0.000000 -1.000000 0.000000
+vn -0.707100 0.707100 -0.000000
+vn 0.000000 0.707100 -0.707100
+vn 0.707100 0.707100 0.000000
+vn -0.000000 0.707100 0.707100
+s off
+f 1/1/1 2/2/1 3/3/1 4/4/1
+f 3/4/2 5/5/2 4/3/2
+f 5/5/3 1/3/3 4/4/3
+f 1/4/4 5/5/4 2/3/4
+f 2/4/5 5/5/5 3/3/5
diff --git a/technic/technic/models/technic_pyramid_spike.obj b/technic/technic/models/technic_pyramid_spike.obj
new file mode 100644
index 0000000..b305af2
--- /dev/null
+++ b/technic/technic/models/technic_pyramid_spike.obj
@@ -0,0 +1,24 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_pyramid_onetexture.blend'
+# www.blender.org
+o Cube
+v 0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v -0.000000 0.500000 -0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.500000 1.000000
+vn 0.000000 -1.000000 0.000000
+vn -0.894400 0.447200 -0.000000
+vn 0.000000 0.447200 -0.894400
+vn 0.894400 0.447200 0.000000
+vn -0.000000 0.447200 0.894400
+s off
+f 1/1/1 2/2/1 3/3/1 4/4/1
+f 3/4/2 5/5/2 4/3/2
+f 5/5/3 1/3/3 4/4/3
+f 1/4/4 5/5/4 2/3/4
+f 2/4/5 5/5/5 3/3/5
diff --git a/technic/technic/models/technic_slope.obj b/technic/technic/models/technic_slope.obj
new file mode 100644
index 0000000..f6f4860
--- /dev/null
+++ b/technic/technic/models/technic_slope.obj
@@ -0,0 +1,24 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_slope_onetexture.blend'
+# www.blender.org
+o Cube_Cube.002
+v 0.500000 0.500000 0.500000
+v -0.500000 0.500000 0.500000
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 0.500000
+v -0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 -0.500000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 -1.000000 -0.000000
+vn -1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.707100 -0.707100
+s off
+f 1/1/1 2/2/1 3/3/1 4/4/1
+f 4/3/2 3/4/2 5/1/2 6/2/2
+f 2/1/3 5/3/3 3/4/3
+f 1/2/4 4/3/4 6/4/4
+f 2/1/5 1/2/5 6/3/5 5/4/5
diff --git a/technic/technic/models/technic_slope_horizontal.obj b/technic/technic/models/technic_slope_horizontal.obj
new file mode 100644
index 0000000..4866a92
--- /dev/null
+++ b/technic/technic/models/technic_slope_horizontal.obj
@@ -0,0 +1,24 @@
+# Blender v2.73 (sub 0) OBJ File: 'technic-slope-horizontal.blend'
+# www.blender.org
+o Cube_Cube.002
+v -0.500000 0.500000 0.500000
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 0.500000
+v 0.500000 0.500000 0.500000
+v 0.500000 -0.500000 -0.500000
+v 0.500000 0.500000 -0.500000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 1.000000 -0.000000 -0.000000
+vn -0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 -0.000000
+vn -0.707100 0.000000 -0.707100
+s off
+f 1/1/1 2/2/1 3/3/1 4/4/1
+f 4/1/2 3/2/2 5/3/2 6/4/2
+f 2/3/3 5/1/3 3/2/3
+f 1/4/4 4/1/4 6/2/4
+f 2/3/5 1/4/5 6/1/5 5/2/5
diff --git a/technic/technic/models/technic_slope_upsdown.obj b/technic/technic/models/technic_slope_upsdown.obj
new file mode 100644
index 0000000..6880595
--- /dev/null
+++ b/technic/technic/models/technic_slope_upsdown.obj
@@ -0,0 +1,24 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_slope_onetexture.blend'
+# www.blender.org
+o Cube_Cube.002
+v -0.500000 -0.500000 0.500000
+v 0.500000 -0.500000 0.500000
+v 0.500000 0.500000 0.500000
+v -0.500000 0.500000 0.500000
+v 0.500000 0.500000 -0.500000
+v -0.500000 0.500000 -0.500000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 -0.000000
+vn 1.000000 -0.000000 0.000000
+vn -1.000000 0.000000 -0.000000
+vn -0.000000 -0.707100 -0.707100
+s off
+f 1/1/1 2/2/1 3/3/1 4/4/1
+f 4/3/2 3/4/2 5/1/2 6/2/2
+f 2/1/3 5/3/3 3/4/3
+f 1/2/4 4/3/4 6/4/4
+f 2/1/5 1/2/5 6/3/5 5/4/5
diff --git a/technic/technic/models/technic_sphere.obj b/technic/technic/models/technic_sphere.obj
new file mode 100644
index 0000000..772b570
--- /dev/null
+++ b/technic/technic/models/technic_sphere.obj
@@ -0,0 +1,1927 @@
+# Blender v2.73 (sub 0) OBJ File: 'globe.blend'
+# www.blender.org
+o Sphere
+v -0.097545 0.490393 0.000000
+v -0.191342 0.461940 0.000000
+v -0.277785 0.415735 0.000000
+v -0.353553 0.353553 0.000000
+v -0.415735 0.277785 0.000000
+v -0.461940 0.191342 0.000000
+v -0.490393 0.097545 0.000000
+v -0.500000 0.000000 0.000000
+v -0.490393 -0.097545 0.000000
+v -0.461940 -0.191342 0.000000
+v -0.415735 -0.277785 0.000000
+v -0.353553 -0.353553 0.000000
+v -0.277785 -0.415735 0.000000
+v -0.191342 -0.461940 0.000000
+v -0.097545 -0.490393 0.000000
+v -0.095671 0.490393 -0.019030
+v -0.187665 0.461940 -0.037329
+v -0.272448 0.415735 -0.054193
+v -0.346760 0.353553 -0.068975
+v -0.407747 0.277785 -0.081106
+v -0.453064 0.191342 -0.090120
+v -0.480970 0.097545 -0.095671
+v -0.490393 0.000000 -0.097545
+v -0.480970 -0.097545 -0.095671
+v -0.453064 -0.191342 -0.090120
+v -0.407747 -0.277785 -0.081106
+v -0.346760 -0.353553 -0.068975
+v -0.272448 -0.415735 -0.054193
+v -0.187665 -0.461940 -0.037329
+v -0.095671 -0.490393 -0.019030
+v -0.090120 0.490393 -0.037329
+v -0.176777 0.461940 -0.073223
+v -0.256640 0.415735 -0.106304
+v -0.326641 0.353553 -0.135299
+v -0.384089 0.277785 -0.159095
+v -0.426777 0.191342 -0.176777
+v -0.453064 0.097545 -0.187665
+v -0.461940 0.000000 -0.191342
+v -0.453064 -0.097545 -0.187665
+v -0.426777 -0.191342 -0.176777
+v -0.384089 -0.277785 -0.159095
+v -0.326641 -0.353553 -0.135299
+v -0.256640 -0.415735 -0.106304
+v -0.176777 -0.461940 -0.073223
+v -0.090120 -0.490393 -0.037329
+v -0.081106 0.490393 -0.054193
+v -0.159095 0.461940 -0.106304
+v -0.230970 0.415735 -0.154329
+v -0.293969 0.353553 -0.196424
+v -0.345671 0.277785 -0.230970
+v -0.384089 0.191342 -0.256640
+v -0.407746 0.097545 -0.272448
+v -0.415735 0.000000 -0.277785
+v -0.407746 -0.097545 -0.272448
+v -0.384089 -0.191342 -0.256640
+v -0.345671 -0.277785 -0.230970
+v -0.293969 -0.353553 -0.196424
+v -0.230970 -0.415735 -0.154329
+v -0.159095 -0.461940 -0.106304
+v -0.081106 -0.490393 -0.054193
+v -0.068975 0.490393 -0.068975
+v -0.135299 0.461940 -0.135299
+v -0.196424 0.415735 -0.196424
+v -0.250000 0.353553 -0.250000
+v -0.293969 0.277785 -0.293969
+v -0.326641 0.191342 -0.326641
+v -0.346760 0.097545 -0.346760
+v -0.353553 0.000000 -0.353554
+v -0.346760 -0.097545 -0.346760
+v -0.326641 -0.191342 -0.326641
+v -0.293969 -0.277785 -0.293969
+v -0.250000 -0.353553 -0.250000
+v -0.196424 -0.415735 -0.196424
+v -0.135299 -0.461940 -0.135299
+v -0.068975 -0.490393 -0.068975
+v -0.054193 0.490393 -0.081106
+v -0.106304 0.461940 -0.159095
+v -0.154329 0.415735 -0.230970
+v -0.196424 0.353553 -0.293969
+v -0.230970 0.277785 -0.345671
+v -0.256640 0.191342 -0.384089
+v -0.272447 0.097545 -0.407747
+v -0.277785 0.000000 -0.415735
+v -0.272447 -0.097545 -0.407747
+v -0.256640 -0.191342 -0.384089
+v -0.230970 -0.277785 -0.345671
+v -0.196424 -0.353553 -0.293969
+v -0.154329 -0.415735 -0.230970
+v -0.106304 -0.461940 -0.159095
+v -0.054193 -0.490393 -0.081106
+v -0.037329 0.490393 -0.090120
+v -0.073223 0.461940 -0.176777
+v -0.106304 0.415735 -0.256640
+v -0.135299 0.353553 -0.326641
+v -0.159095 0.277785 -0.384089
+v -0.176777 0.191342 -0.426777
+v -0.187665 0.097545 -0.453064
+v -0.191342 0.000000 -0.461940
+v -0.187665 -0.097545 -0.453064
+v -0.176777 -0.191342 -0.426777
+v -0.159095 -0.277785 -0.384089
+v -0.135299 -0.353553 -0.326641
+v -0.106304 -0.415735 -0.256640
+v -0.073223 -0.461940 -0.176777
+v -0.037329 -0.490393 -0.090120
+v -0.019030 0.490393 -0.095671
+v -0.037329 0.461940 -0.187665
+v -0.054193 0.415735 -0.272448
+v -0.068975 0.353553 -0.346760
+v -0.081106 0.277785 -0.407747
+v -0.090120 0.191342 -0.453064
+v -0.095671 0.097545 -0.480970
+v -0.097545 0.000000 -0.490393
+v -0.095671 -0.097545 -0.480970
+v -0.090120 -0.191342 -0.453064
+v -0.081106 -0.277785 -0.407747
+v -0.068975 -0.353553 -0.346760
+v -0.054193 -0.415735 -0.272448
+v -0.037329 -0.461940 -0.187665
+v -0.019030 -0.490393 -0.095671
+v 0.000000 0.490393 -0.097545
+v 0.000000 0.461940 -0.191342
+v 0.000000 0.415735 -0.277785
+v 0.000000 0.353553 -0.353553
+v 0.000000 0.277785 -0.415735
+v 0.000000 0.191342 -0.461940
+v 0.000000 0.097545 -0.490393
+v 0.000000 0.000000 -0.500000
+v 0.000000 -0.097545 -0.490393
+v 0.000000 -0.191342 -0.461940
+v 0.000000 -0.277785 -0.415735
+v 0.000000 -0.353553 -0.353553
+v 0.000000 -0.415735 -0.277785
+v 0.000000 -0.461940 -0.191342
+v 0.000000 -0.490393 -0.097545
+v 0.019030 0.490393 -0.095671
+v 0.037329 0.461940 -0.187665
+v 0.054193 0.415735 -0.272448
+v 0.068975 0.353553 -0.346760
+v 0.081106 0.277785 -0.407747
+v 0.090120 0.191342 -0.453064
+v 0.095671 0.097545 -0.480970
+v 0.097545 0.000000 -0.490393
+v 0.095671 -0.097545 -0.480970
+v 0.090120 -0.191342 -0.453064
+v 0.081106 -0.277785 -0.407747
+v 0.068975 -0.353553 -0.346760
+v 0.054193 -0.415735 -0.272448
+v 0.037329 -0.461940 -0.187665
+v 0.019030 -0.490393 -0.095671
+v 0.037329 0.490393 -0.090120
+v 0.073224 0.461940 -0.176777
+v 0.106304 0.415735 -0.256640
+v 0.135299 0.353553 -0.326641
+v 0.159095 0.277785 -0.384089
+v 0.176777 0.191342 -0.426777
+v 0.187665 0.097545 -0.453064
+v 0.191342 0.000000 -0.461940
+v 0.187665 -0.097545 -0.453064
+v 0.176777 -0.191342 -0.426777
+v 0.159095 -0.277785 -0.384089
+v 0.135299 -0.353553 -0.326641
+v 0.106304 -0.415735 -0.256640
+v 0.073223 -0.461940 -0.176777
+v 0.037329 -0.490393 -0.090120
+v 0.054193 0.490393 -0.081106
+v 0.106304 0.461940 -0.159095
+v 0.154329 0.415735 -0.230970
+v 0.196424 0.353553 -0.293969
+v 0.230970 0.277785 -0.345671
+v 0.256640 0.191342 -0.384089
+v 0.272448 0.097545 -0.407747
+v 0.277785 0.000000 -0.415735
+v 0.272448 -0.097545 -0.407747
+v 0.256640 -0.191342 -0.384089
+v 0.230970 -0.277785 -0.345671
+v 0.196424 -0.353553 -0.293969
+v 0.154329 -0.415735 -0.230970
+v 0.106304 -0.461940 -0.159095
+v 0.054193 -0.490393 -0.081106
+v 0.068975 0.490393 -0.068975
+v 0.135299 0.461940 -0.135299
+v 0.196424 0.415735 -0.196424
+v 0.250000 0.353553 -0.250000
+v 0.293969 0.277785 -0.293969
+v 0.326641 0.191342 -0.326641
+v 0.346760 0.097545 -0.346760
+v 0.353554 0.000000 -0.353553
+v 0.346760 -0.097545 -0.346760
+v 0.326641 -0.191342 -0.326641
+v 0.293969 -0.277785 -0.293969
+v 0.250000 -0.353553 -0.250000
+v 0.196424 -0.415735 -0.196424
+v 0.135299 -0.461940 -0.135299
+v 0.068975 -0.490393 -0.068975
+v 0.081106 0.490393 -0.054193
+v 0.159095 0.461940 -0.106304
+v 0.230970 0.415735 -0.154329
+v 0.293969 0.353553 -0.196424
+v 0.345671 0.277785 -0.230970
+v 0.384089 0.191342 -0.256640
+v 0.407747 0.097545 -0.272447
+v 0.415735 0.000000 -0.277785
+v 0.407747 -0.097545 -0.272447
+v 0.384089 -0.191342 -0.256640
+v 0.345671 -0.277785 -0.230970
+v 0.293969 -0.353553 -0.196424
+v 0.230970 -0.415735 -0.154329
+v 0.159095 -0.461940 -0.106304
+v 0.081106 -0.490393 -0.054193
+v 0.090120 0.490393 -0.037329
+v 0.176777 0.461940 -0.073223
+v 0.256640 0.415735 -0.106304
+v 0.326641 0.353553 -0.135299
+v 0.384089 0.277785 -0.159095
+v 0.426777 0.191342 -0.176777
+v 0.453064 0.097545 -0.187665
+v 0.461940 0.000000 -0.191342
+v 0.453064 -0.097545 -0.187665
+v 0.426777 -0.191342 -0.176777
+v 0.384089 -0.277785 -0.159095
+v 0.326641 -0.353553 -0.135299
+v 0.256640 -0.415735 -0.106304
+v 0.176777 -0.461940 -0.073223
+v 0.090120 -0.490393 -0.037329
+v 0.095671 0.490393 -0.019030
+v 0.187665 0.461940 -0.037329
+v 0.272448 0.415735 -0.054193
+v 0.346760 0.353553 -0.068975
+v 0.407747 0.277785 -0.081106
+v 0.453064 0.191342 -0.090120
+v 0.480970 0.097545 -0.095671
+v 0.490393 0.000000 -0.097545
+v 0.480970 -0.097545 -0.095671
+v 0.453064 -0.191342 -0.090120
+v 0.407747 -0.277785 -0.081106
+v 0.346760 -0.353553 -0.068975
+v 0.272448 -0.415735 -0.054193
+v 0.187665 -0.461940 -0.037329
+v 0.095671 -0.490393 -0.019030
+v 0.097545 0.490393 0.000000
+v 0.191342 0.461940 -0.000000
+v 0.277785 0.415735 -0.000000
+v 0.353554 0.353553 0.000000
+v 0.415735 0.277785 0.000000
+v 0.461940 0.191342 -0.000000
+v 0.490393 0.097545 0.000000
+v 0.500000 0.000000 0.000000
+v 0.490393 -0.097545 0.000000
+v 0.461940 -0.191342 -0.000000
+v 0.415735 -0.277785 0.000000
+v 0.353554 -0.353553 0.000000
+v 0.277785 -0.415735 0.000000
+v 0.191342 -0.461940 -0.000000
+v 0.097545 -0.490393 -0.000000
+v 0.095671 0.490393 0.019030
+v 0.187665 0.461940 0.037329
+v 0.272448 0.415735 0.054193
+v 0.346760 0.353553 0.068975
+v 0.407747 0.277785 0.081106
+v 0.453064 0.191342 0.090120
+v 0.480970 0.097545 0.095671
+v 0.490393 0.000000 0.097545
+v 0.480970 -0.097545 0.095671
+v 0.453064 -0.191342 0.090120
+v 0.407747 -0.277785 0.081106
+v 0.346760 -0.353553 0.068975
+v 0.272448 -0.415735 0.054193
+v 0.187665 -0.461940 0.037329
+v 0.095671 -0.490393 0.019030
+v 0.090120 0.490393 0.037329
+v 0.176777 0.461940 0.073223
+v 0.256640 0.415735 0.106304
+v 0.326641 0.353553 0.135299
+v 0.384089 0.277785 0.159095
+v 0.426777 0.191342 0.176777
+v 0.453064 0.097545 0.187665
+v 0.461940 0.000000 0.191342
+v 0.453064 -0.097545 0.187665
+v 0.426777 -0.191342 0.176777
+v 0.384089 -0.277785 0.159095
+v 0.326641 -0.353553 0.135299
+v 0.256640 -0.415735 0.106304
+v 0.176777 -0.461940 0.073223
+v 0.090120 -0.490393 0.037329
+v 0.081106 0.490393 0.054193
+v 0.159095 0.461940 0.106304
+v 0.230970 0.415735 0.154329
+v 0.293969 0.353553 0.196424
+v 0.345671 0.277785 0.230970
+v 0.384089 0.191342 0.256640
+v 0.407747 0.097545 0.272448
+v 0.415735 0.000000 0.277785
+v 0.407747 -0.097545 0.272448
+v 0.384089 -0.191342 0.256640
+v 0.345671 -0.277785 0.230970
+v 0.293969 -0.353553 0.196424
+v 0.230970 -0.415735 0.154329
+v 0.159095 -0.461940 0.106304
+v 0.081106 -0.490393 0.054193
+v 0.068975 0.490393 0.068975
+v 0.135299 0.461940 0.135299
+v 0.196424 0.415735 0.196424
+v 0.250000 0.353553 0.250000
+v 0.293969 0.277785 0.293969
+v 0.326641 0.191342 0.326641
+v 0.346760 0.097545 0.346760
+v 0.353553 0.000000 0.353553
+v 0.346760 -0.097545 0.346760
+v 0.326641 -0.191342 0.326641
+v 0.293969 -0.277785 0.293969
+v 0.250000 -0.353553 0.250000
+v 0.196424 -0.415735 0.196424
+v 0.135299 -0.461940 0.135299
+v 0.068975 -0.490393 0.068975
+v 0.054193 0.490393 0.081106
+v 0.106304 0.461940 0.159095
+v 0.154329 0.415735 0.230970
+v 0.196424 0.353553 0.293969
+v 0.230970 0.277785 0.345671
+v 0.256640 0.191342 0.384089
+v 0.272448 0.097545 0.407746
+v 0.277785 0.000000 0.415735
+v 0.272448 -0.097545 0.407746
+v 0.256640 -0.191342 0.384089
+v 0.230970 -0.277785 0.345671
+v 0.196424 -0.353553 0.293969
+v 0.154329 -0.415735 0.230970
+v 0.106304 -0.461940 0.159095
+v 0.054193 -0.490393 0.081106
+v 0.037329 0.490393 0.090120
+v 0.073223 0.461940 0.176777
+v 0.106304 0.415735 0.256640
+v 0.135299 0.353553 0.326641
+v 0.159095 0.277785 0.384089
+v 0.176777 0.191342 0.426777
+v 0.187665 0.097545 0.453064
+v 0.191342 0.000000 0.461940
+v 0.187665 -0.097545 0.453064
+v 0.176777 -0.191342 0.426777
+v 0.159095 -0.277785 0.384089
+v 0.135299 -0.353553 0.326641
+v 0.106304 -0.415735 0.256640
+v 0.073223 -0.461940 0.176777
+v 0.037329 -0.490393 0.090120
+v 0.019030 0.490393 0.095671
+v 0.037329 0.461940 0.187665
+v 0.054193 0.415735 0.272448
+v 0.068975 0.353553 0.346760
+v 0.081106 0.277785 0.407746
+v 0.090120 0.191342 0.453064
+v 0.095671 0.097545 0.480970
+v 0.097545 0.000000 0.490393
+v 0.095671 -0.097545 0.480970
+v 0.090120 -0.191342 0.453064
+v 0.081106 -0.277785 0.407746
+v 0.068975 -0.353553 0.346760
+v 0.054193 -0.415735 0.272447
+v 0.037329 -0.461940 0.187665
+v 0.019030 -0.490393 0.095671
+v 0.000000 0.490393 0.097545
+v 0.000000 0.461940 0.191342
+v 0.000000 0.415735 0.277785
+v 0.000000 0.353553 0.353553
+v 0.000000 0.277785 0.415735
+v 0.000000 0.191342 0.461940
+v 0.000000 0.097545 0.490392
+v 0.000000 0.000000 0.500000
+v 0.000000 -0.097545 0.490392
+v 0.000000 -0.191342 0.461940
+v 0.000000 -0.277785 0.415735
+v 0.000000 -0.353553 0.353553
+v 0.000000 -0.415735 0.277785
+v 0.000000 -0.461940 0.191342
+v 0.000000 -0.490393 0.097545
+v -0.019030 0.490393 0.095671
+v -0.037329 0.461940 0.187665
+v -0.054193 0.415735 0.272448
+v -0.068975 0.353553 0.346760
+v -0.081106 0.277785 0.407746
+v -0.090120 0.191342 0.453064
+v -0.095671 0.097545 0.480970
+v -0.097545 0.000000 0.490393
+v -0.095671 -0.097545 0.480970
+v -0.090120 -0.191342 0.453064
+v -0.081106 -0.277785 0.407746
+v -0.068975 -0.353553 0.346760
+v -0.054193 -0.415735 0.272447
+v -0.037329 -0.461940 0.187665
+v -0.019030 -0.490393 0.095671
+v -0.037329 0.490393 0.090120
+v -0.073223 0.461940 0.176777
+v -0.106304 0.415735 0.256640
+v -0.135299 0.353553 0.326641
+v -0.159095 0.277785 0.384089
+v -0.176777 0.191342 0.426777
+v -0.187665 0.097545 0.453063
+v -0.191342 0.000000 0.461940
+v -0.187665 -0.097545 0.453063
+v -0.176777 -0.191342 0.426777
+v -0.159095 -0.277785 0.384089
+v -0.135299 -0.353553 0.326641
+v -0.106304 -0.415735 0.256640
+v -0.073223 -0.461940 0.176777
+v -0.037329 -0.490393 0.090120
+v -0.054193 0.490393 0.081106
+v -0.106304 0.461940 0.159095
+v -0.154329 0.415735 0.230970
+v -0.196424 0.353553 0.293969
+v -0.230970 0.277785 0.345671
+v -0.256640 0.191342 0.384089
+v -0.272447 0.097545 0.407746
+v -0.277785 0.000000 0.415735
+v -0.272447 -0.097545 0.407746
+v -0.256640 -0.191342 0.384089
+v -0.230970 -0.277785 0.345671
+v -0.196424 -0.353553 0.293969
+v -0.154329 -0.415735 0.230970
+v -0.106304 -0.461940 0.159095
+v -0.054193 -0.490393 0.081106
+v -0.068975 0.490393 0.068975
+v -0.135299 0.461940 0.135299
+v -0.196424 0.415735 0.196424
+v -0.250000 0.353553 0.250000
+v -0.293969 0.277785 0.293969
+v -0.326641 0.191342 0.326641
+v -0.346760 0.097545 0.346760
+v -0.353553 0.000000 0.353553
+v -0.346760 -0.097545 0.346760
+v -0.326641 -0.191342 0.326641
+v -0.293969 -0.277785 0.293969
+v -0.250000 -0.353553 0.250000
+v -0.196424 -0.415735 0.196424
+v -0.135299 -0.461940 0.135299
+v -0.068975 -0.490393 0.068975
+v -0.081106 0.490393 0.054193
+v -0.159095 0.461940 0.106304
+v -0.230970 0.415735 0.154329
+v -0.293969 0.353553 0.196424
+v -0.345671 0.277785 0.230970
+v -0.384089 0.191342 0.256640
+v -0.407746 0.097545 0.272447
+v -0.415735 0.000000 0.277785
+v -0.407746 -0.097545 0.272447
+v -0.384089 -0.191342 0.256640
+v -0.345671 -0.277785 0.230970
+v -0.293969 -0.353553 0.196424
+v -0.230970 -0.415735 0.154329
+v -0.159095 -0.461940 0.106304
+v -0.081106 -0.490393 0.054193
+v -0.090120 0.490393 0.037329
+v -0.176776 0.461940 0.073223
+v -0.256640 0.415735 0.106304
+v -0.326641 0.353553 0.135299
+v -0.384089 0.277785 0.159095
+v -0.426776 0.191342 0.176777
+v -0.453063 0.097545 0.187665
+v -0.461939 0.000000 0.191342
+v -0.453063 -0.097545 0.187665
+v -0.426776 -0.191342 0.176777
+v -0.384089 -0.277785 0.159095
+v -0.326641 -0.353553 0.135299
+v -0.256640 -0.415735 0.106304
+v -0.176776 -0.461940 0.073223
+v -0.090120 -0.490393 0.037329
+v -0.095671 0.490393 0.019030
+v -0.187665 0.461940 0.037329
+v -0.272447 0.415735 0.054193
+v -0.346760 0.353553 0.068975
+v -0.407746 0.277785 0.081106
+v -0.453063 0.191342 0.090120
+v -0.480969 0.097545 0.095671
+v -0.490392 0.000000 0.097545
+v -0.480969 -0.097545 0.095671
+v -0.453063 -0.191342 0.090120
+v -0.407746 -0.277785 0.081106
+v -0.346760 -0.353553 0.068975
+v -0.272447 -0.415735 0.054193
+v -0.187665 -0.461940 0.037329
+v -0.095671 -0.490393 0.019030
+v -0.013167 -0.495196 0.000000
+v -0.005039 0.495196 0.012165
+v -0.013167 0.495196 0.000000
+v -0.012914 0.495196 -0.002569
+v -0.012914 -0.495196 -0.002569
+v -0.012165 0.495196 -0.005039
+v -0.012165 -0.495196 -0.005039
+v -0.010948 0.495196 -0.007315
+v -0.010948 -0.495196 -0.007315
+v -0.009311 0.495196 -0.009311
+v -0.009311 -0.495196 -0.009311
+v -0.007315 0.495196 -0.010948
+v -0.007315 -0.495196 -0.010948
+v -0.005039 0.495196 -0.012165
+v -0.005039 -0.495196 -0.012165
+v -0.002569 0.495196 -0.012914
+v -0.002569 -0.495196 -0.012914
+v 0.000000 0.495196 -0.013167
+v 0.000000 -0.495196 -0.013167
+v 0.002569 0.495196 -0.012914
+v 0.002569 -0.495196 -0.012914
+v 0.005039 0.495196 -0.012165
+v 0.005039 -0.495196 -0.012165
+v 0.007316 0.495196 -0.010948
+v 0.007316 -0.495196 -0.010948
+v 0.009311 0.495196 -0.009311
+v 0.009311 -0.495196 -0.009311
+v 0.010948 0.495196 -0.007315
+v 0.010948 -0.495196 -0.007315
+v 0.012165 0.495196 -0.005039
+v 0.012165 -0.495196 -0.005039
+v 0.012915 0.495196 -0.002569
+v 0.012915 -0.495196 -0.002569
+v 0.013168 0.495196 0.000000
+v 0.013168 -0.495196 0.000000
+v 0.012915 0.495196 0.002569
+v 0.012915 -0.495196 0.002569
+v 0.012165 0.495196 0.005039
+v 0.012165 -0.495196 0.005039
+v 0.010948 0.495196 0.007315
+v 0.010948 -0.495196 0.007315
+v 0.009311 0.495196 0.009311
+v 0.009311 -0.495196 0.009311
+v 0.007316 0.495196 0.010948
+v 0.007316 -0.495196 0.010948
+v 0.005039 0.495196 0.012165
+v 0.005039 -0.495196 0.012165
+v 0.002569 0.495196 0.012914
+v 0.002569 -0.495196 0.012914
+v 0.000000 0.495196 0.013167
+v 0.000000 -0.495196 0.013167
+v -0.002569 0.495196 0.012914
+v -0.002569 -0.495196 0.012914
+v -0.005039 -0.495196 0.012165
+v -0.007315 0.495196 0.010948
+v -0.007315 -0.495196 0.010948
+v -0.009311 0.495196 0.009311
+v -0.009311 -0.495196 0.009311
+v -0.010948 0.495196 0.007315
+v -0.010948 -0.495196 0.007315
+v -0.012165 0.495196 0.005039
+v -0.012165 -0.495196 0.005039
+v -0.012914 0.495196 0.002569
+v -0.012914 -0.495196 0.002569
+vt 0.437500 0.750000
+vt 0.437500 0.812500
+vt 0.375000 0.812500
+vt 0.375000 0.750000
+vt 0.437500 0.062500
+vt 0.437500 0.125000
+vt 0.375000 0.125000
+vt 0.375000 0.062500
+vt 0.437500 0.875000
+vt 0.437500 0.937500
+vt 0.375000 0.937500
+vt 0.375000 0.875000
+vt 0.437500 0.187500
+vt 0.437500 0.250000
+vt 0.375000 0.250000
+vt 0.375000 0.187500
+vt 0.437500 0.312500
+vt 0.437500 0.375000
+vt 0.375000 0.375000
+vt 0.375000 0.312500
+vt 0.437500 0.437500
+vt 0.437500 0.500000
+vt 0.375000 0.500000
+vt 0.375000 0.437500
+vt 0.437500 0.562500
+vt 0.437500 0.625000
+vt 0.375000 0.625000
+vt 0.375000 0.562500
+vt 0.437500 0.687500
+vt 0.375000 0.687500
+vt 0.312500 0.437500
+vt 0.312500 0.375000
+vt 0.312500 0.562500
+vt 0.312500 0.500000
+vt 0.312500 0.687500
+vt 0.312500 0.625000
+vt 0.312500 0.812500
+vt 0.312500 0.750000
+vt 0.312500 0.125000
+vt 0.312500 0.062500
+vt 0.312500 0.937500
+vt 0.312500 0.875000
+vt 0.312500 0.250000
+vt 0.312500 0.187500
+vt 0.312500 0.312500
+vt 0.250000 0.437500
+vt 0.250000 0.375000
+vt 0.250000 0.562500
+vt 0.250000 0.500000
+vt 0.250000 0.687500
+vt 0.250000 0.625000
+vt 0.250000 0.812500
+vt 0.250000 0.750000
+vt 0.250000 0.125000
+vt 0.250000 0.062500
+vt 0.250000 0.937500
+vt 0.250000 0.875000
+vt 0.250000 0.250000
+vt 0.250000 0.187500
+vt 0.250000 0.312500
+vt 0.187500 0.437500
+vt 0.187500 0.375000
+vt 0.187500 0.562500
+vt 0.187500 0.500000
+vt 0.187500 0.687500
+vt 0.187500 0.625000
+vt 0.187500 0.812500
+vt 0.187500 0.750000
+vt 0.187500 0.125000
+vt 0.187500 0.062500
+vt 0.187500 0.937500
+vt 0.187500 0.875000
+vt 0.187500 0.250000
+vt 0.187500 0.187500
+vt 0.187500 0.312500
+vt 0.125000 0.437500
+vt 0.125000 0.375000
+vt 0.125000 0.562500
+vt 0.125000 0.500000
+vt 0.125000 0.687500
+vt 0.125000 0.625000
+vt 0.125000 0.812500
+vt 0.125000 0.750000
+vt 0.125000 0.125000
+vt 0.125000 0.062500
+vt 0.125000 0.937500
+vt 0.125000 0.875000
+vt 0.125000 0.250000
+vt 0.125000 0.187500
+vt 0.125000 0.312500
+vt 0.062500 0.437500
+vt 0.062500 0.375000
+vt 0.062500 0.562500
+vt 0.062500 0.500000
+vt 0.062500 0.687500
+vt 0.062500 0.625000
+vt 0.062500 0.812500
+vt 0.062500 0.750000
+vt 0.062500 0.125000
+vt 0.062500 0.062500
+vt 0.062500 0.937500
+vt 0.062500 0.875000
+vt 0.062500 0.250000
+vt 0.062500 0.187500
+vt 0.062500 0.312500
+vt 0.000000 0.437500
+vt 0.000000 0.375000
+vt 0.000000 0.562500
+vt 0.000000 0.500000
+vt 0.000000 0.687500
+vt 0.000000 0.625000
+vt 0.000000 0.812500
+vt 0.000000 0.750000
+vt 0.000000 0.125000
+vt 0.000000 0.062500
+vt 0.000000 0.937500
+vt 0.000000 0.875000
+vt 0.000000 0.250000
+vt 0.000000 0.187500
+vt 0.000000 0.312500
+vt 1.000000 0.375000
+vt 1.000000 0.437500
+vt 0.937500 0.437500
+vt 0.937500 0.375000
+vt 1.000000 0.500000
+vt 1.000000 0.562500
+vt 0.937500 0.562500
+vt 0.937500 0.500000
+vt 1.000000 0.625000
+vt 1.000000 0.687500
+vt 0.937500 0.687500
+vt 0.937500 0.625000
+vt 1.000000 0.750000
+vt 1.000000 0.812500
+vt 0.937500 0.812500
+vt 0.937500 0.750000
+vt 1.000000 0.062500
+vt 1.000000 0.125000
+vt 0.937500 0.125000
+vt 0.937500 0.062500
+vt 1.000000 0.875000
+vt 1.000000 0.937500
+vt 0.937500 0.937500
+vt 0.937500 0.875000
+vt 1.000000 0.187500
+vt 1.000000 0.250000
+vt 0.937500 0.250000
+vt 0.937500 0.187500
+vt 1.000000 0.312500
+vt 0.937500 0.312500
+vt 0.875000 0.437500
+vt 0.875000 0.375000
+vt 0.875000 0.562500
+vt 0.875000 0.500000
+vt 0.875000 0.687500
+vt 0.875000 0.625000
+vt 0.875000 0.812500
+vt 0.875000 0.750000
+vt 0.875000 0.125000
+vt 0.875000 0.062500
+vt 0.875000 0.937500
+vt 0.875000 0.875000
+vt 0.875000 0.250000
+vt 0.875000 0.187500
+vt 0.875000 0.312500
+vt 0.812500 0.437500
+vt 0.812500 0.375000
+vt 0.812500 0.562500
+vt 0.812500 0.500000
+vt 0.812500 0.687500
+vt 0.812500 0.625000
+vt 0.812500 0.812500
+vt 0.812500 0.750000
+vt 0.812500 0.125000
+vt 0.812500 0.062500
+vt 0.812500 0.937500
+vt 0.812500 0.875000
+vt 0.812500 0.250000
+vt 0.812500 0.187500
+vt 0.812500 0.312500
+vt 0.750000 0.437500
+vt 0.750000 0.375000
+vt 0.750000 0.562500
+vt 0.750000 0.500000
+vt 0.750000 0.687500
+vt 0.750000 0.625000
+vt 0.750000 0.812500
+vt 0.750000 0.750000
+vt 0.750000 0.125000
+vt 0.750000 0.062500
+vt 0.750000 0.937500
+vt 0.750000 0.875000
+vt 0.750000 0.250000
+vt 0.750000 0.187500
+vt 0.750000 0.312500
+vt 0.687500 0.437500
+vt 0.687500 0.375000
+vt 0.687500 0.562500
+vt 0.687500 0.500000
+vt 0.687500 0.687500
+vt 0.687500 0.625000
+vt 0.687500 0.812500
+vt 0.687500 0.750000
+vt 0.687500 0.125000
+vt 0.687500 0.062500
+vt 0.687500 0.937500
+vt 0.687500 0.875000
+vt 0.687500 0.250000
+vt 0.687500 0.187500
+vt 0.687500 0.312500
+vt 0.625000 0.437500
+vt 0.625000 0.375000
+vt 0.625000 0.562500
+vt 0.625000 0.500000
+vt 0.625000 0.687500
+vt 0.625000 0.625000
+vt 0.625000 0.812500
+vt 0.625000 0.750000
+vt 0.625000 0.125000
+vt 0.625000 0.062500
+vt 0.625000 0.937500
+vt 0.625000 0.875000
+vt 0.625000 0.250000
+vt 0.625000 0.187500
+vt 0.625000 0.312500
+vt 0.562500 0.437500
+vt 0.562500 0.375000
+vt 0.562500 0.562500
+vt 0.562500 0.500000
+vt 0.562500 0.687500
+vt 0.562500 0.625000
+vt 0.562500 0.812500
+vt 0.562500 0.750000
+vt 0.562500 0.125000
+vt 0.562500 0.062500
+vt 0.562500 0.937500
+vt 0.562500 0.875000
+vt 0.562500 0.250000
+vt 0.562500 0.187500
+vt 0.562500 0.312500
+vt 0.500000 0.437500
+vt 0.500000 0.375000
+vt 0.500000 0.562500
+vt 0.500000 0.500000
+vt 0.500000 0.687500
+vt 0.500000 0.625000
+vt 0.500000 0.812500
+vt 0.500000 0.750000
+vt 0.500000 0.125000
+vt 0.500000 0.062500
+vt 0.500000 0.937500
+vt 0.500000 0.875000
+vt 0.500000 0.250000
+vt 0.500000 0.187500
+vt 0.500000 0.312500
+vt 0.437500 0.000000
+vt 0.375000 0.000000
+vt 0.312500 0.000000
+vt 0.250000 0.000000
+vt 0.187500 0.000000
+vt 0.125000 0.000000
+vt 0.062500 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.937500 0.000000
+vt 0.875000 0.000000
+vt 0.812500 0.000000
+vt 0.750000 0.000000
+vt 0.687500 0.000000
+vt 0.625000 0.000000
+vt 0.562500 0.000000
+vt 0.500000 0.000000
+vt 0.500000 1.000000
+vt 0.437500 1.000000
+vt 0.562500 1.000000
+vt 0.625000 1.000000
+vt 0.687500 1.000000
+vt 0.750000 1.000000
+vt 0.812500 1.000000
+vt 0.875000 1.000000
+vt 0.937500 1.000000
+vt 1.000000 1.000000
+vt 0.062500 1.000000
+vt -0.000000 1.000000
+vt 0.125000 1.000000
+vt 0.187500 1.000000
+vt 0.250000 1.000000
+vt 0.312500 1.000000
+vt 0.375000 1.000000
+vt 0.031303 0.999906
+vt 0.037377 0.999307
+vt 0.043218 0.997535
+vt 0.048601 0.994658
+vt 0.053319 0.990786
+vt 0.057192 0.986068
+vt 0.060069 0.980685
+vt 0.061841 0.974844
+vt 0.062439 0.968769
+vt 0.061841 0.962695
+vt 0.060069 0.956854
+vt 0.057192 0.951471
+vt 0.053319 0.946753
+vt 0.048601 0.942881
+vt 0.043218 0.940004
+vt 0.037377 0.938232
+vt 0.031303 0.937633
+vt 0.025229 0.938232
+vt 0.019388 0.940004
+vt 0.014005 0.942881
+vt 0.009286 0.946753
+vt 0.005414 0.951471
+vt 0.002537 0.956854
+vt 0.000765 0.962695
+vt 0.000167 0.968770
+vt 0.000765 0.974844
+vt 0.002537 0.980685
+vt 0.005414 0.986068
+vt 0.009286 0.990786
+vt 0.014005 0.994658
+vt 0.019388 0.997535
+vt 0.025229 0.999307
+vn -0.710100 0.704000 0.000000
+vn -0.559800 0.828600 0.000000
+vn -0.549000 0.828600 -0.109200
+vn -0.696500 0.704000 -0.138500
+vn -0.182000 -0.983300 0.000000
+vn -0.387900 -0.921700 0.000000
+vn -0.380400 -0.921700 -0.075700
+vn -0.178400 -0.983300 -0.035500
+vn -0.387900 0.921700 0.000000
+vn -0.182000 0.983300 0.000000
+vn -0.178400 0.983300 -0.035500
+vn -0.380400 0.921700 -0.075700
+vn -0.559800 -0.828600 0.000000
+vn -0.710100 -0.704000 0.000000
+vn -0.696500 -0.704000 -0.138500
+vn -0.549000 -0.828600 -0.109200
+vn -0.833300 -0.552800 0.000000
+vn -0.924700 -0.380500 0.000000
+vn -0.907000 -0.380500 -0.180400
+vn -0.817300 -0.552800 -0.162600
+vn -0.981000 -0.193900 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.980800 0.000000 -0.195100
+vn -0.962200 -0.193900 -0.191400
+vn -0.981000 0.193900 0.000000
+vn -0.924700 0.380500 0.000000
+vn -0.907000 0.380500 -0.180400
+vn -0.962200 0.193900 -0.191400
+vn -0.833300 0.552800 0.000000
+vn -0.817300 0.552800 -0.162600
+vn -0.906300 -0.193900 -0.375400
+vn -0.854400 -0.380500 -0.353900
+vn -0.906300 0.193900 -0.375400
+vn -0.923900 0.000000 -0.382700
+vn -0.769900 0.552800 -0.318900
+vn -0.854400 0.380500 -0.353900
+vn -0.517100 0.828600 -0.214200
+vn -0.656100 0.704000 -0.271700
+vn -0.358300 -0.921700 -0.148400
+vn -0.168100 -0.983300 -0.069600
+vn -0.168100 0.983300 -0.069600
+vn -0.358300 0.921700 -0.148400
+vn -0.656100 -0.704000 -0.271700
+vn -0.517100 -0.828600 -0.214200
+vn -0.769900 -0.552800 -0.318900
+vn -0.815700 -0.193900 -0.545000
+vn -0.768900 -0.380500 -0.513700
+vn -0.815700 0.193900 -0.545000
+vn -0.831400 0.000000 -0.555600
+vn -0.692900 0.552800 -0.463000
+vn -0.768900 0.380500 -0.513700
+vn -0.465400 0.828600 -0.311000
+vn -0.590400 0.704000 -0.394500
+vn -0.322500 -0.921700 -0.215500
+vn -0.151300 -0.983300 -0.101100
+vn -0.151300 0.983300 -0.101100
+vn -0.322500 0.921700 -0.215500
+vn -0.590400 -0.704000 -0.394500
+vn -0.465400 -0.828600 -0.311000
+vn -0.692900 -0.552800 -0.463000
+vn -0.693700 -0.193900 -0.693700
+vn -0.653900 -0.380500 -0.653900
+vn -0.693700 0.193900 -0.693700
+vn -0.707100 0.000000 -0.707100
+vn -0.589300 0.552800 -0.589300
+vn -0.653900 0.380500 -0.653900
+vn -0.395800 0.828600 -0.395800
+vn -0.502100 0.704000 -0.502100
+vn -0.274300 -0.921700 -0.274300
+vn -0.128600 -0.983300 -0.128600
+vn -0.128600 0.983300 -0.128600
+vn -0.274300 0.921700 -0.274300
+vn -0.502100 -0.704000 -0.502100
+vn -0.395800 -0.828600 -0.395800
+vn -0.589300 -0.552800 -0.589300
+vn -0.545000 -0.193900 -0.815700
+vn -0.513700 -0.380500 -0.768900
+vn -0.545000 0.193900 -0.815700
+vn -0.555600 0.000000 -0.831400
+vn -0.463000 0.552800 -0.692900
+vn -0.513700 0.380500 -0.768900
+vn -0.311000 0.828600 -0.465400
+vn -0.394500 0.704000 -0.590400
+vn -0.215500 -0.921700 -0.322500
+vn -0.101100 -0.983300 -0.151300
+vn -0.101100 0.983300 -0.151300
+vn -0.215500 0.921700 -0.322500
+vn -0.394500 -0.704000 -0.590400
+vn -0.311000 -0.828600 -0.465400
+vn -0.463000 -0.552800 -0.692900
+vn -0.375400 -0.193900 -0.906300
+vn -0.353900 -0.380500 -0.854400
+vn -0.375400 0.193900 -0.906300
+vn -0.382700 0.000000 -0.923900
+vn -0.318900 0.552800 -0.769900
+vn -0.353900 0.380500 -0.854400
+vn -0.214200 0.828600 -0.517100
+vn -0.271700 0.704000 -0.656100
+vn -0.148400 -0.921700 -0.358300
+vn -0.069600 -0.983300 -0.168100
+vn -0.069600 0.983300 -0.168100
+vn -0.148400 0.921700 -0.358300
+vn -0.271700 -0.704000 -0.656100
+vn -0.214200 -0.828600 -0.517100
+vn -0.318900 -0.552800 -0.769900
+vn -0.191400 -0.193900 -0.962200
+vn -0.180400 -0.380500 -0.907000
+vn -0.191400 0.193900 -0.962200
+vn -0.195100 0.000000 -0.980800
+vn -0.162600 0.552800 -0.817300
+vn -0.180400 0.380500 -0.907000
+vn -0.109200 0.828600 -0.549000
+vn -0.138500 0.704000 -0.696500
+vn -0.075700 -0.921700 -0.380400
+vn -0.035500 -0.983300 -0.178400
+vn -0.035500 0.983300 -0.178400
+vn -0.075700 0.921700 -0.380400
+vn -0.138500 -0.704000 -0.696500
+vn -0.109200 -0.828600 -0.549000
+vn -0.162600 -0.552800 -0.817300
+vn 0.000000 -0.193900 -0.981000
+vn 0.000000 -0.380500 -0.924700
+vn 0.000000 0.193900 -0.981000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.552800 -0.833300
+vn 0.000000 0.380500 -0.924700
+vn 0.000000 0.828600 -0.559800
+vn 0.000000 0.704000 -0.710100
+vn 0.000000 -0.921700 -0.387900
+vn 0.000000 -0.983300 -0.182000
+vn 0.000000 0.983300 -0.182000
+vn 0.000000 0.921700 -0.387900
+vn 0.000000 -0.704000 -0.710100
+vn 0.000000 -0.828600 -0.559800
+vn 0.000000 -0.552800 -0.833300
+vn 0.191400 -0.193900 -0.962200
+vn 0.180400 -0.380500 -0.907000
+vn 0.191400 0.193900 -0.962200
+vn 0.195100 0.000000 -0.980800
+vn 0.162600 0.552800 -0.817300
+vn 0.180400 0.380500 -0.907000
+vn 0.109200 0.828600 -0.549000
+vn 0.138500 0.704000 -0.696500
+vn 0.075700 -0.921700 -0.380400
+vn 0.035500 -0.983300 -0.178400
+vn 0.035500 0.983300 -0.178400
+vn 0.075700 0.921700 -0.380400
+vn 0.138500 -0.704000 -0.696500
+vn 0.109200 -0.828600 -0.549000
+vn 0.162600 -0.552800 -0.817300
+vn 0.375400 -0.193900 -0.906300
+vn 0.353900 -0.380500 -0.854400
+vn 0.375400 0.193900 -0.906300
+vn 0.382700 0.000000 -0.923900
+vn 0.318900 0.552800 -0.769900
+vn 0.353900 0.380500 -0.854400
+vn 0.214200 0.828600 -0.517100
+vn 0.271700 0.704000 -0.656100
+vn 0.148400 -0.921700 -0.358300
+vn 0.069600 -0.983300 -0.168100
+vn 0.069600 0.983300 -0.168100
+vn 0.148400 0.921700 -0.358300
+vn 0.271700 -0.704000 -0.656100
+vn 0.214200 -0.828600 -0.517100
+vn 0.318900 -0.552800 -0.769900
+vn 0.545000 -0.193900 -0.815700
+vn 0.513700 -0.380500 -0.768900
+vn 0.545000 0.193900 -0.815700
+vn 0.555600 0.000000 -0.831400
+vn 0.463000 0.552800 -0.692900
+vn 0.513700 0.380500 -0.768900
+vn 0.311000 0.828600 -0.465400
+vn 0.394500 0.704000 -0.590400
+vn 0.215500 -0.921700 -0.322500
+vn 0.101100 -0.983300 -0.151300
+vn 0.101100 0.983300 -0.151300
+vn 0.215500 0.921700 -0.322500
+vn 0.394500 -0.704000 -0.590400
+vn 0.311000 -0.828600 -0.465400
+vn 0.463000 -0.552800 -0.692900
+vn 0.693700 -0.193900 -0.693700
+vn 0.653900 -0.380500 -0.653900
+vn 0.693700 0.193900 -0.693700
+vn 0.707100 0.000000 -0.707100
+vn 0.589300 0.552800 -0.589300
+vn 0.653900 0.380500 -0.653900
+vn 0.395800 0.828600 -0.395800
+vn 0.502100 0.704000 -0.502100
+vn 0.274300 -0.921700 -0.274300
+vn 0.128600 -0.983300 -0.128600
+vn 0.128600 0.983300 -0.128600
+vn 0.274300 0.921700 -0.274300
+vn 0.502100 -0.704000 -0.502100
+vn 0.395800 -0.828600 -0.395800
+vn 0.589300 -0.552800 -0.589300
+vn 0.815700 -0.193900 -0.545000
+vn 0.768900 -0.380500 -0.513700
+vn 0.815700 0.193900 -0.545000
+vn 0.831400 0.000000 -0.555600
+vn 0.692900 0.552800 -0.463000
+vn 0.768900 0.380500 -0.513700
+vn 0.465400 0.828600 -0.311000
+vn 0.590400 0.704000 -0.394500
+vn 0.322500 -0.921700 -0.215500
+vn 0.151300 -0.983300 -0.101100
+vn 0.151300 0.983300 -0.101100
+vn 0.322500 0.921700 -0.215500
+vn 0.590400 -0.704000 -0.394500
+vn 0.465400 -0.828600 -0.311000
+vn 0.692900 -0.552800 -0.463000
+vn 0.906300 -0.193900 -0.375400
+vn 0.854400 -0.380500 -0.353900
+vn 0.906300 0.193900 -0.375400
+vn 0.923900 0.000000 -0.382700
+vn 0.769900 0.552800 -0.318900
+vn 0.854400 0.380500 -0.353900
+vn 0.517100 0.828600 -0.214200
+vn 0.656100 0.704000 -0.271700
+vn 0.358300 -0.921700 -0.148400
+vn 0.168100 -0.983300 -0.069600
+vn 0.168100 0.983300 -0.069600
+vn 0.358300 0.921700 -0.148400
+vn 0.656100 -0.704000 -0.271700
+vn 0.517100 -0.828600 -0.214200
+vn 0.769900 -0.552800 -0.318900
+vn 0.962200 -0.193900 -0.191400
+vn 0.907000 -0.380500 -0.180400
+vn 0.962200 0.193900 -0.191400
+vn 0.980800 0.000000 -0.195100
+vn 0.817300 0.552800 -0.162600
+vn 0.907000 0.380500 -0.180400
+vn 0.549000 0.828600 -0.109200
+vn 0.696500 0.704000 -0.138500
+vn 0.380400 -0.921700 -0.075700
+vn 0.178400 -0.983300 -0.035500
+vn 0.178400 0.983300 -0.035500
+vn 0.380400 0.921700 -0.075700
+vn 0.696500 -0.704000 -0.138500
+vn 0.549000 -0.828600 -0.109200
+vn 0.817300 -0.552800 -0.162600
+vn 0.981000 -0.193900 0.000000
+vn 0.924700 -0.380500 0.000000
+vn 0.981000 0.193900 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.833300 0.552800 0.000000
+vn 0.924700 0.380500 0.000000
+vn 0.559800 0.828600 0.000000
+vn 0.710100 0.704000 0.000000
+vn 0.387900 -0.921700 0.000000
+vn 0.182000 -0.983300 0.000000
+vn 0.182000 0.983300 0.000000
+vn 0.387900 0.921700 0.000000
+vn 0.710100 -0.704000 0.000000
+vn 0.559800 -0.828600 0.000000
+vn 0.833300 -0.552800 0.000000
+vn 0.962200 -0.193900 0.191400
+vn 0.907000 -0.380500 0.180400
+vn 0.962200 0.193900 0.191400
+vn 0.980800 0.000000 0.195100
+vn 0.817300 0.552800 0.162600
+vn 0.907000 0.380500 0.180400
+vn 0.549000 0.828600 0.109200
+vn 0.696500 0.704000 0.138500
+vn 0.380400 -0.921700 0.075700
+vn 0.178400 -0.983300 0.035500
+vn 0.178400 0.983300 0.035500
+vn 0.380400 0.921700 0.075700
+vn 0.696500 -0.704000 0.138500
+vn 0.549000 -0.828600 0.109200
+vn 0.817300 -0.552800 0.162600
+vn 0.906300 -0.193900 0.375400
+vn 0.854400 -0.380500 0.353900
+vn 0.906300 0.193900 0.375400
+vn 0.923900 0.000000 0.382700
+vn 0.769900 0.552800 0.318900
+vn 0.854400 0.380500 0.353900
+vn 0.517100 0.828600 0.214200
+vn 0.656100 0.704000 0.271700
+vn 0.358300 -0.921700 0.148400
+vn 0.168100 -0.983300 0.069600
+vn 0.168100 0.983300 0.069600
+vn 0.358300 0.921700 0.148400
+vn 0.656100 -0.704000 0.271700
+vn 0.517100 -0.828600 0.214200
+vn 0.769900 -0.552800 0.318900
+vn 0.815700 -0.193900 0.545000
+vn 0.768900 -0.380500 0.513700
+vn 0.815700 0.193900 0.545000
+vn 0.831400 0.000000 0.555600
+vn 0.692900 0.552800 0.463000
+vn 0.768900 0.380500 0.513700
+vn 0.465400 0.828600 0.311000
+vn 0.590400 0.704000 0.394500
+vn 0.322500 -0.921700 0.215500
+vn 0.151300 -0.983300 0.101100
+vn 0.151300 0.983300 0.101100
+vn 0.322500 0.921700 0.215500
+vn 0.590400 -0.704000 0.394500
+vn 0.465400 -0.828600 0.311000
+vn 0.692900 -0.552800 0.463000
+vn 0.693700 -0.193900 0.693700
+vn 0.653900 -0.380500 0.653900
+vn 0.693700 0.193900 0.693700
+vn 0.707100 0.000000 0.707100
+vn 0.589300 0.552800 0.589300
+vn 0.653900 0.380500 0.653900
+vn 0.395800 0.828600 0.395800
+vn 0.502100 0.704000 0.502100
+vn 0.274300 -0.921700 0.274300
+vn 0.128600 -0.983300 0.128600
+vn 0.128600 0.983300 0.128600
+vn 0.274300 0.921700 0.274300
+vn 0.502100 -0.704000 0.502100
+vn 0.395800 -0.828600 0.395800
+vn 0.589300 -0.552800 0.589300
+vn 0.545000 -0.193900 0.815700
+vn 0.513700 -0.380500 0.768900
+vn 0.545000 0.193900 0.815700
+vn 0.555600 0.000000 0.831400
+vn 0.463000 0.552800 0.692900
+vn 0.513700 0.380500 0.768900
+vn 0.311000 0.828600 0.465400
+vn 0.394500 0.704000 0.590400
+vn 0.215500 -0.921700 0.322500
+vn 0.101100 -0.983300 0.151300
+vn 0.101100 0.983300 0.151300
+vn 0.215500 0.921700 0.322500
+vn 0.394500 -0.704000 0.590400
+vn 0.311000 -0.828600 0.465400
+vn 0.463000 -0.552800 0.692900
+vn 0.375400 -0.193900 0.906300
+vn 0.353900 -0.380500 0.854400
+vn 0.375400 0.193900 0.906300
+vn 0.382700 0.000000 0.923900
+vn 0.318900 0.552800 0.769900
+vn 0.353900 0.380500 0.854400
+vn 0.214200 0.828600 0.517100
+vn 0.271700 0.704000 0.656100
+vn 0.148400 -0.921700 0.358300
+vn 0.069600 -0.983300 0.168100
+vn 0.069600 0.983300 0.168100
+vn 0.148400 0.921700 0.358300
+vn 0.271700 -0.704000 0.656100
+vn 0.214200 -0.828600 0.517100
+vn 0.318900 -0.552800 0.769900
+vn 0.191400 -0.193900 0.962200
+vn 0.180400 -0.380500 0.907000
+vn 0.191400 0.193900 0.962200
+vn 0.195100 0.000000 0.980800
+vn 0.162600 0.552800 0.817300
+vn 0.180400 0.380500 0.907000
+vn 0.109200 0.828600 0.549000
+vn 0.138500 0.704000 0.696500
+vn 0.075700 -0.921700 0.380400
+vn 0.035500 -0.983300 0.178400
+vn 0.035500 0.983300 0.178400
+vn 0.075700 0.921700 0.380400
+vn 0.138500 -0.704000 0.696500
+vn 0.109200 -0.828600 0.549000
+vn 0.162600 -0.552800 0.817300
+vn 0.000000 -0.193900 0.981000
+vn 0.000000 -0.380500 0.924700
+vn 0.000000 0.193900 0.981000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.552800 0.833300
+vn 0.000000 0.380500 0.924700
+vn 0.000000 0.828600 0.559800
+vn 0.000000 0.704000 0.710100
+vn 0.000000 -0.921700 0.387900
+vn 0.000000 -0.983300 0.182000
+vn 0.000000 0.983300 0.182000
+vn 0.000000 0.921700 0.387900
+vn 0.000000 -0.704000 0.710100
+vn 0.000000 -0.828600 0.559800
+vn 0.000000 -0.552800 0.833300
+vn -0.191400 -0.193900 0.962200
+vn -0.180400 -0.380500 0.907000
+vn -0.191400 0.193900 0.962200
+vn -0.195100 0.000000 0.980800
+vn -0.162600 0.552800 0.817300
+vn -0.180400 0.380500 0.907000
+vn -0.109200 0.828600 0.549000
+vn -0.138500 0.704000 0.696500
+vn -0.075700 -0.921700 0.380400
+vn -0.035500 -0.983300 0.178400
+vn -0.035500 0.983300 0.178400
+vn -0.075700 0.921700 0.380400
+vn -0.138500 -0.704000 0.696500
+vn -0.109200 -0.828600 0.549000
+vn -0.162600 -0.552800 0.817300
+vn -0.375400 -0.193900 0.906300
+vn -0.353900 -0.380500 0.854400
+vn -0.375400 0.193900 0.906300
+vn -0.382700 0.000000 0.923900
+vn -0.318900 0.552800 0.769900
+vn -0.353900 0.380500 0.854400
+vn -0.214200 0.828600 0.517100
+vn -0.271700 0.704000 0.656100
+vn -0.148400 -0.921700 0.358300
+vn -0.069600 -0.983300 0.168100
+vn -0.069600 0.983300 0.168100
+vn -0.148400 0.921700 0.358300
+vn -0.271700 -0.704000 0.656100
+vn -0.214200 -0.828600 0.517100
+vn -0.318900 -0.552800 0.769900
+vn -0.545000 -0.193900 0.815700
+vn -0.513700 -0.380500 0.768900
+vn -0.545000 0.193900 0.815700
+vn -0.555600 0.000000 0.831400
+vn -0.463000 0.552800 0.692900
+vn -0.513700 0.380500 0.768900
+vn -0.311000 0.828600 0.465400
+vn -0.394500 0.704000 0.590400
+vn -0.215500 -0.921700 0.322500
+vn -0.101100 -0.983300 0.151300
+vn -0.101100 0.983300 0.151300
+vn -0.215500 0.921700 0.322500
+vn -0.394500 -0.704000 0.590400
+vn -0.311000 -0.828600 0.465400
+vn -0.463000 -0.552800 0.692900
+vn -0.693700 -0.193900 0.693700
+vn -0.653900 -0.380500 0.653900
+vn -0.693700 0.193900 0.693700
+vn -0.707100 0.000000 0.707100
+vn -0.589300 0.552800 0.589300
+vn -0.653900 0.380500 0.653900
+vn -0.395800 0.828600 0.395800
+vn -0.502100 0.704000 0.502100
+vn -0.274300 -0.921700 0.274300
+vn -0.128600 -0.983300 0.128600
+vn -0.128600 0.983300 0.128600
+vn -0.274300 0.921700 0.274300
+vn -0.502100 -0.704000 0.502100
+vn -0.395800 -0.828600 0.395800
+vn -0.589300 -0.552800 0.589300
+vn -0.815700 -0.193900 0.545000
+vn -0.768900 -0.380500 0.513700
+vn -0.815700 0.193900 0.545000
+vn -0.831400 0.000000 0.555600
+vn -0.692900 0.552800 0.463000
+vn -0.768900 0.380500 0.513700
+vn -0.465400 0.828600 0.311000
+vn -0.590400 0.704000 0.394500
+vn -0.322500 -0.921700 0.215500
+vn -0.151300 -0.983300 0.101100
+vn -0.151300 0.983300 0.101100
+vn -0.322500 0.921700 0.215500
+vn -0.590400 -0.704000 0.394500
+vn -0.465400 -0.828600 0.311000
+vn -0.692900 -0.552800 0.463000
+vn -0.906300 -0.193900 0.375400
+vn -0.854400 -0.380500 0.353900
+vn -0.906300 0.193900 0.375400
+vn -0.923900 0.000000 0.382700
+vn -0.769900 0.552800 0.318900
+vn -0.854400 0.380500 0.353900
+vn -0.517100 0.828600 0.214200
+vn -0.656100 0.704000 0.271700
+vn -0.358300 -0.921700 0.148400
+vn -0.168100 -0.983300 0.069600
+vn -0.168100 0.983300 0.069600
+vn -0.358300 0.921700 0.148400
+vn -0.656100 -0.704000 0.271700
+vn -0.517100 -0.828600 0.214200
+vn -0.769900 -0.552800 0.318900
+vn -0.962200 -0.193900 0.191400
+vn -0.907000 -0.380500 0.180400
+vn -0.962200 0.193900 0.191400
+vn -0.980800 0.000000 0.195100
+vn -0.817300 0.552800 0.162600
+vn -0.907000 0.380500 0.180400
+vn -0.549000 0.828600 0.109200
+vn -0.696500 0.704000 0.138500
+vn -0.380400 -0.921700 0.075700
+vn -0.178400 -0.983300 0.035500
+vn -0.178400 0.983300 0.035500
+vn -0.380400 0.921700 0.075700
+vn -0.696500 -0.704000 0.138500
+vn -0.549000 -0.828600 0.109200
+vn -0.817300 -0.552800 0.162600
+vn -0.030200 -0.999500 0.000000
+vn -0.029600 -0.999500 -0.005900
+vn -0.027900 -0.999500 -0.011500
+vn -0.025100 -0.999500 -0.016800
+vn -0.021300 -0.999500 -0.021300
+vn -0.016800 -0.999500 -0.025100
+vn -0.011500 -0.999500 -0.027900
+vn -0.005900 -0.999500 -0.029600
+vn 0.000000 -0.999500 -0.030200
+vn 0.005900 -0.999500 -0.029600
+vn 0.011500 -0.999500 -0.027900
+vn 0.016800 -0.999500 -0.025100
+vn 0.021300 -0.999500 -0.021300
+vn 0.025100 -0.999500 -0.016800
+vn 0.027900 -0.999500 -0.011500
+vn 0.029600 -0.999500 -0.005900
+vn 0.030200 -0.999500 0.000000
+vn 0.029600 -0.999500 0.005900
+vn 0.027900 -0.999500 0.011500
+vn 0.025100 -0.999500 0.016800
+vn 0.021300 -0.999500 0.021300
+vn 0.016800 -0.999500 0.025100
+vn 0.011500 -0.999500 0.027900
+vn 0.005900 -0.999500 0.029600
+vn 0.000000 -0.999500 0.030200
+vn -0.005900 -0.999500 0.029600
+vn -0.011500 -0.999500 0.027900
+vn -0.016800 -0.999500 0.025100
+vn -0.021300 -0.999500 0.021300
+vn -0.025100 -0.999500 0.016800
+vn -0.027900 -0.999500 0.011500
+vn -0.029600 -0.999500 0.005900
+vn -0.029600 0.999500 0.005900
+vn -0.030200 0.999500 0.000000
+vn -0.027900 0.999500 0.011500
+vn -0.025100 0.999500 0.016800
+vn -0.021300 0.999500 0.021300
+vn -0.016800 0.999500 0.025100
+vn -0.011500 0.999500 0.027900
+vn -0.005900 0.999500 0.029600
+vn 0.000000 0.999500 0.030200
+vn 0.005900 0.999500 0.029600
+vn 0.011500 0.999500 0.027900
+vn 0.016800 0.999500 0.025100
+vn 0.021300 0.999500 0.021300
+vn 0.025100 0.999500 0.016800
+vn 0.027900 0.999500 0.011500
+vn 0.029600 0.999500 0.005900
+vn 0.030200 0.999500 0.000000
+vn 0.029600 0.999500 -0.005900
+vn 0.027900 0.999500 -0.011500
+vn 0.025100 0.999500 -0.016800
+vn 0.021300 0.999500 -0.021300
+vn 0.016800 0.999500 -0.025100
+vn 0.011500 0.999500 -0.027900
+vn 0.005900 0.999500 -0.029600
+vn 0.000000 0.999500 -0.030200
+vn -0.005900 0.999500 -0.029600
+vn -0.011500 0.999500 -0.027900
+vn -0.016800 0.999500 -0.025100
+vn -0.021300 0.999500 -0.021300
+vn -0.025100 0.999500 -0.016800
+vn -0.027900 0.999500 -0.011500
+vn -0.029600 0.999500 -0.005900
+s 1
+f 4/1/1 3/2/2 18/3/3 19/4/4
+f 15/5/5 14/6/6 29/7/7 30/8/8
+f 2/9/9 1/10/10 16/11/11 17/12/12
+f 13/13/13 12/14/14 27/15/15 28/16/16
+f 11/17/17 10/18/18 25/19/19 26/20/20
+f 9/21/21 8/22/22 23/23/23 24/24/24
+f 7/25/25 6/26/26 21/27/27 22/28/28
+f 5/29/29 4/1/1 19/4/4 20/30/30
+f 3/2/2 2/9/9 17/12/12 18/3/3
+f 14/6/6 13/13/13 28/16/16 29/7/7
+f 12/14/14 11/17/17 26/20/20 27/15/15
+f 10/18/18 9/21/21 24/24/24 25/19/19
+f 8/22/22 7/25/25 22/28/28 23/23/23
+f 6/26/26 5/29/29 20/30/30 21/27/27
+f 25/19/19 24/24/24 39/31/31 40/32/32
+f 23/23/23 22/28/28 37/33/33 38/34/34
+f 21/27/27 20/30/30 35/35/35 36/36/36
+f 19/4/4 18/3/3 33/37/37 34/38/38
+f 30/8/8 29/7/7 44/39/39 45/40/40
+f 17/12/12 16/11/11 31/41/41 32/42/42
+f 28/16/16 27/15/15 42/43/43 43/44/44
+f 26/20/20 25/19/19 40/32/32 41/45/45
+f 24/24/24 23/23/23 38/34/34 39/31/31
+f 22/28/28 21/27/27 36/36/36 37/33/33
+f 20/30/30 19/4/4 34/38/38 35/35/35
+f 18/3/3 17/12/12 32/42/42 33/37/37
+f 29/7/7 28/16/16 43/44/44 44/39/39
+f 27/15/15 26/20/20 41/45/45 42/43/43
+f 40/32/32 39/31/31 54/46/46 55/47/47
+f 38/34/34 37/33/33 52/48/48 53/49/49
+f 36/36/36 35/35/35 50/50/50 51/51/51
+f 34/38/38 33/37/37 48/52/52 49/53/53
+f 45/40/40 44/39/39 59/54/54 60/55/55
+f 32/42/42 31/41/41 46/56/56 47/57/57
+f 43/44/44 42/43/43 57/58/58 58/59/59
+f 41/45/45 40/32/32 55/47/47 56/60/60
+f 39/31/31 38/34/34 53/49/49 54/46/46
+f 37/33/33 36/36/36 51/51/51 52/48/48
+f 35/35/35 34/38/38 49/53/53 50/50/50
+f 33/37/37 32/42/42 47/57/57 48/52/52
+f 44/39/39 43/44/44 58/59/59 59/54/54
+f 42/43/43 41/45/45 56/60/60 57/58/58
+f 55/47/47 54/46/46 69/61/61 70/62/62
+f 53/49/49 52/48/48 67/63/63 68/64/64
+f 51/51/51 50/50/50 65/65/65 66/66/66
+f 49/53/53 48/52/52 63/67/67 64/68/68
+f 60/55/55 59/54/54 74/69/69 75/70/70
+f 47/57/57 46/56/56 61/71/71 62/72/72
+f 58/59/59 57/58/58 72/73/73 73/74/74
+f 56/60/60 55/47/47 70/62/62 71/75/75
+f 54/46/46 53/49/49 68/64/64 69/61/61
+f 52/48/48 51/51/51 66/66/66 67/63/63
+f 50/50/50 49/53/53 64/68/68 65/65/65
+f 48/52/52 47/57/57 62/72/72 63/67/67
+f 59/54/54 58/59/59 73/74/74 74/69/69
+f 57/58/58 56/60/60 71/75/75 72/73/73
+f 70/62/62 69/61/61 84/76/76 85/77/77
+f 68/64/64 67/63/63 82/78/78 83/79/79
+f 66/66/66 65/65/65 80/80/80 81/81/81
+f 64/68/68 63/67/67 78/82/82 79/83/83
+f 75/70/70 74/69/69 89/84/84 90/85/85
+f 62/72/72 61/71/71 76/86/86 77/87/87
+f 73/74/74 72/73/73 87/88/88 88/89/89
+f 71/75/75 70/62/62 85/77/77 86/90/90
+f 69/61/61 68/64/64 83/79/79 84/76/76
+f 67/63/63 66/66/66 81/81/81 82/78/78
+f 65/65/65 64/68/68 79/83/83 80/80/80
+f 63/67/67 62/72/72 77/87/87 78/82/82
+f 74/69/69 73/74/74 88/89/89 89/84/84
+f 72/73/73 71/75/75 86/90/90 87/88/88
+f 85/77/77 84/76/76 99/91/91 100/92/92
+f 83/79/79 82/78/78 97/93/93 98/94/94
+f 81/81/81 80/80/80 95/95/95 96/96/96
+f 79/83/83 78/82/82 93/97/97 94/98/98
+f 90/85/85 89/84/84 104/99/99 105/100/100
+f 77/87/87 76/86/86 91/101/101 92/102/102
+f 88/89/89 87/88/88 102/103/103 103/104/104
+f 86/90/90 85/77/77 100/92/92 101/105/105
+f 84/76/76 83/79/79 98/94/94 99/91/91
+f 82/78/78 81/81/81 96/96/96 97/93/93
+f 80/80/80 79/83/83 94/98/98 95/95/95
+f 78/82/82 77/87/87 92/102/102 93/97/97
+f 89/84/84 88/89/89 103/104/104 104/99/99
+f 87/88/88 86/90/90 101/105/105 102/103/103
+f 100/92/92 99/91/91 114/106/106 115/107/107
+f 98/94/94 97/93/93 112/108/108 113/109/109
+f 96/96/96 95/95/95 110/110/110 111/111/111
+f 94/98/98 93/97/97 108/112/112 109/113/113
+f 105/100/100 104/99/99 119/114/114 120/115/115
+f 92/102/102 91/101/101 106/116/116 107/117/117
+f 103/104/104 102/103/103 117/118/118 118/119/119
+f 101/105/105 100/92/92 115/107/107 116/120/120
+f 99/91/91 98/94/94 113/109/109 114/106/106
+f 97/93/93 96/96/96 111/111/111 112/108/108
+f 95/95/95 94/98/98 109/113/113 110/110/110
+f 93/97/97 92/102/102 107/117/117 108/112/112
+f 104/99/99 103/104/104 118/119/119 119/114/114
+f 102/103/103 101/105/105 116/120/120 117/118/118
+f 115/121/107 114/122/106 129/123/121 130/124/122
+f 113/125/109 112/126/108 127/127/123 128/128/124
+f 111/129/111 110/130/110 125/131/125 126/132/126
+f 109/133/113 108/134/112 123/135/127 124/136/128
+f 120/137/115 119/138/114 134/139/129 135/140/130
+f 107/141/117 106/142/116 121/143/131 122/144/132
+f 118/145/119 117/146/118 132/147/133 133/148/134
+f 116/149/120 115/121/107 130/124/122 131/150/135
+f 114/122/106 113/125/109 128/128/124 129/123/121
+f 112/126/108 111/129/111 126/132/126 127/127/123
+f 110/130/110 109/133/113 124/136/128 125/131/125
+f 108/134/112 107/141/117 122/144/132 123/135/127
+f 119/138/114 118/145/119 133/148/134 134/139/129
+f 117/146/118 116/149/120 131/150/135 132/147/133
+f 130/124/122 129/123/121 144/151/136 145/152/137
+f 128/128/124 127/127/123 142/153/138 143/154/139
+f 126/132/126 125/131/125 140/155/140 141/156/141
+f 124/136/128 123/135/127 138/157/142 139/158/143
+f 135/140/130 134/139/129 149/159/144 150/160/145
+f 122/144/132 121/143/131 136/161/146 137/162/147
+f 133/148/134 132/147/133 147/163/148 148/164/149
+f 131/150/135 130/124/122 145/152/137 146/165/150
+f 129/123/121 128/128/124 143/154/139 144/151/136
+f 127/127/123 126/132/126 141/156/141 142/153/138
+f 125/131/125 124/136/128 139/158/143 140/155/140
+f 123/135/127 122/144/132 137/162/147 138/157/142
+f 134/139/129 133/148/134 148/164/149 149/159/144
+f 132/147/133 131/150/135 146/165/150 147/163/148
+f 145/152/137 144/151/136 159/166/151 160/167/152
+f 143/154/139 142/153/138 157/168/153 158/169/154
+f 141/156/141 140/155/140 155/170/155 156/171/156
+f 139/158/143 138/157/142 153/172/157 154/173/158
+f 150/160/145 149/159/144 164/174/159 165/175/160
+f 137/162/147 136/161/146 151/176/161 152/177/162
+f 148/164/149 147/163/148 162/178/163 163/179/164
+f 146/165/150 145/152/137 160/167/152 161/180/165
+f 144/151/136 143/154/139 158/169/154 159/166/151
+f 142/153/138 141/156/141 156/171/156 157/168/153
+f 140/155/140 139/158/143 154/173/158 155/170/155
+f 138/157/142 137/162/147 152/177/162 153/172/157
+f 149/159/144 148/164/149 163/179/164 164/174/159
+f 147/163/148 146/165/150 161/180/165 162/178/163
+f 160/167/152 159/166/151 174/181/166 175/182/167
+f 158/169/154 157/168/153 172/183/168 173/184/169
+f 156/171/156 155/170/155 170/185/170 171/186/171
+f 154/173/158 153/172/157 168/187/172 169/188/173
+f 165/175/160 164/174/159 179/189/174 180/190/175
+f 152/177/162 151/176/161 166/191/176 167/192/177
+f 163/179/164 162/178/163 177/193/178 178/194/179
+f 161/180/165 160/167/152 175/182/167 176/195/180
+f 159/166/151 158/169/154 173/184/169 174/181/166
+f 157/168/153 156/171/156 171/186/171 172/183/168
+f 155/170/155 154/173/158 169/188/173 170/185/170
+f 153/172/157 152/177/162 167/192/177 168/187/172
+f 164/174/159 163/179/164 178/194/179 179/189/174
+f 162/178/163 161/180/165 176/195/180 177/193/178
+f 175/182/167 174/181/166 189/196/181 190/197/182
+f 173/184/169 172/183/168 187/198/183 188/199/184
+f 171/186/171 170/185/170 185/200/185 186/201/186
+f 169/188/173 168/187/172 183/202/187 184/203/188
+f 180/190/175 179/189/174 194/204/189 195/205/190
+f 167/192/177 166/191/176 181/206/191 182/207/192
+f 178/194/179 177/193/178 192/208/193 193/209/194
+f 176/195/180 175/182/167 190/197/182 191/210/195
+f 174/181/166 173/184/169 188/199/184 189/196/181
+f 172/183/168 171/186/171 186/201/186 187/198/183
+f 170/185/170 169/188/173 184/203/188 185/200/185
+f 168/187/172 167/192/177 182/207/192 183/202/187
+f 179/189/174 178/194/179 193/209/194 194/204/189
+f 177/193/178 176/195/180 191/210/195 192/208/193
+f 190/197/182 189/196/181 204/211/196 205/212/197
+f 188/199/184 187/198/183 202/213/198 203/214/199
+f 186/201/186 185/200/185 200/215/200 201/216/201
+f 184/203/188 183/202/187 198/217/202 199/218/203
+f 195/205/190 194/204/189 209/219/204 210/220/205
+f 182/207/192 181/206/191 196/221/206 197/222/207
+f 193/209/194 192/208/193 207/223/208 208/224/209
+f 191/210/195 190/197/182 205/212/197 206/225/210
+f 189/196/181 188/199/184 203/214/199 204/211/196
+f 187/198/183 186/201/186 201/216/201 202/213/198
+f 185/200/185 184/203/188 199/218/203 200/215/200
+f 183/202/187 182/207/192 197/222/207 198/217/202
+f 194/204/189 193/209/194 208/224/209 209/219/204
+f 192/208/193 191/210/195 206/225/210 207/223/208
+f 205/212/197 204/211/196 219/226/211 220/227/212
+f 203/214/199 202/213/198 217/228/213 218/229/214
+f 201/216/201 200/215/200 215/230/215 216/231/216
+f 199/218/203 198/217/202 213/232/217 214/233/218
+f 210/220/205 209/219/204 224/234/219 225/235/220
+f 197/222/207 196/221/206 211/236/221 212/237/222
+f 208/224/209 207/223/208 222/238/223 223/239/224
+f 206/225/210 205/212/197 220/227/212 221/240/225
+f 204/211/196 203/214/199 218/229/214 219/226/211
+f 202/213/198 201/216/201 216/231/216 217/228/213
+f 200/215/200 199/218/203 214/233/218 215/230/215
+f 198/217/202 197/222/207 212/237/222 213/232/217
+f 209/219/204 208/224/209 223/239/224 224/234/219
+f 207/223/208 206/225/210 221/240/225 222/238/223
+f 220/227/212 219/226/211 234/241/226 235/242/227
+f 218/229/214 217/228/213 232/243/228 233/244/229
+f 216/231/216 215/230/215 230/245/230 231/246/231
+f 214/233/218 213/232/217 228/247/232 229/248/233
+f 225/235/220 224/234/219 239/249/234 240/250/235
+f 212/237/222 211/236/221 226/251/236 227/252/237
+f 223/239/224 222/238/223 237/253/238 238/254/239
+f 221/240/225 220/227/212 235/242/227 236/255/240
+f 219/226/211 218/229/214 233/244/229 234/241/226
+f 217/228/213 216/231/216 231/246/231 232/243/228
+f 215/230/215 214/233/218 229/248/233 230/245/230
+f 213/232/217 212/237/222 227/252/237 228/247/232
+f 224/234/219 223/239/224 238/254/239 239/249/234
+f 222/238/223 221/240/225 236/255/240 237/253/238
+f 235/242/227 234/241/226 249/21/241 250/18/242
+f 233/244/229 232/243/228 247/25/243 248/22/244
+f 231/246/231 230/245/230 245/29/245 246/26/246
+f 229/248/233 228/247/232 243/2/247 244/1/248
+f 240/250/235 239/249/234 254/6/249 255/5/250
+f 227/252/237 226/251/236 241/10/251 242/9/252
+f 238/254/239 237/253/238 252/14/253 253/13/254
+f 236/255/240 235/242/227 250/18/242 251/17/255
+f 234/241/226 233/244/229 248/22/244 249/21/241
+f 232/243/228 231/246/231 246/26/246 247/25/243
+f 230/245/230 229/248/233 244/1/248 245/29/245
+f 228/247/232 227/252/237 242/9/252 243/2/247
+f 239/249/234 238/254/239 253/13/254 254/6/249
+f 237/253/238 236/255/240 251/17/255 252/14/253
+f 250/18/242 249/21/241 264/24/256 265/19/257
+f 248/22/244 247/25/243 262/28/258 263/23/259
+f 246/26/246 245/29/245 260/30/260 261/27/261
+f 244/1/248 243/2/247 258/3/262 259/4/263
+f 255/5/250 254/6/249 269/7/264 270/8/265
+f 242/9/252 241/10/251 256/11/266 257/12/267
+f 253/13/254 252/14/253 267/15/268 268/16/269
+f 251/17/255 250/18/242 265/19/257 266/20/270
+f 249/21/241 248/22/244 263/23/259 264/24/256
+f 247/25/243 246/26/246 261/27/261 262/28/258
+f 245/29/245 244/1/248 259/4/263 260/30/260
+f 243/2/247 242/9/252 257/12/267 258/3/262
+f 254/6/249 253/13/254 268/16/269 269/7/264
+f 252/14/253 251/17/255 266/20/270 267/15/268
+f 265/19/257 264/24/256 279/31/271 280/32/272
+f 263/23/259 262/28/258 277/33/273 278/34/274
+f 261/27/261 260/30/260 275/35/275 276/36/276
+f 259/4/263 258/3/262 273/37/277 274/38/278
+f 270/8/265 269/7/264 284/39/279 285/40/280
+f 257/12/267 256/11/266 271/41/281 272/42/282
+f 268/16/269 267/15/268 282/43/283 283/44/284
+f 266/20/270 265/19/257 280/32/272 281/45/285
+f 264/24/256 263/23/259 278/34/274 279/31/271
+f 262/28/258 261/27/261 276/36/276 277/33/273
+f 260/30/260 259/4/263 274/38/278 275/35/275
+f 258/3/262 257/12/267 272/42/282 273/37/277
+f 269/7/264 268/16/269 283/44/284 284/39/279
+f 267/15/268 266/20/270 281/45/285 282/43/283
+f 280/32/272 279/31/271 294/46/286 295/47/287
+f 278/34/274 277/33/273 292/48/288 293/49/289
+f 276/36/276 275/35/275 290/50/290 291/51/291
+f 274/38/278 273/37/277 288/52/292 289/53/293
+f 285/40/280 284/39/279 299/54/294 300/55/295
+f 272/42/282 271/41/281 286/56/296 287/57/297
+f 283/44/284 282/43/283 297/58/298 298/59/299
+f 281/45/285 280/32/272 295/47/287 296/60/300
+f 279/31/271 278/34/274 293/49/289 294/46/286
+f 277/33/273 276/36/276 291/51/291 292/48/288
+f 275/35/275 274/38/278 289/53/293 290/50/290
+f 273/37/277 272/42/282 287/57/297 288/52/292
+f 284/39/279 283/44/284 298/59/299 299/54/294
+f 282/43/283 281/45/285 296/60/300 297/58/298
+f 295/47/287 294/46/286 309/61/301 310/62/302
+f 293/49/289 292/48/288 307/63/303 308/64/304
+f 291/51/291 290/50/290 305/65/305 306/66/306
+f 289/53/293 288/52/292 303/67/307 304/68/308
+f 300/55/295 299/54/294 314/69/309 315/70/310
+f 287/57/297 286/56/296 301/71/311 302/72/312
+f 298/59/299 297/58/298 312/73/313 313/74/314
+f 296/60/300 295/47/287 310/62/302 311/75/315
+f 294/46/286 293/49/289 308/64/304 309/61/301
+f 292/48/288 291/51/291 306/66/306 307/63/303
+f 290/50/290 289/53/293 304/68/308 305/65/305
+f 288/52/292 287/57/297 302/72/312 303/67/307
+f 299/54/294 298/59/299 313/74/314 314/69/309
+f 297/58/298 296/60/300 311/75/315 312/73/313
+f 310/62/302 309/61/301 324/76/316 325/77/317
+f 308/64/304 307/63/303 322/78/318 323/79/319
+f 306/66/306 305/65/305 320/80/320 321/81/321
+f 304/68/308 303/67/307 318/82/322 319/83/323
+f 315/70/310 314/69/309 329/84/324 330/85/325
+f 302/72/312 301/71/311 316/86/326 317/87/327
+f 313/74/314 312/73/313 327/88/328 328/89/329
+f 311/75/315 310/62/302 325/77/317 326/90/330
+f 309/61/301 308/64/304 323/79/319 324/76/316
+f 307/63/303 306/66/306 321/81/321 322/78/318
+f 305/65/305 304/68/308 319/83/323 320/80/320
+f 303/67/307 302/72/312 317/87/327 318/82/322
+f 314/69/309 313/74/314 328/89/329 329/84/324
+f 312/73/313 311/75/315 326/90/330 327/88/328
+f 325/77/317 324/76/316 339/91/331 340/92/332
+f 323/79/319 322/78/318 337/93/333 338/94/334
+f 321/81/321 320/80/320 335/95/335 336/96/336
+f 319/83/323 318/82/322 333/97/337 334/98/338
+f 330/85/325 329/84/324 344/99/339 345/100/340
+f 317/87/327 316/86/326 331/101/341 332/102/342
+f 328/89/329 327/88/328 342/103/343 343/104/344
+f 326/90/330 325/77/317 340/92/332 341/105/345
+f 324/76/316 323/79/319 338/94/334 339/91/331
+f 322/78/318 321/81/321 336/96/336 337/93/333
+f 320/80/320 319/83/323 334/98/338 335/95/335
+f 318/82/322 317/87/327 332/102/342 333/97/337
+f 329/84/324 328/89/329 343/104/344 344/99/339
+f 327/88/328 326/90/330 341/105/345 342/103/343
+f 340/92/332 339/91/331 354/106/346 355/107/347
+f 338/94/334 337/93/333 352/108/348 353/109/349
+f 336/96/336 335/95/335 350/110/350 351/111/351
+f 334/98/338 333/97/337 348/112/352 349/113/353
+f 345/100/340 344/99/339 359/114/354 360/115/355
+f 332/102/342 331/101/341 346/116/356 347/117/357
+f 343/104/344 342/103/343 357/118/358 358/119/359
+f 341/105/345 340/92/332 355/107/347 356/120/360
+f 339/91/331 338/94/334 353/109/349 354/106/346
+f 337/93/333 336/96/336 351/111/351 352/108/348
+f 335/95/335 334/98/338 349/113/353 350/110/350
+f 333/97/337 332/102/342 347/117/357 348/112/352
+f 344/99/339 343/104/344 358/119/359 359/114/354
+f 342/103/343 341/105/345 356/120/360 357/118/358
+f 355/121/347 354/122/346 369/123/361 370/124/362
+f 353/125/349 352/126/348 367/127/363 368/128/364
+f 351/129/351 350/130/350 365/131/365 366/132/366
+f 349/133/353 348/134/352 363/135/367 364/136/368
+f 360/137/355 359/138/354 374/139/369 375/140/370
+f 347/141/357 346/142/356 361/143/371 362/144/372
+f 358/145/359 357/146/358 372/147/373 373/148/374
+f 356/149/360 355/121/347 370/124/362 371/150/375
+f 354/122/346 353/125/349 368/128/364 369/123/361
+f 352/126/348 351/129/351 366/132/366 367/127/363
+f 350/130/350 349/133/353 364/136/368 365/131/365
+f 348/134/352 347/141/357 362/144/372 363/135/367
+f 359/138/354 358/145/359 373/148/374 374/139/369
+f 357/146/358 356/149/360 371/150/375 372/147/373
+f 370/124/362 369/123/361 384/151/376 385/152/377
+f 368/128/364 367/127/363 382/153/378 383/154/379
+f 366/132/366 365/131/365 380/155/380 381/156/381
+f 364/136/368 363/135/367 378/157/382 379/158/383
+f 375/140/370 374/139/369 389/159/384 390/160/385
+f 362/144/372 361/143/371 376/161/386 377/162/387
+f 373/148/374 372/147/373 387/163/388 388/164/389
+f 371/150/375 370/124/362 385/152/377 386/165/390
+f 369/123/361 368/128/364 383/154/379 384/151/376
+f 367/127/363 366/132/366 381/156/381 382/153/378
+f 365/131/365 364/136/368 379/158/383 380/155/380
+f 363/135/367 362/144/372 377/162/387 378/157/382
+f 374/139/369 373/148/374 388/164/389 389/159/384
+f 372/147/373 371/150/375 386/165/390 387/163/388
+f 385/152/377 384/151/376 399/166/391 400/167/392
+f 383/154/379 382/153/378 397/168/393 398/169/394
+f 381/156/381 380/155/380 395/170/395 396/171/396
+f 379/158/383 378/157/382 393/172/397 394/173/398
+f 390/160/385 389/159/384 404/174/399 405/175/400
+f 377/162/387 376/161/386 391/176/401 392/177/402
+f 388/164/389 387/163/388 402/178/403 403/179/404
+f 386/165/390 385/152/377 400/167/392 401/180/405
+f 384/151/376 383/154/379 398/169/394 399/166/391
+f 382/153/378 381/156/381 396/171/396 397/168/393
+f 380/155/380 379/158/383 394/173/398 395/170/395
+f 378/157/382 377/162/387 392/177/402 393/172/397
+f 389/159/384 388/164/389 403/179/404 404/174/399
+f 387/163/388 386/165/390 401/180/405 402/178/403
+f 400/167/392 399/166/391 414/181/406 415/182/407
+f 398/169/394 397/168/393 412/183/408 413/184/409
+f 396/171/396 395/170/395 410/185/410 411/186/411
+f 394/173/398 393/172/397 408/187/412 409/188/413
+f 405/175/400 404/174/399 419/189/414 420/190/415
+f 392/177/402 391/176/401 406/191/416 407/192/417
+f 403/179/404 402/178/403 417/193/418 418/194/419
+f 401/180/405 400/167/392 415/182/407 416/195/420
+f 399/166/391 398/169/394 413/184/409 414/181/406
+f 397/168/393 396/171/396 411/186/411 412/183/408
+f 395/170/395 394/173/398 409/188/413 410/185/410
+f 393/172/397 392/177/402 407/192/417 408/187/412
+f 404/174/399 403/179/404 418/194/419 419/189/414
+f 402/178/403 401/180/405 416/195/420 417/193/418
+f 415/182/407 414/181/406 429/196/421 430/197/422
+f 413/184/409 412/183/408 427/198/423 428/199/424
+f 411/186/411 410/185/410 425/200/425 426/201/426
+f 409/188/413 408/187/412 423/202/427 424/203/428
+f 420/190/415 419/189/414 434/204/429 435/205/430
+f 407/192/417 406/191/416 421/206/431 422/207/432
+f 418/194/419 417/193/418 432/208/433 433/209/434
+f 416/195/420 415/182/407 430/197/422 431/210/435
+f 414/181/406 413/184/409 428/199/424 429/196/421
+f 412/183/408 411/186/411 426/201/426 427/198/423
+f 410/185/410 409/188/413 424/203/428 425/200/425
+f 408/187/412 407/192/417 422/207/432 423/202/427
+f 419/189/414 418/194/419 433/209/434 434/204/429
+f 417/193/418 416/195/420 431/210/435 432/208/433
+f 430/197/422 429/196/421 444/211/436 445/212/437
+f 428/199/424 427/198/423 442/213/438 443/214/439
+f 426/201/426 425/200/425 440/215/440 441/216/441
+f 424/203/428 423/202/427 438/217/442 439/218/443
+f 435/205/430 434/204/429 449/219/444 450/220/445
+f 422/207/432 421/206/431 436/221/446 437/222/447
+f 433/209/434 432/208/433 447/223/448 448/224/449
+f 431/210/435 430/197/422 445/212/437 446/225/450
+f 429/196/421 428/199/424 443/214/439 444/211/436
+f 427/198/423 426/201/426 441/216/441 442/213/438
+f 425/200/425 424/203/428 439/218/443 440/215/440
+f 423/202/427 422/207/432 437/222/447 438/217/442
+f 434/204/429 433/209/434 448/224/449 449/219/444
+f 432/208/433 431/210/435 446/225/450 447/223/448
+f 445/212/437 444/211/436 459/226/451 460/227/452
+f 443/214/439 442/213/438 457/228/453 458/229/454
+f 441/216/441 440/215/440 455/230/455 456/231/456
+f 439/218/443 438/217/442 453/232/457 454/233/458
+f 450/220/445 449/219/444 464/234/459 465/235/460
+f 437/222/447 436/221/446 451/236/461 452/237/462
+f 448/224/449 447/223/448 462/238/463 463/239/464
+f 446/225/450 445/212/437 460/227/452 461/240/465
+f 444/211/436 443/214/439 458/229/454 459/226/451
+f 442/213/438 441/216/441 456/231/456 457/228/453
+f 440/215/440 439/218/443 454/233/458 455/230/455
+f 438/217/442 437/222/447 452/237/462 453/232/457
+f 449/219/444 448/224/449 463/239/464 464/234/459
+f 447/223/448 446/225/450 461/240/465 462/238/463
+f 460/227/452 459/226/451 474/241/466 475/242/467
+f 458/229/454 457/228/453 472/243/468 473/244/469
+f 456/231/456 455/230/455 470/245/470 471/246/471
+f 454/233/458 453/232/457 468/247/472 469/248/473
+f 465/235/460 464/234/459 479/249/474 480/250/475
+f 452/237/462 451/236/461 466/251/476 467/252/477
+f 463/239/464 462/238/463 477/253/478 478/254/479
+f 461/240/465 460/227/452 475/242/467 476/255/480
+f 459/226/451 458/229/454 473/244/469 474/241/466
+f 457/228/453 456/231/456 471/246/471 472/243/468
+f 455/230/455 454/233/458 469/248/473 470/245/470
+f 453/232/457 452/237/462 467/252/477 468/247/472
+f 464/234/459 463/239/464 478/254/479 479/249/474
+f 462/238/463 461/240/465 476/255/480 477/253/478
+f 481/256/481 15/5/5 30/8/8 485/257/482
+f 485/257/482 30/8/8 45/40/40 487/258/483
+f 487/258/483 45/40/40 60/55/55 489/259/484
+f 489/259/484 60/55/55 75/70/70 491/260/485
+f 491/260/485 75/70/70 90/85/85 493/261/486
+f 493/261/486 90/85/85 105/100/100 495/262/487
+f 495/262/487 105/100/100 120/115/115 497/263/488
+f 497/264/488 120/137/115 135/140/130 499/265/489
+f 499/265/489 135/140/130 150/160/145 501/266/490
+f 501/266/490 150/160/145 165/175/160 503/267/491
+f 503/267/491 165/175/160 180/190/175 505/268/492
+f 505/268/492 180/190/175 195/205/190 507/269/493
+f 507/269/493 195/205/190 210/220/205 509/270/494
+f 509/270/494 210/220/205 225/235/220 511/271/495
+f 511/271/495 225/235/220 240/250/235 513/272/496
+f 513/272/496 240/250/235 255/5/250 515/256/497
+f 515/256/497 255/5/250 270/8/265 517/257/498
+f 517/257/498 270/8/265 285/40/280 519/258/499
+f 519/258/499 285/40/280 300/55/295 521/259/500
+f 521/259/500 300/55/295 315/70/310 523/260/501
+f 523/260/501 315/70/310 330/85/325 525/261/502
+f 525/261/502 330/85/325 345/100/340 527/262/503
+f 527/262/503 345/100/340 360/115/355 529/263/504
+f 529/264/504 360/137/355 375/140/370 531/265/505
+f 531/265/505 375/140/370 390/160/385 533/266/506
+f 533/266/506 390/160/385 405/175/400 534/267/507
+f 534/267/507 405/175/400 420/190/415 536/268/508
+f 536/268/508 420/190/415 435/205/430 538/269/509
+f 538/269/509 435/205/430 450/220/445 540/270/510
+f 540/270/510 450/220/445 465/235/460 542/271/511
+f 542/271/511 465/235/460 480/250/475 544/272/512
+f 475/242/467 474/241/466 9/21/21 10/18/18
+f 473/244/469 472/243/468 7/25/25 8/22/22
+f 471/246/471 470/245/470 5/29/29 6/26/26
+f 469/248/473 468/247/472 3/2/2 4/1/1
+f 480/250/475 479/249/474 14/6/6 15/5/5
+f 467/252/477 466/251/476 1/10/10 2/9/9
+f 478/254/479 477/253/478 12/14/14 13/13/13
+f 476/255/480 475/242/467 10/18/18 11/17/17
+f 474/241/466 473/244/469 8/22/22 9/21/21
+f 472/243/468 471/246/471 6/26/26 7/25/25
+f 470/245/470 469/248/473 4/1/1 5/29/29
+f 544/272/512 480/250/475 15/5/5 481/256/481
+f 468/247/472 467/252/477 2/9/9 3/2/2
+f 479/249/474 478/254/479 13/13/13 14/6/6
+f 477/253/478 476/255/480 11/17/17 12/14/14
+f 466/251/476 543/273/513 483/274/514 1/10/10
+f 451/236/461 541/275/515 543/273/513 466/251/476
+f 436/221/446 539/276/516 541/275/515 451/236/461
+f 421/206/431 537/277/517 539/276/516 436/221/446
+f 406/191/416 535/278/518 537/277/517 421/206/431
+f 391/176/401 482/279/519 535/278/518 406/191/416
+f 376/161/386 532/280/520 482/279/519 391/176/401
+f 361/143/371 530/281/521 532/280/520 376/161/386
+f 346/142/356 528/282/522 530/281/521 361/143/371
+f 331/101/341 526/283/523 528/284/522 346/116/356
+f 316/86/326 524/285/524 526/283/523 331/101/341
+f 301/71/311 522/286/525 524/285/524 316/86/326
+f 286/56/296 520/287/526 522/286/525 301/71/311
+f 271/41/281 518/288/527 520/287/526 286/56/296
+f 256/11/266 516/289/528 518/288/527 271/41/281
+f 241/10/251 514/274/529 516/289/528 256/11/266
+f 226/251/236 512/273/530 514/274/529 241/10/251
+f 211/236/221 510/275/531 512/273/530 226/251/236
+f 196/221/206 508/276/532 510/275/531 211/236/221
+f 181/206/191 506/277/533 508/276/532 196/221/206
+f 166/191/176 504/278/534 506/277/533 181/206/191
+f 151/176/161 502/279/535 504/278/534 166/191/176
+f 136/161/146 500/280/536 502/279/535 151/176/161
+f 121/143/131 498/281/537 500/280/536 136/161/146
+f 106/142/116 496/282/538 498/281/537 121/143/131
+f 91/101/101 494/283/539 496/284/538 106/116/116
+f 76/86/86 492/285/540 494/283/539 91/101/101
+f 61/71/71 490/286/541 492/285/540 76/86/86
+f 46/56/56 488/287/542 490/286/541 61/71/71
+f 31/41/41 486/288/543 488/287/542 46/56/56
+f 16/11/11 484/289/544 486/288/543 31/41/41
+f 1/10/10 483/274/514 484/289/544 16/11/11
+f 543/290/513 541/291/515 539/292/516 537/293/517 535/294/518 482/295/519 532/296/520 530/297/521 528/298/522 526/299/523 524/300/524 522/301/525 520/302/526 518/303/527 516/304/528 514/305/529 512/306/530 510/307/531 508/308/532 506/309/533 504/310/534 502/311/535 500/312/536 498/313/537 496/314/538 494/315/539 492/316/540 490/317/541 488/318/542 486/319/543 484/320/544 483/321/514
+f 544/290/512 481/291/481 485/292/482 487/293/483 489/294/484 491/295/485 493/296/486 495/297/487 497/298/488 499/299/489 501/300/490 503/301/491 505/302/492 507/303/493 509/304/494 511/305/495 513/306/496 515/307/497 517/308/498 519/309/499 521/310/500 523/311/501 525/312/502 527/313/503 529/314/504 531/315/505 533/316/506 534/317/507 536/318/508 538/319/509 540/320/510 542/321/511
diff --git a/technic/technic/models/technic_two_curved_edge.obj b/technic/technic/models/technic_two_curved_edge.obj
new file mode 100644
index 0000000..a468ddf
--- /dev/null
+++ b/technic/technic/models/technic_two_curved_edge.obj
@@ -0,0 +1,207 @@
+# Blender v2.73 (sub 0) OBJ File: 'slope_test_quarter_round_corner_onetexture.blend'
+# www.blender.org
+o corner1_Cylinder
+v 0.415732 0.277783 0.499997
+v 0.461936 0.191340 0.499997
+v 0.415735 0.277783 -0.415732
+v 0.461940 0.191340 -0.461937
+v 0.490389 0.097544 0.499997
+v 0.353551 0.353551 0.499997
+v 0.353555 0.353551 -0.353551
+v 0.499996 -0.000000 0.499997
+v 0.277783 0.415732 0.499997
+v 0.490393 0.097544 -0.490389
+v 0.277787 0.415732 -0.277784
+v 0.191340 0.461936 0.499997
+v 0.191344 0.461937 -0.191341
+v 0.097544 0.490389 0.499997
+v 0.097547 0.490391 -0.097545
+v -0.000000 0.499996 0.499997
+v -0.499997 0.499997 0.499997
+v -0.499997 0.499997 -0.000030
+v -0.499997 0.415735 -0.277785
+v -0.499997 0.461940 -0.191342
+v -0.499997 0.490393 -0.097545
+v -0.500000 -0.500000 -0.500000
+v -0.499997 -0.499997 0.499997
+v 0.000000 0.499998 0.000000
+v -0.499998 0.000014 -0.499999
+v -0.499997 0.353553 -0.353554
+v -0.499998 0.097545 -0.490393
+v -0.499997 0.277785 -0.415735
+v -0.499998 0.191342 -0.461940
+v 0.499997 -0.000000 -0.499996
+v 0.500000 -0.500000 -0.500000
+v 0.499997 -0.499997 0.499997
+v -0.499997 -0.499997 0.499997
+v -0.499997 0.499997 0.499997
+v -0.499997 0.499997 -0.000030
+v -0.499997 0.415735 -0.277785
+v -0.499997 0.461940 -0.191342
+v -0.499997 0.490393 -0.097545
+v -0.500000 -0.500000 -0.500000
+v -0.499998 0.000014 -0.499999
+v -0.499997 0.353553 -0.353554
+v -0.499998 0.097545 -0.490393
+v -0.499997 0.277785 -0.415735
+v -0.499998 0.191342 -0.461940
+v -0.499998 -0.033351 0.033348
+v -0.500000 -0.500000 -0.500000
+v 0.500000 -0.500000 -0.500000
+v 0.499997 -0.499997 0.499997
+v 0.415732 0.277783 0.499997
+v 0.461936 0.191340 0.499997
+v 0.490389 0.097544 0.499997
+v 0.353551 0.353551 0.499997
+v 0.499996 -0.000000 0.499997
+v 0.277783 0.415732 0.499997
+v 0.191340 0.461936 0.499997
+v -0.499997 -0.499997 0.499997
+v 0.097544 0.490389 0.499997
+v -0.000000 0.499996 0.499997
+v -0.499997 0.499997 0.499997
+v -0.033351 -0.033351 0.499997
+v 0.499997 -0.499997 0.499997
+vt 1.000000 0.500100
+vt 0.990395 0.597625
+vt 0.466756 0.466756
+vt 1.000000 0.000200
+vt 0.000201 0.000201
+vt 0.597626 0.990394
+vt 0.500101 1.000000
+vt 0.691404 0.961947
+vt 0.777830 0.915751
+vt 0.853583 0.853583
+vt 0.915752 0.777829
+vt 0.000201 1.000000
+vt 0.961948 0.691403
+vt -0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt -0.000000 1.000000
+vt 0.533443 0.466757
+vt 0.000202 0.500115
+vt 0.402575 0.990397
+vt 0.308797 0.961949
+vt 0.222371 0.915753
+vt 0.146617 0.853584
+vt 0.084449 0.777831
+vt 0.038253 0.691405
+vt 0.009806 0.597626
+vt 0.999996 0.125448
+vt 0.222353 0.125462
+vt 0.146597 0.000612
+vt 0.999995 0.000594
+vt 0.000178 0.874582
+vt 0.915751 0.874577
+vt 0.853580 0.999436
+vt 0.000178 0.999439
+vt 0.999808 0.625427
+vt 0.009599 0.625446
+vt -0.000005 0.500594
+vt 0.999807 0.500594
+vt 0.597441 0.374574
+vt 0.499912 0.499435
+vt 0.000000 0.499434
+vt 0.000000 0.374576
+vt 0.999999 0.375154
+vt 1.000000 0.499969
+vt 0.500093 0.500015
+vt 0.402562 0.375164
+vt 0.999812 0.999983
+vt 0.146415 1.000000
+vt 0.084244 0.875149
+vt 0.999811 0.875131
+vt 0.990396 0.624861
+vt 0.961947 0.749719
+vt 0.000178 0.749724
+vt 0.000178 0.624866
+vt 0.777649 0.124857
+vt 0.691221 0.249715
+vt 0.000001 0.249719
+vt 0.000001 0.124861
+vt 0.308782 0.250314
+vt 0.999998 0.250301
+vt 0.853403 -0.000000
+vt 0.038047 0.750298
+vt 0.999809 0.750280
+vt 0.000177 0.500008
+vt 0.000000 0.500000
+vt 0.500000 1.000000
+vt 0.500000 0.500000
+vn 0.000000 -0.000000 1.000000
+vn -0.000000 -1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.831500 -0.555600
+vn 0.325800 0.887500 -0.325800
+vn 0.429700 0.794100 -0.429700
+vn 0.000000 0.707100 -0.707100
+vn 0.831500 0.555600 0.000000
+vn 0.531000 0.660300 -0.531000
+vn 0.707100 0.707100 0.000000
+vn 0.000000 0.195100 -0.980800
+vn 0.683900 0.254100 -0.683900
+vn 0.705500 0.067100 -0.705500
+vn 0.000000 0.049100 -0.998800
+vn 0.123100 0.984700 -0.123100
+vn 0.036800 0.998600 -0.036800
+vn 0.049100 0.998800 0.000000
+vn 0.195100 0.980800 0.000000
+vn 0.000000 0.980800 -0.195100
+vn 0.000000 0.998800 -0.049100
+vn 0.000000 0.555600 -0.831500
+vn 0.620400 0.479600 -0.620400
+vn 0.923900 0.382700 0.000000
+vn 0.980800 0.195100 0.000000
+vn 0.223300 0.948800 -0.223200
+vn 0.382700 0.923900 0.000000
+vn 0.555600 0.831500 0.000000
+vn 0.000000 0.923900 -0.382700
+vn 0.000000 0.382700 -0.923900
+vn 0.998800 0.049100 0.000000
+vn 0.707100 0.000000 -0.707100
+vn 0.000000 0.000000 -1.000000
+vn -0.000000 1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+s off
+f 53/1/1 51/2/1 60/3/1
+f 61/4/1 53/1/1 60/3/1 56/5/1
+f 57/6/1 58/7/1 60/3/1
+f 55/8/1 57/6/1 60/3/1
+f 54/9/1 55/8/1 60/3/1
+f 52/10/1 54/9/1 60/3/1
+f 49/11/1 52/10/1 60/3/1
+f 59/12/1 56/5/1 60/3/1 58/7/1
+f 50/13/1 49/11/1 60/3/1
+f 48/14/2 23/15/2 46/16/2 47/17/2
+f 39/5/3 33/4/3 45/18/3 40/19/3
+f 35/7/3 38/20/3 45/18/3
+f 38/20/3 37/21/3 45/18/3
+f 37/21/3 36/22/3 45/18/3
+f 36/22/3 41/23/3 45/18/3
+f 41/23/3 43/24/3 45/18/3
+f 43/24/3 44/25/3 45/18/3
+f 44/25/3 42/26/3 45/18/3
+f 42/26/3 40/19/3 45/18/3
+f 34/16/3 35/7/3 45/18/3 33/4/3
+f 51/2/1 50/13/1 60/3/1
+s 1
+f 19/27/4 11/28/5 7/29/6 26/30/7
+f 1/31/8 3/32/9 7/33/6 6/34/10
+f 27/35/11 10/36/12 30/37/13 25/38/14
+f 15/39/15 24/40/16 16/41/17 14/42/18
+f 21/43/19 18/44/20 24/45/16 15/46/15
+f 26/47/7 7/48/6 3/49/9 28/50/21
+f 10/51/12 4/52/22 2/53/23 5/54/24
+f 11/55/5 13/56/25 12/57/26 9/58/27
+f 21/43/19 15/46/15 13/59/25 20/60/28
+f 20/60/28 13/59/25 11/28/5 19/27/4
+f 9/58/27 6/14/10 7/61/6 11/55/5
+f 4/52/22 3/32/9 1/31/8 2/53/23
+f 3/49/9 4/62/22 29/63/29 28/50/21
+f 10/51/12 5/54/24 8/64/30 30/44/13
+f 29/63/29 4/62/22 10/36/12 27/35/11
+f 25/44/14 30/65/13 31/14/31 22/15/32
+f 16/66/17 24/67/16 18/44/20 17/16/33
+f 8/65/30 32/14/34 31/15/31 30/44/13
+f 12/57/26 13/56/25 15/39/15 14/42/18
diff --git a/technic/technic/register.lua b/technic/technic/register.lua
new file mode 100644
index 0000000..8f75b81
--- /dev/null
+++ b/technic/technic/register.lua
@@ -0,0 +1,58 @@
+-- This file includes the functions and data structures for registering machines and tools for LV, MV, HV types.
+-- We use the technic namespace for these functions and data to avoid eventual conflict.
+
+technic.receiver = "RE"
+technic.producer = "PR"
+technic.producer_receiver = "PR_RE"
+technic.battery = "BA"
+
+technic.machines = {}
+technic.power_tools = {}
+technic.networks = {}
+
+
+function technic.register_tier(tier, description)
+ technic.machines[tier] = {}
+end
+
+function technic.register_machine(tier, nodename, machine_type)
+ if not technic.machines[tier] then
+ return
+ end
+ technic.machines[tier][nodename] = machine_type
+end
+
+function technic.register_power_tool(craftitem, max_charge)
+ technic.power_tools[craftitem] = max_charge
+end
+
+
+-- Utility functions. Not sure exactly what they do.. water.lua uses the two first.
+function technic.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 technic.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
+
+-- Wear down a tool depending on the remaining charge.
+function technic.set_RE_wear(itemstack, item_load, max_load)
+ if (minetest.registered_items[itemstack:get_name()].wear_represents or "mechanical_wear") ~= "technic_RE_charge" then return itemstack end
+ local temp
+ if item_load == 0 then
+ temp = 0
+ else
+ temp = 65536 - math.floor(item_load / max_load * 65535)
+ if temp > 65535 then temp = 65535 end
+ if temp < 1 then temp = 1 end
+ end
+ itemstack:set_wear(temp)
+ return itemstack
+end
diff --git a/technic/technic/sounds/chainsaw.ogg b/technic/technic/sounds/chainsaw.ogg
new file mode 100644
index 0000000..5fe7552
--- /dev/null
+++ b/technic/technic/sounds/chainsaw.ogg
Binary files differ
diff --git a/technic/technic/sounds/item_drop_pickup.1.ogg b/technic/technic/sounds/item_drop_pickup.1.ogg
new file mode 100644
index 0000000..2ae432d
--- /dev/null
+++ b/technic/technic/sounds/item_drop_pickup.1.ogg
Binary files differ
diff --git a/technic/technic/sounds/item_drop_pickup.2.ogg b/technic/technic/sounds/item_drop_pickup.2.ogg
new file mode 100644
index 0000000..f58bf08
--- /dev/null
+++ b/technic/technic/sounds/item_drop_pickup.2.ogg
Binary files differ
diff --git a/technic/technic/sounds/item_drop_pickup.3.ogg b/technic/technic/sounds/item_drop_pickup.3.ogg
new file mode 100644
index 0000000..cf57c94
--- /dev/null
+++ b/technic/technic/sounds/item_drop_pickup.3.ogg
Binary files differ
diff --git a/technic/technic/sounds/item_drop_pickup.4.ogg b/technic/technic/sounds/item_drop_pickup.4.ogg
new file mode 100644
index 0000000..bfe99d9
--- /dev/null
+++ b/technic/technic/sounds/item_drop_pickup.4.ogg
Binary files differ
diff --git a/technic/technic/sounds/mining_drill.ogg b/technic/technic/sounds/mining_drill.ogg
new file mode 100644
index 0000000..1493544
--- /dev/null
+++ b/technic/technic/sounds/mining_drill.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg b/technic/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg
new file mode 100644
index 0000000..3332deb
--- /dev/null
+++ b/technic/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg b/technic/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg
new file mode 100644
index 0000000..3d290b0
--- /dev/null
+++ b/technic/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_laser_mk1.0.ogg b/technic/technic/sounds/technic_laser_mk1.0.ogg
new file mode 100644
index 0000000..19be080
--- /dev/null
+++ b/technic/technic/sounds/technic_laser_mk1.0.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_laser_mk1.1.ogg b/technic/technic/sounds/technic_laser_mk1.1.ogg
new file mode 100644
index 0000000..7792be1
--- /dev/null
+++ b/technic/technic/sounds/technic_laser_mk1.1.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_laser_mk2.0.ogg b/technic/technic/sounds/technic_laser_mk2.0.ogg
new file mode 100644
index 0000000..2cf1548
--- /dev/null
+++ b/technic/technic/sounds/technic_laser_mk2.0.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_laser_mk2.1.ogg b/technic/technic/sounds/technic_laser_mk2.1.ogg
new file mode 100644
index 0000000..b3f9afb
--- /dev/null
+++ b/technic/technic/sounds/technic_laser_mk2.1.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_laser_mk2.2.ogg b/technic/technic/sounds/technic_laser_mk2.2.ogg
new file mode 100644
index 0000000..a4ee091
--- /dev/null
+++ b/technic/technic/sounds/technic_laser_mk2.2.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_laser_mk3.1.ogg b/technic/technic/sounds/technic_laser_mk3.1.ogg
new file mode 100644
index 0000000..f948913
--- /dev/null
+++ b/technic/technic/sounds/technic_laser_mk3.1.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_laser_mk3.2.ogg b/technic/technic/sounds/technic_laser_mk3.2.ogg
new file mode 100644
index 0000000..636c306
--- /dev/null
+++ b/technic/technic/sounds/technic_laser_mk3.2.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_prospector_hit.ogg b/technic/technic/sounds/technic_prospector_hit.ogg
new file mode 100644
index 0000000..3a8ad2d
--- /dev/null
+++ b/technic/technic/sounds/technic_prospector_hit.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_prospector_miss.ogg b/technic/technic/sounds/technic_prospector_miss.ogg
new file mode 100644
index 0000000..0f050d0
--- /dev/null
+++ b/technic/technic/sounds/technic_prospector_miss.ogg
Binary files differ
diff --git a/technic/technic/sounds/technic_sonic_screwdriver.ogg b/technic/technic/sounds/technic_sonic_screwdriver.ogg
new file mode 100644
index 0000000..471bb72
--- /dev/null
+++ b/technic/technic/sounds/technic_sonic_screwdriver.ogg
Binary files differ
diff --git a/technic/technic/sounds/vacuumcleaner.ogg b/technic/technic/sounds/vacuumcleaner.ogg
new file mode 100644
index 0000000..39d72de
--- /dev/null
+++ b/technic/technic/sounds/vacuumcleaner.ogg
Binary files differ
diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png
new file mode 100644
index 0000000..2848f89
--- /dev/null
+++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png
Binary files differ
diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png
new file mode 100644
index 0000000..4661177
--- /dev/null
+++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png
Binary files differ
diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png
new file mode 100644
index 0000000..5187fab
--- /dev/null
+++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png
Binary files differ
diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png
new file mode 100644
index 0000000..3d380da
--- /dev/null
+++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png
Binary files differ
diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png
new file mode 100644
index 0000000..ba2bd89
--- /dev/null
+++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png
Binary files differ
diff --git a/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png
new file mode 100644
index 0000000..2fa8f18
--- /dev/null
+++ b/technic/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png
Binary files differ
diff --git a/technic/technic/textures/power_meter.png b/technic/technic/textures/power_meter.png
new file mode 100644
index 0000000..9f96cac
--- /dev/null
+++ b/technic/technic/textures/power_meter.png
Binary files differ
diff --git a/technic/technic/textures/technic_acacia_grindings.png b/technic/technic/textures/technic_acacia_grindings.png
new file mode 100644
index 0000000..bcfefc9
--- /dev/null
+++ b/technic/technic/textures/technic_acacia_grindings.png
Binary files differ
diff --git a/technic/technic/textures/technic_admin_anchor.png b/technic/technic/textures/technic_admin_anchor.png
new file mode 100644
index 0000000..7ce9b4c
--- /dev/null
+++ b/technic/technic/textures/technic_admin_anchor.png
Binary files differ
diff --git a/technic/technic/textures/technic_akalin_dust.png b/technic/technic/textures/technic_akalin_dust.png
new file mode 100644
index 0000000..052b0ac
--- /dev/null
+++ b/technic/technic/textures/technic_akalin_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_alatro_dust.png b/technic/technic/textures/technic_alatro_dust.png
new file mode 100644
index 0000000..172af25
--- /dev/null
+++ b/technic/technic/textures/technic_alatro_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_arol_dust.png b/technic/technic/textures/technic_arol_dust.png
new file mode 100644
index 0000000..1a575ed
--- /dev/null
+++ b/technic/technic/textures/technic_arol_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_battery.png b/technic/technic/textures/technic_battery.png
new file mode 100644
index 0000000..ee83b74
--- /dev/null
+++ b/technic/technic/textures/technic_battery.png
Binary files differ
diff --git a/technic/technic/textures/technic_battery_box_side.png b/technic/technic/textures/technic_battery_box_side.png
new file mode 100644
index 0000000..98a22d6
--- /dev/null
+++ b/technic/technic/textures/technic_battery_box_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_battery_box_side8.png b/technic/technic/textures/technic_battery_box_side8.png
new file mode 100644
index 0000000..65806f4
--- /dev/null
+++ b/technic/technic/textures/technic_battery_box_side8.png
Binary files differ
diff --git a/technic/technic/textures/technic_battery_box_side_mv.png b/technic/technic/textures/technic_battery_box_side_mv.png
new file mode 100644
index 0000000..06a4be5
--- /dev/null
+++ b/technic/technic/textures/technic_battery_box_side_mv.png
Binary files differ
diff --git a/technic/technic/textures/technic_battery_meter_fg.png b/technic/technic/textures/technic_battery_meter_fg.png
new file mode 100644
index 0000000..2f19bc7
--- /dev/null
+++ b/technic/technic/textures/technic_battery_meter_fg.png
Binary files differ
diff --git a/technic/technic/textures/technic_battery_reload.png b/technic/technic/textures/technic_battery_reload.png
new file mode 100644
index 0000000..4ce48d8
--- /dev/null
+++ b/technic/technic/textures/technic_battery_reload.png
Binary files differ
diff --git a/technic/technic/textures/technic_bronze_dust.png b/technic/technic/textures/technic_bronze_dust.png
new file mode 100644
index 0000000..a613205
--- /dev/null
+++ b/technic/technic/textures/technic_bronze_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_bucket_corium.png b/technic/technic/textures/technic_bucket_corium.png
new file mode 100644
index 0000000..82da7ca
--- /dev/null
+++ b/technic/technic/textures/technic_bucket_corium.png
Binary files differ
diff --git a/technic/technic/textures/technic_carbon_cloth.png b/technic/technic/textures/technic_carbon_cloth.png
new file mode 100644
index 0000000..65a6dab
--- /dev/null
+++ b/technic/technic/textures/technic_carbon_cloth.png
Binary files differ
diff --git a/technic/technic/textures/technic_carbon_plate.png b/technic/technic/textures/technic_carbon_plate.png
new file mode 100644
index 0000000..5da83b8
--- /dev/null
+++ b/technic/technic/textures/technic_carbon_plate.png
Binary files differ
diff --git a/technic/technic/textures/technic_carbon_steel_dust.png b/technic/technic/textures/technic_carbon_steel_dust.png
new file mode 100644
index 0000000..0fa8a17
--- /dev/null
+++ b/technic/technic/textures/technic_carbon_steel_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_cast_iron_dust.png b/technic/technic/textures/technic_cast_iron_dust.png
new file mode 100644
index 0000000..b5690ac
--- /dev/null
+++ b/technic/technic/textures/technic_cast_iron_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_chainsaw.png b/technic/technic/textures/technic_chainsaw.png
new file mode 100644
index 0000000..1a69893
--- /dev/null
+++ b/technic/technic/textures/technic_chainsaw.png
Binary files differ
diff --git a/technic/technic/textures/technic_chernobylite_block.png b/technic/technic/textures/technic_chernobylite_block.png
new file mode 100644
index 0000000..a837c66
--- /dev/null
+++ b/technic/technic/textures/technic_chernobylite_block.png
Binary files differ
diff --git a/technic/technic/textures/technic_chromium_dust.png b/technic/technic/textures/technic_chromium_dust.png
new file mode 100644
index 0000000..0e48069
--- /dev/null
+++ b/technic/technic/textures/technic_chromium_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_bottom.png b/technic/technic/textures/technic_cnc_bottom.png
new file mode 100644
index 0000000..e600cb1
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_cylinder.png b/technic/technic/textures/technic_cnc_cylinder.png
new file mode 100644
index 0000000..48921bd
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_cylinder.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_cylinder_horizontal.png b/technic/technic/textures/technic_cnc_cylinder_horizontal.png
new file mode 100644
index 0000000..82eb24c
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_cylinder_horizontal.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_element_cross.png b/technic/technic/textures/technic_cnc_element_cross.png
new file mode 100644
index 0000000..cc66571
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_element_cross.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_element_edge.png b/technic/technic/textures/technic_cnc_element_edge.png
new file mode 100644
index 0000000..1245ea7
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_element_edge.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_element_end.png b/technic/technic/textures/technic_cnc_element_end.png
new file mode 100644
index 0000000..562eb2b
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_element_end.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_element_straight.png b/technic/technic/textures/technic_cnc_element_straight.png
new file mode 100644
index 0000000..d42966e
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_element_straight.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_element_t.png b/technic/technic/textures/technic_cnc_element_t.png
new file mode 100644
index 0000000..a462764
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_element_t.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_front.png b/technic/technic/textures/technic_cnc_front.png
new file mode 100644
index 0000000..6cc0490
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_front_active.png b/technic/technic/textures/technic_cnc_front_active.png
new file mode 100644
index 0000000..f7a3c7f
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_full.png b/technic/technic/textures/technic_cnc_full.png
new file mode 100644
index 0000000..60f8a81
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_full.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_half.png b/technic/technic/textures/technic_cnc_half.png
new file mode 100644
index 0000000..2c4d3a8
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_half.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_milling_background.png b/technic/technic/textures/technic_cnc_milling_background.png
new file mode 100644
index 0000000..6a9c2f4
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_milling_background.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_oblate_spheroid.png b/technic/technic/textures/technic_cnc_oblate_spheroid.png
new file mode 100644
index 0000000..b196e7d
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_oblate_spheroid.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_onecurvededge.png b/technic/technic/textures/technic_cnc_onecurvededge.png
new file mode 100644
index 0000000..8325846
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_onecurvededge.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_pyramid.png b/technic/technic/textures/technic_cnc_pyramid.png
new file mode 100644
index 0000000..d8cc713
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_pyramid.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_side.png b/technic/technic/textures/technic_cnc_side.png
new file mode 100644
index 0000000..1ecbbac
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_slope.png b/technic/technic/textures/technic_cnc_slope.png
new file mode 100644
index 0000000..493d560
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_slope.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_slope_edge.png b/technic/technic/textures/technic_cnc_slope_edge.png
new file mode 100644
index 0000000..1b601c4
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_slope_edge.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_slope_edge_upsdwn.png b/technic/technic/textures/technic_cnc_slope_edge_upsdwn.png
new file mode 100644
index 0000000..350c22d
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_slope_edge_upsdwn.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_slope_inner_edge.png b/technic/technic/textures/technic_cnc_slope_inner_edge.png
new file mode 100644
index 0000000..3f5ab9e
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_slope_inner_edge.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png b/technic/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png
new file mode 100644
index 0000000..a1fee78
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_slope_lying.png b/technic/technic/textures/technic_cnc_slope_lying.png
new file mode 100644
index 0000000..099ed59
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_slope_lying.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_slope_upsdwn.png b/technic/technic/textures/technic_cnc_slope_upsdwn.png
new file mode 100644
index 0000000..2a34b8b
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_slope_upsdwn.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_sphere.png b/technic/technic/textures/technic_cnc_sphere.png
new file mode 100644
index 0000000..791b32b
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_sphere.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_spike.png b/technic/technic/textures/technic_cnc_spike.png
new file mode 100644
index 0000000..b445b40
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_spike.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_stick.png b/technic/technic/textures/technic_cnc_stick.png
new file mode 100644
index 0000000..acaf1cb
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_stick.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_top.png b/technic/technic/textures/technic_cnc_top.png
new file mode 100644
index 0000000..5123334
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_top_active.png b/technic/technic/textures/technic_cnc_top_active.png
new file mode 100644
index 0000000..2bc9d81
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_top_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_cnc_twocurvededge.png b/technic/technic/textures/technic_cnc_twocurvededge.png
new file mode 100644
index 0000000..b50a257
--- /dev/null
+++ b/technic/technic/textures/technic_cnc_twocurvededge.png
Binary files differ
diff --git a/technic/technic/textures/technic_coal_alloy_furnace_bottom.png b/technic/technic/textures/technic_coal_alloy_furnace_bottom.png
new file mode 100644
index 0000000..077dec5
--- /dev/null
+++ b/technic/technic/textures/technic_coal_alloy_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_coal_alloy_furnace_front.png b/technic/technic/textures/technic_coal_alloy_furnace_front.png
new file mode 100644
index 0000000..d9d93dd
--- /dev/null
+++ b/technic/technic/textures/technic_coal_alloy_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_coal_alloy_furnace_front_active.png b/technic/technic/textures/technic_coal_alloy_furnace_front_active.png
new file mode 100644
index 0000000..ffc4e0a
--- /dev/null
+++ b/technic/technic/textures/technic_coal_alloy_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_coal_alloy_furnace_side.png b/technic/technic/textures/technic_coal_alloy_furnace_side.png
new file mode 100644
index 0000000..d5c7066
--- /dev/null
+++ b/technic/technic/textures/technic_coal_alloy_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_coal_alloy_furnace_top.png b/technic/technic/textures/technic_coal_alloy_furnace_top.png
new file mode 100644
index 0000000..6424fc0
--- /dev/null
+++ b/technic/technic/textures/technic_coal_alloy_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_coal_dust.png b/technic/technic/textures/technic_coal_dust.png
new file mode 100644
index 0000000..a1486c6
--- /dev/null
+++ b/technic/technic/textures/technic_coal_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_common_tree_grindings.png b/technic/technic/textures/technic_common_tree_grindings.png
new file mode 100644
index 0000000..e17bb69
--- /dev/null
+++ b/technic/technic/textures/technic_common_tree_grindings.png
Binary files differ
diff --git a/technic/technic/textures/technic_composite_plate.png b/technic/technic/textures/technic_composite_plate.png
new file mode 100644
index 0000000..79b7b8d
--- /dev/null
+++ b/technic/technic/textures/technic_composite_plate.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_back.png b/technic/technic/textures/technic_constructor_back.png
new file mode 100644
index 0000000..f002363
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_back.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_front_off.png b/technic/technic/textures/technic_constructor_front_off.png
new file mode 100644
index 0000000..f3f7856
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_front_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_front_on.png b/technic/technic/textures/technic_constructor_front_on.png
new file mode 100644
index 0000000..d733765
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_front_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk1_bottom_off.png b/technic/technic/textures/technic_constructor_mk1_bottom_off.png
new file mode 100644
index 0000000..0c52557
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk1_bottom_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk1_bottom_on.png b/technic/technic/textures/technic_constructor_mk1_bottom_on.png
new file mode 100644
index 0000000..0c46c57
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk1_bottom_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk1_side1_off.png b/technic/technic/textures/technic_constructor_mk1_side1_off.png
new file mode 100644
index 0000000..e64ddbe
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk1_side1_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk1_side1_on.png b/technic/technic/textures/technic_constructor_mk1_side1_on.png
new file mode 100644
index 0000000..eda98d8
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk1_side1_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk1_side2_off.png b/technic/technic/textures/technic_constructor_mk1_side2_off.png
new file mode 100644
index 0000000..b33fcfb
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk1_side2_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk1_side2_on.png b/technic/technic/textures/technic_constructor_mk1_side2_on.png
new file mode 100644
index 0000000..17e4786
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk1_side2_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk1_top_off.png b/technic/technic/textures/technic_constructor_mk1_top_off.png
new file mode 100644
index 0000000..9f3846c
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk1_top_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk1_top_on.png b/technic/technic/textures/technic_constructor_mk1_top_on.png
new file mode 100644
index 0000000..5c8d6fb
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk1_top_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk2_bottom_off.png b/technic/technic/textures/technic_constructor_mk2_bottom_off.png
new file mode 100644
index 0000000..e926dda
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk2_bottom_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk2_bottom_on.png b/technic/technic/textures/technic_constructor_mk2_bottom_on.png
new file mode 100644
index 0000000..52d739b
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk2_bottom_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk2_side1_off.png b/technic/technic/textures/technic_constructor_mk2_side1_off.png
new file mode 100644
index 0000000..2fd42a2
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk2_side1_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk2_side1_on.png b/technic/technic/textures/technic_constructor_mk2_side1_on.png
new file mode 100644
index 0000000..4c75c83
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk2_side1_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk2_side2_off.png b/technic/technic/textures/technic_constructor_mk2_side2_off.png
new file mode 100644
index 0000000..f6407e7
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk2_side2_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk2_side2_on.png b/technic/technic/textures/technic_constructor_mk2_side2_on.png
new file mode 100644
index 0000000..e40db48
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk2_side2_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk2_top_off.png b/technic/technic/textures/technic_constructor_mk2_top_off.png
new file mode 100644
index 0000000..e5227d1
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk2_top_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk2_top_on.png b/technic/technic/textures/technic_constructor_mk2_top_on.png
new file mode 100644
index 0000000..9762bd6
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk2_top_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk3_bottom_off.png b/technic/technic/textures/technic_constructor_mk3_bottom_off.png
new file mode 100644
index 0000000..606d97e
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk3_bottom_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk3_bottom_on.png b/technic/technic/textures/technic_constructor_mk3_bottom_on.png
new file mode 100644
index 0000000..878e4ff
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk3_bottom_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk3_side1_off.png b/technic/technic/textures/technic_constructor_mk3_side1_off.png
new file mode 100644
index 0000000..84dd7eb
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk3_side1_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk3_side1_on.png b/technic/technic/textures/technic_constructor_mk3_side1_on.png
new file mode 100644
index 0000000..2741d2d
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk3_side1_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk3_side2_off.png b/technic/technic/textures/technic_constructor_mk3_side2_off.png
new file mode 100644
index 0000000..75a5031
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk3_side2_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk3_side2_on.png b/technic/technic/textures/technic_constructor_mk3_side2_on.png
new file mode 100644
index 0000000..0a150ed
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk3_side2_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk3_top_off.png b/technic/technic/textures/technic_constructor_mk3_top_off.png
new file mode 100644
index 0000000..c716752
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk3_top_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_constructor_mk3_top_on.png b/technic/technic/textures/technic_constructor_mk3_top_on.png
new file mode 100644
index 0000000..acbe85b
--- /dev/null
+++ b/technic/technic/textures/technic_constructor_mk3_top_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_control_logic_unit.png b/technic/technic/textures/technic_control_logic_unit.png
new file mode 100644
index 0000000..c7b4b16
--- /dev/null
+++ b/technic/technic/textures/technic_control_logic_unit.png
Binary files differ
diff --git a/technic/technic/textures/technic_copper_coil.png b/technic/technic/textures/technic_copper_coil.png
new file mode 100644
index 0000000..db6db1a
--- /dev/null
+++ b/technic/technic/textures/technic_copper_coil.png
Binary files differ
diff --git a/technic/technic/textures/technic_copper_dust.png b/technic/technic/textures/technic_copper_dust.png
new file mode 100644
index 0000000..cad33ea
--- /dev/null
+++ b/technic/technic/textures/technic_copper_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_copper_plate.png b/technic/technic/textures/technic_copper_plate.png
new file mode 100644
index 0000000..99a49c8
--- /dev/null
+++ b/technic/technic/textures/technic_copper_plate.png
Binary files differ
diff --git a/technic/technic/textures/technic_corium_flowing_animated.png b/technic/technic/textures/technic_corium_flowing_animated.png
new file mode 100644
index 0000000..1d29f16
--- /dev/null
+++ b/technic/technic/textures/technic_corium_flowing_animated.png
Binary files differ
diff --git a/technic/technic/textures/technic_corium_source_animated.png b/technic/technic/textures/technic_corium_source_animated.png
new file mode 100644
index 0000000..6c3ee56
--- /dev/null
+++ b/technic/technic/textures/technic_corium_source_animated.png
Binary files differ
diff --git a/technic/technic/textures/technic_deployer_back.png b/technic/technic/textures/technic_deployer_back.png
new file mode 100644
index 0000000..12e5a31
--- /dev/null
+++ b/technic/technic/textures/technic_deployer_back.png
Binary files differ
diff --git a/technic/technic/textures/technic_deployer_bottom.png b/technic/technic/textures/technic_deployer_bottom.png
new file mode 100644
index 0000000..febbe18
--- /dev/null
+++ b/technic/technic/textures/technic_deployer_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_deployer_front_off.png b/technic/technic/textures/technic_deployer_front_off.png
new file mode 100644
index 0000000..9593112
--- /dev/null
+++ b/technic/technic/textures/technic_deployer_front_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_deployer_front_on.png b/technic/technic/textures/technic_deployer_front_on.png
new file mode 100644
index 0000000..f78de4c
--- /dev/null
+++ b/technic/technic/textures/technic_deployer_front_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_deployer_side.png b/technic/technic/textures/technic_deployer_side.png
new file mode 100644
index 0000000..73af8f8
--- /dev/null
+++ b/technic/technic/textures/technic_deployer_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_deployer_side1.png b/technic/technic/textures/technic_deployer_side1.png
new file mode 100644
index 0000000..8ef28d3
--- /dev/null
+++ b/technic/technic/textures/technic_deployer_side1.png
Binary files differ
diff --git a/technic/technic/textures/technic_deployer_side2.png b/technic/technic/textures/technic_deployer_side2.png
new file mode 100644
index 0000000..ccb2cb9
--- /dev/null
+++ b/technic/technic/textures/technic_deployer_side2.png
Binary files differ
diff --git a/technic/technic/textures/technic_deployer_top.png b/technic/technic/textures/technic_deployer_top.png
new file mode 100644
index 0000000..262c9f6
--- /dev/null
+++ b/technic/technic/textures/technic_deployer_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_diamond_block_blue.png b/technic/technic/textures/technic_diamond_block_blue.png
new file mode 100644
index 0000000..9f59fba
--- /dev/null
+++ b/technic/technic/textures/technic_diamond_block_blue.png
Binary files differ
diff --git a/technic/technic/textures/technic_diamond_block_green.png b/technic/technic/textures/technic_diamond_block_green.png
new file mode 100644
index 0000000..585c4b8
--- /dev/null
+++ b/technic/technic/textures/technic_diamond_block_green.png
Binary files differ
diff --git a/technic/technic/textures/technic_diamond_block_red.png b/technic/technic/textures/technic_diamond_block_red.png
new file mode 100644
index 0000000..ed30957
--- /dev/null
+++ b/technic/technic/textures/technic_diamond_block_red.png
Binary files differ
diff --git a/technic/technic/textures/technic_diamond_drill_head.png b/technic/technic/textures/technic_diamond_drill_head.png
new file mode 100644
index 0000000..e3d31e8
--- /dev/null
+++ b/technic/technic/textures/technic_diamond_drill_head.png
Binary files differ
diff --git a/technic/technic/textures/technic_doped_silicon_wafer.png b/technic/technic/textures/technic_doped_silicon_wafer.png
new file mode 100644
index 0000000..6365137
--- /dev/null
+++ b/technic/technic/textures/technic_doped_silicon_wafer.png
Binary files differ
diff --git a/technic/technic/textures/technic_fine_copper_wire.png b/technic/technic/textures/technic_fine_copper_wire.png
new file mode 100644
index 0000000..3e663bb
--- /dev/null
+++ b/technic/technic/textures/technic_fine_copper_wire.png
Binary files differ
diff --git a/technic/technic/textures/technic_fine_gold_wire.png b/technic/technic/textures/technic_fine_gold_wire.png
new file mode 100644
index 0000000..54a7a52
--- /dev/null
+++ b/technic/technic/textures/technic_fine_gold_wire.png
Binary files differ
diff --git a/technic/technic/textures/technic_fine_silver_wire.png b/technic/technic/textures/technic_fine_silver_wire.png
new file mode 100644
index 0000000..f40a52b
--- /dev/null
+++ b/technic/technic/textures/technic_fine_silver_wire.png
Binary files differ
diff --git a/technic/technic/textures/technic_flashlight.png b/technic/technic/textures/technic_flashlight.png
new file mode 100644
index 0000000..8e7b75a
--- /dev/null
+++ b/technic/technic/textures/technic_flashlight.png
Binary files differ
diff --git a/technic/technic/textures/technic_forcefield_animated.png b/technic/technic/textures/technic_forcefield_animated.png
new file mode 100644
index 0000000..7763840
--- /dev/null
+++ b/technic/technic/textures/technic_forcefield_animated.png
Binary files differ
diff --git a/technic/technic/textures/technic_forcefield_emitter_off.png b/technic/technic/textures/technic_forcefield_emitter_off.png
new file mode 100644
index 0000000..4c4582f
--- /dev/null
+++ b/technic/technic/textures/technic_forcefield_emitter_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_forcefield_emitter_on.png b/technic/technic/textures/technic_forcefield_emitter_on.png
new file mode 100644
index 0000000..1f32af6
--- /dev/null
+++ b/technic/technic/textures/technic_forcefield_emitter_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_frame.png b/technic/technic/textures/technic_frame.png
new file mode 100644
index 0000000..4998120
--- /dev/null
+++ b/technic/technic/textures/technic_frame.png
Binary files differ
diff --git a/technic/technic/textures/technic_geothermal_side.png b/technic/technic/textures/technic_geothermal_side.png
new file mode 100644
index 0000000..90fb430
--- /dev/null
+++ b/technic/technic/textures/technic_geothermal_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_geothermal_top.png b/technic/technic/textures/technic_geothermal_top.png
new file mode 100644
index 0000000..601ff15
--- /dev/null
+++ b/technic/technic/textures/technic_geothermal_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_geothermal_top_active.png b/technic/technic/textures/technic_geothermal_top_active.png
new file mode 100644
index 0000000..f02bec6
--- /dev/null
+++ b/technic/technic/textures/technic_geothermal_top_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_gold_dust.png b/technic/technic/textures/technic_gold_dust.png
new file mode 100644
index 0000000..48c24ae
--- /dev/null
+++ b/technic/technic/textures/technic_gold_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_graphite.png b/technic/technic/textures/technic_graphite.png
new file mode 100644
index 0000000..00cd0ee
--- /dev/null
+++ b/technic/technic/textures/technic_graphite.png
Binary files differ
diff --git a/technic/technic/textures/technic_grinder_front.png b/technic/technic/textures/technic_grinder_front.png
new file mode 100644
index 0000000..a28dbc1
--- /dev/null
+++ b/technic/technic/textures/technic_grinder_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_grinder_side.png b/technic/technic/textures/technic_grinder_side.png
new file mode 100644
index 0000000..af562f2
--- /dev/null
+++ b/technic/technic/textures/technic_grinder_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_grinder_top.png b/technic/technic/textures/technic_grinder_top.png
new file mode 100644
index 0000000..b074e13
--- /dev/null
+++ b/technic/technic/textures/technic_grinder_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides.png b/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides.png
new file mode 100644
index 0000000..9121999
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png b/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png
new file mode 100644
index 0000000..c8006eb
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_white_tb.png b/technic/technic/textures/technic_homedecor_glowlight_cube_white_tb.png
new file mode 100644
index 0000000..b2e355a
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_cube_white_tb.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png
new file mode 100644
index 0000000..b79be07
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png
new file mode 100644
index 0000000..a9d397a
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png
new file mode 100644
index 0000000..daf03ab
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_thick_white_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thick_white_sides.png
new file mode 100644
index 0000000..44c2b36
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_thick_white_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png
new file mode 100644
index 0000000..937999e
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png
new file mode 100644
index 0000000..769b054
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png
new file mode 100644
index 0000000..57820f1
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_thin_white_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thin_white_sides.png
new file mode 100644
index 0000000..0a337a5
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_thin_white_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png
new file mode 100644
index 0000000..0fd3b1e
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png
new file mode 100644
index 0000000..55bb6c0
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png b/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png
new file mode 100644
index 0000000..4b28a27
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_white_tb.png b/technic/technic/textures/technic_homedecor_glowlight_white_tb.png
new file mode 100644
index 0000000..fdc8a4d
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_white_tb.png
Binary files differ
diff --git a/technic/technic/textures/technic_homedecor_glowlight_yellow_tb.png b/technic/technic/textures/technic_homedecor_glowlight_yellow_tb.png
new file mode 100644
index 0000000..ffd9c58
--- /dev/null
+++ b/technic/technic/textures/technic_homedecor_glowlight_yellow_tb.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_battery_box_bottom.png b/technic/technic/textures/technic_hv_battery_box_bottom.png
new file mode 100644
index 0000000..996b2d4
--- /dev/null
+++ b/technic/technic/textures/technic_hv_battery_box_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_battery_box_side.png b/technic/technic/textures/technic_hv_battery_box_side.png
new file mode 100644
index 0000000..fffd8ea
--- /dev/null
+++ b/technic/technic/textures/technic_hv_battery_box_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_battery_box_top.png b/technic/technic/textures/technic_hv_battery_box_top.png
new file mode 100644
index 0000000..49dee71
--- /dev/null
+++ b/technic/technic/textures/technic_hv_battery_box_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_cable.png b/technic/technic/textures/technic_hv_cable.png
new file mode 100644
index 0000000..7cb368d
--- /dev/null
+++ b/technic/technic/textures/technic_hv_cable.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_cable_wield.png b/technic/technic/textures/technic_hv_cable_wield.png
new file mode 100644
index 0000000..7b9ca58
--- /dev/null
+++ b/technic/technic/textures/technic_hv_cable_wield.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_down_converter_bottom.png b/technic/technic/textures/technic_hv_down_converter_bottom.png
new file mode 100644
index 0000000..996b2d4
--- /dev/null
+++ b/technic/technic/textures/technic_hv_down_converter_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_down_converter_side.png b/technic/technic/textures/technic_hv_down_converter_side.png
new file mode 100644
index 0000000..ab904f1
--- /dev/null
+++ b/technic/technic/textures/technic_hv_down_converter_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_down_converter_top.png b/technic/technic/textures/technic_hv_down_converter_top.png
new file mode 100644
index 0000000..996b2d4
--- /dev/null
+++ b/technic/technic/textures/technic_hv_down_converter_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_generator_front.png b/technic/technic/textures/technic_hv_generator_front.png
new file mode 100644
index 0000000..6a14686
--- /dev/null
+++ b/technic/technic/textures/technic_hv_generator_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_generator_front_active.png b/technic/technic/textures/technic_hv_generator_front_active.png
new file mode 100644
index 0000000..d92c699
--- /dev/null
+++ b/technic/technic/textures/technic_hv_generator_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_generator_side.png b/technic/technic/textures/technic_hv_generator_side.png
new file mode 100644
index 0000000..3073e0f
--- /dev/null
+++ b/technic/technic/textures/technic_hv_generator_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_generator_top.png b/technic/technic/textures/technic_hv_generator_top.png
new file mode 100644
index 0000000..646168c
--- /dev/null
+++ b/technic/technic/textures/technic_hv_generator_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_grinder_bottom.png b/technic/technic/textures/technic_hv_grinder_bottom.png
new file mode 100644
index 0000000..fa2c135
--- /dev/null
+++ b/technic/technic/textures/technic_hv_grinder_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_grinder_front.png b/technic/technic/textures/technic_hv_grinder_front.png
new file mode 100644
index 0000000..a5bca0a
--- /dev/null
+++ b/technic/technic/textures/technic_hv_grinder_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_grinder_front_active.png b/technic/technic/textures/technic_hv_grinder_front_active.png
new file mode 100644
index 0000000..4077630
--- /dev/null
+++ b/technic/technic/textures/technic_hv_grinder_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_grinder_side.png b/technic/technic/textures/technic_hv_grinder_side.png
new file mode 100644
index 0000000..c3063c4
--- /dev/null
+++ b/technic/technic/textures/technic_hv_grinder_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_grinder_side_tube.png b/technic/technic/textures/technic_hv_grinder_side_tube.png
new file mode 100644
index 0000000..43bcca5
--- /dev/null
+++ b/technic/technic/textures/technic_hv_grinder_side_tube.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_grinder_top.png b/technic/technic/textures/technic_hv_grinder_top.png
new file mode 100644
index 0000000..e0df36b
--- /dev/null
+++ b/technic/technic/textures/technic_hv_grinder_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_nuclear_reactor_core.png b/technic/technic/textures/technic_hv_nuclear_reactor_core.png
new file mode 100644
index 0000000..4661177
--- /dev/null
+++ b/technic/technic/textures/technic_hv_nuclear_reactor_core.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_solar_array_bottom.png b/technic/technic/textures/technic_hv_solar_array_bottom.png
new file mode 100644
index 0000000..596e79a
--- /dev/null
+++ b/technic/technic/textures/technic_hv_solar_array_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_solar_array_side.png b/technic/technic/textures/technic_hv_solar_array_side.png
new file mode 100644
index 0000000..a3aa8c7
--- /dev/null
+++ b/technic/technic/textures/technic_hv_solar_array_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_solar_array_top.png b/technic/technic/textures/technic_hv_solar_array_top.png
new file mode 100644
index 0000000..b7f0b43
--- /dev/null
+++ b/technic/technic/textures/technic_hv_solar_array_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_hv_transformer.png b/technic/technic/textures/technic_hv_transformer.png
new file mode 100644
index 0000000..e1d4c98
--- /dev/null
+++ b/technic/technic/textures/technic_hv_transformer.png
Binary files differ
diff --git a/technic/technic/textures/technic_injector_bottom.png b/technic/technic/textures/technic_injector_bottom.png
new file mode 100644
index 0000000..39916bd
--- /dev/null
+++ b/technic/technic/textures/technic_injector_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_injector_side.png b/technic/technic/textures/technic_injector_side.png
new file mode 100644
index 0000000..a5419a1
--- /dev/null
+++ b/technic/technic/textures/technic_injector_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_injector_top.png b/technic/technic/textures/technic_injector_top.png
new file mode 100644
index 0000000..440649c
--- /dev/null
+++ b/technic/technic/textures/technic_injector_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_kalite_dust.png b/technic/technic/textures/technic_kalite_dust.png
new file mode 100644
index 0000000..3a9e10f
--- /dev/null
+++ b/technic/technic/textures/technic_kalite_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_laser_beam_mk1.png b/technic/technic/textures/technic_laser_beam_mk1.png
new file mode 100644
index 0000000..4cf9b3e
--- /dev/null
+++ b/technic/technic/textures/technic_laser_beam_mk1.png
Binary files differ
diff --git a/technic/technic/textures/technic_laser_beam_mk2.png b/technic/technic/textures/technic_laser_beam_mk2.png
new file mode 100644
index 0000000..9e27a8c
--- /dev/null
+++ b/technic/technic/textures/technic_laser_beam_mk2.png
Binary files differ
diff --git a/technic/technic/textures/technic_laser_beam_mk3.png b/technic/technic/textures/technic_laser_beam_mk3.png
new file mode 100644
index 0000000..5a17e83
--- /dev/null
+++ b/technic/technic/textures/technic_laser_beam_mk3.png
Binary files differ
diff --git a/technic/technic/textures/technic_lava_can.png b/technic/technic/textures/technic_lava_can.png
new file mode 100644
index 0000000..abe1a8c
--- /dev/null
+++ b/technic/technic/textures/technic_lava_can.png
Binary files differ
diff --git a/technic/technic/textures/technic_light.png b/technic/technic/textures/technic_light.png
new file mode 100644
index 0000000..334cb07
--- /dev/null
+++ b/technic/technic/textures/technic_light.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_alloy_furnace_bottom.png b/technic/technic/textures/technic_lv_alloy_furnace_bottom.png
new file mode 100644
index 0000000..2c0aaee
--- /dev/null
+++ b/technic/technic/textures/technic_lv_alloy_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_alloy_furnace_front.png b/technic/technic/textures/technic_lv_alloy_furnace_front.png
new file mode 100644
index 0000000..2d65cda
--- /dev/null
+++ b/technic/technic/textures/technic_lv_alloy_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_alloy_furnace_front_active.png b/technic/technic/textures/technic_lv_alloy_furnace_front_active.png
new file mode 100644
index 0000000..1ced989
--- /dev/null
+++ b/technic/technic/textures/technic_lv_alloy_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_alloy_furnace_side.png b/technic/technic/textures/technic_lv_alloy_furnace_side.png
new file mode 100644
index 0000000..778ad88
--- /dev/null
+++ b/technic/technic/textures/technic_lv_alloy_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_alloy_furnace_top.png b/technic/technic/textures/technic_lv_alloy_furnace_top.png
new file mode 100644
index 0000000..706793b
--- /dev/null
+++ b/technic/technic/textures/technic_lv_alloy_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_battery_box_bottom.png b/technic/technic/textures/technic_lv_battery_box_bottom.png
new file mode 100644
index 0000000..a6124e6
--- /dev/null
+++ b/technic/technic/textures/technic_lv_battery_box_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_battery_box_side.png b/technic/technic/textures/technic_lv_battery_box_side.png
new file mode 100644
index 0000000..24d4e4e
--- /dev/null
+++ b/technic/technic/textures/technic_lv_battery_box_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_battery_box_top.png b/technic/technic/textures/technic_lv_battery_box_top.png
new file mode 100644
index 0000000..b32100f
--- /dev/null
+++ b/technic/technic/textures/technic_lv_battery_box_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_cable.png b/technic/technic/textures/technic_lv_cable.png
new file mode 100644
index 0000000..0071bc9
--- /dev/null
+++ b/technic/technic/textures/technic_lv_cable.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_cable_wield.png b/technic/technic/textures/technic_lv_cable_wield.png
new file mode 100644
index 0000000..bc7704d
--- /dev/null
+++ b/technic/technic/textures/technic_lv_cable_wield.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_compressor_back.png b/technic/technic/textures/technic_lv_compressor_back.png
new file mode 100644
index 0000000..11286e3
--- /dev/null
+++ b/technic/technic/textures/technic_lv_compressor_back.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_compressor_bottom.png b/technic/technic/textures/technic_lv_compressor_bottom.png
new file mode 100644
index 0000000..886f27e
--- /dev/null
+++ b/technic/technic/textures/technic_lv_compressor_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_compressor_front.png b/technic/technic/textures/technic_lv_compressor_front.png
new file mode 100644
index 0000000..007d6de
--- /dev/null
+++ b/technic/technic/textures/technic_lv_compressor_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_compressor_front_active.png b/technic/technic/textures/technic_lv_compressor_front_active.png
new file mode 100644
index 0000000..b3d27c0
--- /dev/null
+++ b/technic/technic/textures/technic_lv_compressor_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_compressor_side.png b/technic/technic/textures/technic_lv_compressor_side.png
new file mode 100644
index 0000000..87acda6
--- /dev/null
+++ b/technic/technic/textures/technic_lv_compressor_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_compressor_top.png b/technic/technic/textures/technic_lv_compressor_top.png
new file mode 100644
index 0000000..786b859
--- /dev/null
+++ b/technic/technic/textures/technic_lv_compressor_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_electric_furnace_bottom.png b/technic/technic/textures/technic_lv_electric_furnace_bottom.png
new file mode 100644
index 0000000..15fa6de
--- /dev/null
+++ b/technic/technic/textures/technic_lv_electric_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_electric_furnace_front.png b/technic/technic/textures/technic_lv_electric_furnace_front.png
new file mode 100644
index 0000000..755aadf
--- /dev/null
+++ b/technic/technic/textures/technic_lv_electric_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_electric_furnace_front_active.png b/technic/technic/textures/technic_lv_electric_furnace_front_active.png
new file mode 100644
index 0000000..de7f1f9
--- /dev/null
+++ b/technic/technic/textures/technic_lv_electric_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_electric_furnace_side.png b/technic/technic/textures/technic_lv_electric_furnace_side.png
new file mode 100644
index 0000000..80cf742
--- /dev/null
+++ b/technic/technic/textures/technic_lv_electric_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_electric_furnace_top.png b/technic/technic/textures/technic_lv_electric_furnace_top.png
new file mode 100644
index 0000000..fbadd9a
--- /dev/null
+++ b/technic/technic/textures/technic_lv_electric_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_extractor_bottom.png b/technic/technic/textures/technic_lv_extractor_bottom.png
new file mode 100644
index 0000000..aecd719
--- /dev/null
+++ b/technic/technic/textures/technic_lv_extractor_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_extractor_front.png b/technic/technic/textures/technic_lv_extractor_front.png
new file mode 100644
index 0000000..1bd7e9a
--- /dev/null
+++ b/technic/technic/textures/technic_lv_extractor_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_extractor_front_active.png b/technic/technic/textures/technic_lv_extractor_front_active.png
new file mode 100644
index 0000000..7f8b30a
--- /dev/null
+++ b/technic/technic/textures/technic_lv_extractor_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_extractor_side.png b/technic/technic/textures/technic_lv_extractor_side.png
new file mode 100644
index 0000000..99d9486
--- /dev/null
+++ b/technic/technic/textures/technic_lv_extractor_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_extractor_top.png b/technic/technic/textures/technic_lv_extractor_top.png
new file mode 100644
index 0000000..e7d9ff9
--- /dev/null
+++ b/technic/technic/textures/technic_lv_extractor_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_generator_front.png b/technic/technic/textures/technic_lv_generator_front.png
new file mode 100644
index 0000000..2d64844
--- /dev/null
+++ b/technic/technic/textures/technic_lv_generator_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_generator_front_active.png b/technic/technic/textures/technic_lv_generator_front_active.png
new file mode 100644
index 0000000..4e57ca0
--- /dev/null
+++ b/technic/technic/textures/technic_lv_generator_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_generator_side.png b/technic/technic/textures/technic_lv_generator_side.png
new file mode 100644
index 0000000..5cbcbef
--- /dev/null
+++ b/technic/technic/textures/technic_lv_generator_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_generator_top.png b/technic/technic/textures/technic_lv_generator_top.png
new file mode 100644
index 0000000..e2f3db3
--- /dev/null
+++ b/technic/technic/textures/technic_lv_generator_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_grinder_bottom.png b/technic/technic/textures/technic_lv_grinder_bottom.png
new file mode 100644
index 0000000..aecd719
--- /dev/null
+++ b/technic/technic/textures/technic_lv_grinder_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_grinder_front.png b/technic/technic/textures/technic_lv_grinder_front.png
new file mode 100644
index 0000000..1bd7e9a
--- /dev/null
+++ b/technic/technic/textures/technic_lv_grinder_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_grinder_front_active.png b/technic/technic/textures/technic_lv_grinder_front_active.png
new file mode 100644
index 0000000..7f8b30a
--- /dev/null
+++ b/technic/technic/textures/technic_lv_grinder_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_grinder_side.png b/technic/technic/textures/technic_lv_grinder_side.png
new file mode 100644
index 0000000..99d9486
--- /dev/null
+++ b/technic/technic/textures/technic_lv_grinder_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_grinder_top.png b/technic/technic/textures/technic_lv_grinder_top.png
new file mode 100644
index 0000000..e7d9ff9
--- /dev/null
+++ b/technic/technic/textures/technic_lv_grinder_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_solar_array_bottom.png b/technic/technic/textures/technic_lv_solar_array_bottom.png
new file mode 100644
index 0000000..9e888e3
--- /dev/null
+++ b/technic/technic/textures/technic_lv_solar_array_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_solar_array_side.png b/technic/technic/textures/technic_lv_solar_array_side.png
new file mode 100644
index 0000000..b22447e
--- /dev/null
+++ b/technic/technic/textures/technic_lv_solar_array_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_solar_array_top.png b/technic/technic/textures/technic_lv_solar_array_top.png
new file mode 100644
index 0000000..cabd315
--- /dev/null
+++ b/technic/technic/textures/technic_lv_solar_array_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_lv_transformer.png b/technic/technic/textures/technic_lv_transformer.png
new file mode 100644
index 0000000..613b196
--- /dev/null
+++ b/technic/technic/textures/technic_lv_transformer.png
Binary files differ
diff --git a/technic/technic/textures/technic_machine_bottom.png b/technic/technic/textures/technic_machine_bottom.png
new file mode 100644
index 0000000..48a47b0
--- /dev/null
+++ b/technic/technic/textures/technic_machine_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_machine_casing.png b/technic/technic/textures/technic_machine_casing.png
new file mode 100644
index 0000000..d596733
--- /dev/null
+++ b/technic/technic/textures/technic_machine_casing.png
Binary files differ
diff --git a/technic/technic/textures/technic_mining_drill.png b/technic/technic/textures/technic_mining_drill.png
new file mode 100644
index 0000000..171888d
--- /dev/null
+++ b/technic/technic/textures/technic_mining_drill.png
Binary files differ
diff --git a/technic/technic/textures/technic_mining_drill_mk2.png b/technic/technic/textures/technic_mining_drill_mk2.png
new file mode 100644
index 0000000..30be719
--- /dev/null
+++ b/technic/technic/textures/technic_mining_drill_mk2.png
Binary files differ
diff --git a/technic/technic/textures/technic_mining_drill_mk3.png b/technic/technic/textures/technic_mining_drill_mk3.png
new file mode 100644
index 0000000..30de896
--- /dev/null
+++ b/technic/technic/textures/technic_mining_drill_mk3.png
Binary files differ
diff --git a/technic/technic/textures/technic_mining_laser_mk1.png b/technic/technic/textures/technic_mining_laser_mk1.png
new file mode 100644
index 0000000..29faeb4
--- /dev/null
+++ b/technic/technic/textures/technic_mining_laser_mk1.png
Binary files differ
diff --git a/technic/technic/textures/technic_mining_laser_mk2.png b/technic/technic/textures/technic_mining_laser_mk2.png
new file mode 100644
index 0000000..2d67c0f
--- /dev/null
+++ b/technic/technic/textures/technic_mining_laser_mk2.png
Binary files differ
diff --git a/technic/technic/textures/technic_mining_laser_mk3.png b/technic/technic/textures/technic_mining_laser_mk3.png
new file mode 100644
index 0000000..db9ee26
--- /dev/null
+++ b/technic/technic/textures/technic_mining_laser_mk3.png
Binary files differ
diff --git a/technic/technic/textures/technic_mithril_dust.png b/technic/technic/textures/technic_mithril_dust.png
new file mode 100644
index 0000000..adfbe6c
--- /dev/null
+++ b/technic/technic/textures/technic_mithril_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_mixed_metal_ingot.png b/technic/technic/textures/technic_mixed_metal_ingot.png
new file mode 100644
index 0000000..8f6847b
--- /dev/null
+++ b/technic/technic/textures/technic_mixed_metal_ingot.png
Binary files differ
diff --git a/technic/technic/textures/technic_motor.png b/technic/technic/textures/technic_motor.png
new file mode 100644
index 0000000..77d4b91
--- /dev/null
+++ b/technic/technic/textures/technic_motor.png
Binary files differ
diff --git a/technic/technic/textures/technic_music_player_bottom.png b/technic/technic/textures/technic_music_player_bottom.png
new file mode 100644
index 0000000..bd8fd55
--- /dev/null
+++ b/technic/technic/textures/technic_music_player_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_music_player_side.png b/technic/technic/textures/technic_music_player_side.png
new file mode 100644
index 0000000..6c34fea
--- /dev/null
+++ b/technic/technic/textures/technic_music_player_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_music_player_top.png b/technic/technic/textures/technic_music_player_top.png
new file mode 100644
index 0000000..0d34563
--- /dev/null
+++ b/technic/technic/textures/technic_music_player_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_alloy_furnace_bottom.png b/technic/technic/textures/technic_mv_alloy_furnace_bottom.png
new file mode 100644
index 0000000..2c0aaee
--- /dev/null
+++ b/technic/technic/textures/technic_mv_alloy_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_alloy_furnace_front.png b/technic/technic/textures/technic_mv_alloy_furnace_front.png
new file mode 100644
index 0000000..a5dac82
--- /dev/null
+++ b/technic/technic/textures/technic_mv_alloy_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_alloy_furnace_front_active.png b/technic/technic/textures/technic_mv_alloy_furnace_front_active.png
new file mode 100644
index 0000000..f6e69a9
--- /dev/null
+++ b/technic/technic/textures/technic_mv_alloy_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_alloy_furnace_side.png b/technic/technic/textures/technic_mv_alloy_furnace_side.png
new file mode 100644
index 0000000..0430479
--- /dev/null
+++ b/technic/technic/textures/technic_mv_alloy_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_alloy_furnace_side_tube.png b/technic/technic/textures/technic_mv_alloy_furnace_side_tube.png
new file mode 100644
index 0000000..1800eed
--- /dev/null
+++ b/technic/technic/textures/technic_mv_alloy_furnace_side_tube.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_alloy_furnace_top.png b/technic/technic/textures/technic_mv_alloy_furnace_top.png
new file mode 100644
index 0000000..f44e3c0
--- /dev/null
+++ b/technic/technic/textures/technic_mv_alloy_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_battery_box_bottom.png b/technic/technic/textures/technic_mv_battery_box_bottom.png
new file mode 100644
index 0000000..a610660
--- /dev/null
+++ b/technic/technic/textures/technic_mv_battery_box_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_battery_box_side.png b/technic/technic/textures/technic_mv_battery_box_side.png
new file mode 100644
index 0000000..06a4be5
--- /dev/null
+++ b/technic/technic/textures/technic_mv_battery_box_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_battery_box_top.png b/technic/technic/textures/technic_mv_battery_box_top.png
new file mode 100644
index 0000000..b32100f
--- /dev/null
+++ b/technic/technic/textures/technic_mv_battery_box_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_cable.png b/technic/technic/textures/technic_mv_cable.png
new file mode 100644
index 0000000..2819d2b
--- /dev/null
+++ b/technic/technic/textures/technic_mv_cable.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_cable_wield.png b/technic/technic/textures/technic_mv_cable_wield.png
new file mode 100644
index 0000000..2d41e27
--- /dev/null
+++ b/technic/technic/textures/technic_mv_cable_wield.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_centrifuge_bottom.png b/technic/technic/textures/technic_mv_centrifuge_bottom.png
new file mode 100644
index 0000000..6dcd40f
--- /dev/null
+++ b/technic/technic/textures/technic_mv_centrifuge_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_centrifuge_front.png b/technic/technic/textures/technic_mv_centrifuge_front.png
new file mode 100644
index 0000000..e278a33
--- /dev/null
+++ b/technic/technic/textures/technic_mv_centrifuge_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_centrifuge_front_active.png b/technic/technic/textures/technic_mv_centrifuge_front_active.png
new file mode 100644
index 0000000..4cef912
--- /dev/null
+++ b/technic/technic/textures/technic_mv_centrifuge_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_centrifuge_side.png b/technic/technic/textures/technic_mv_centrifuge_side.png
new file mode 100644
index 0000000..eeef44a
--- /dev/null
+++ b/technic/technic/textures/technic_mv_centrifuge_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_centrifuge_top.png b/technic/technic/textures/technic_mv_centrifuge_top.png
new file mode 100644
index 0000000..813bbf8
--- /dev/null
+++ b/technic/technic/textures/technic_mv_centrifuge_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_compressor_back.png b/technic/technic/textures/technic_mv_compressor_back.png
new file mode 100644
index 0000000..11286e3
--- /dev/null
+++ b/technic/technic/textures/technic_mv_compressor_back.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_compressor_bottom.png b/technic/technic/textures/technic_mv_compressor_bottom.png
new file mode 100644
index 0000000..886f27e
--- /dev/null
+++ b/technic/technic/textures/technic_mv_compressor_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_compressor_front.png b/technic/technic/textures/technic_mv_compressor_front.png
new file mode 100644
index 0000000..007d6de
--- /dev/null
+++ b/technic/technic/textures/technic_mv_compressor_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_compressor_front_active.png b/technic/technic/textures/technic_mv_compressor_front_active.png
new file mode 100644
index 0000000..b3d27c0
--- /dev/null
+++ b/technic/technic/textures/technic_mv_compressor_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_compressor_side.png b/technic/technic/textures/technic_mv_compressor_side.png
new file mode 100644
index 0000000..87acda6
--- /dev/null
+++ b/technic/technic/textures/technic_mv_compressor_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_compressor_top.png b/technic/technic/textures/technic_mv_compressor_top.png
new file mode 100644
index 0000000..786b859
--- /dev/null
+++ b/technic/technic/textures/technic_mv_compressor_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_down_converter_bottom.png b/technic/technic/textures/technic_mv_down_converter_bottom.png
new file mode 100644
index 0000000..a610660
--- /dev/null
+++ b/technic/technic/textures/technic_mv_down_converter_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_down_converter_side.png b/technic/technic/textures/technic_mv_down_converter_side.png
new file mode 100644
index 0000000..6492d5c
--- /dev/null
+++ b/technic/technic/textures/technic_mv_down_converter_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_down_converter_top.png b/technic/technic/textures/technic_mv_down_converter_top.png
new file mode 100644
index 0000000..a610660
--- /dev/null
+++ b/technic/technic/textures/technic_mv_down_converter_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_electric_furnace_bottom.png b/technic/technic/textures/technic_mv_electric_furnace_bottom.png
new file mode 100644
index 0000000..e2e445e
--- /dev/null
+++ b/technic/technic/textures/technic_mv_electric_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_electric_furnace_front.png b/technic/technic/textures/technic_mv_electric_furnace_front.png
new file mode 100644
index 0000000..81c33cf
--- /dev/null
+++ b/technic/technic/textures/technic_mv_electric_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_electric_furnace_front_active.png b/technic/technic/textures/technic_mv_electric_furnace_front_active.png
new file mode 100644
index 0000000..2523f0e
--- /dev/null
+++ b/technic/technic/textures/technic_mv_electric_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_electric_furnace_side.png b/technic/technic/textures/technic_mv_electric_furnace_side.png
new file mode 100644
index 0000000..cd22a73
--- /dev/null
+++ b/technic/technic/textures/technic_mv_electric_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_electric_furnace_side_tube.png b/technic/technic/textures/technic_mv_electric_furnace_side_tube.png
new file mode 100644
index 0000000..bfeba18
--- /dev/null
+++ b/technic/technic/textures/technic_mv_electric_furnace_side_tube.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_electric_furnace_top.png b/technic/technic/textures/technic_mv_electric_furnace_top.png
new file mode 100644
index 0000000..635b6b7
--- /dev/null
+++ b/technic/technic/textures/technic_mv_electric_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_extractor_bottom.png b/technic/technic/textures/technic_mv_extractor_bottom.png
new file mode 100644
index 0000000..70f34ee
--- /dev/null
+++ b/technic/technic/textures/technic_mv_extractor_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_extractor_front.png b/technic/technic/textures/technic_mv_extractor_front.png
new file mode 100644
index 0000000..18648c2
--- /dev/null
+++ b/technic/technic/textures/technic_mv_extractor_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_extractor_front_active.png b/technic/technic/textures/technic_mv_extractor_front_active.png
new file mode 100644
index 0000000..ee86ade
--- /dev/null
+++ b/technic/technic/textures/technic_mv_extractor_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_extractor_side.png b/technic/technic/textures/technic_mv_extractor_side.png
new file mode 100644
index 0000000..cbe3673
--- /dev/null
+++ b/technic/technic/textures/technic_mv_extractor_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_extractor_top.png b/technic/technic/textures/technic_mv_extractor_top.png
new file mode 100644
index 0000000..2259d64
--- /dev/null
+++ b/technic/technic/textures/technic_mv_extractor_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_generator_front.png b/technic/technic/textures/technic_mv_generator_front.png
new file mode 100644
index 0000000..570e0c5
--- /dev/null
+++ b/technic/technic/textures/technic_mv_generator_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_generator_front_active.png b/technic/technic/textures/technic_mv_generator_front_active.png
new file mode 100644
index 0000000..3006a17
--- /dev/null
+++ b/technic/technic/textures/technic_mv_generator_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_generator_side.png b/technic/technic/textures/technic_mv_generator_side.png
new file mode 100644
index 0000000..21c0d41
--- /dev/null
+++ b/technic/technic/textures/technic_mv_generator_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_generator_top.png b/technic/technic/textures/technic_mv_generator_top.png
new file mode 100644
index 0000000..7afa5a1
--- /dev/null
+++ b/technic/technic/textures/technic_mv_generator_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_grinder_bottom.png b/technic/technic/textures/technic_mv_grinder_bottom.png
new file mode 100644
index 0000000..70f34ee
--- /dev/null
+++ b/technic/technic/textures/technic_mv_grinder_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_grinder_front.png b/technic/technic/textures/technic_mv_grinder_front.png
new file mode 100644
index 0000000..18648c2
--- /dev/null
+++ b/technic/technic/textures/technic_mv_grinder_front.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_grinder_front_active.png b/technic/technic/textures/technic_mv_grinder_front_active.png
new file mode 100644
index 0000000..ee86ade
--- /dev/null
+++ b/technic/technic/textures/technic_mv_grinder_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_grinder_side.png b/technic/technic/textures/technic_mv_grinder_side.png
new file mode 100644
index 0000000..cbe3673
--- /dev/null
+++ b/technic/technic/textures/technic_mv_grinder_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_grinder_side_tube.png b/technic/technic/textures/technic_mv_grinder_side_tube.png
new file mode 100644
index 0000000..196b7c1
--- /dev/null
+++ b/technic/technic/textures/technic_mv_grinder_side_tube.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_grinder_top.png b/technic/technic/textures/technic_mv_grinder_top.png
new file mode 100644
index 0000000..2259d64
--- /dev/null
+++ b/technic/technic/textures/technic_mv_grinder_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_solar_array_bottom.png b/technic/technic/textures/technic_mv_solar_array_bottom.png
new file mode 100644
index 0000000..596e79a
--- /dev/null
+++ b/technic/technic/textures/technic_mv_solar_array_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_solar_array_side.png b/technic/technic/textures/technic_mv_solar_array_side.png
new file mode 100644
index 0000000..917b9ed
--- /dev/null
+++ b/technic/technic/textures/technic_mv_solar_array_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_solar_array_top.png b/technic/technic/textures/technic_mv_solar_array_top.png
new file mode 100644
index 0000000..cdb7cf7
--- /dev/null
+++ b/technic/technic/textures/technic_mv_solar_array_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_mv_transformer.png b/technic/technic/textures/technic_mv_transformer.png
new file mode 100644
index 0000000..7c4688e
--- /dev/null
+++ b/technic/technic/textures/technic_mv_transformer.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_back.png b/technic/technic/textures/technic_nodebreaker_back.png
new file mode 100644
index 0000000..0af7422
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_back.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_bottom.png b/technic/technic/textures/technic_nodebreaker_bottom.png
new file mode 100644
index 0000000..ff1a2c6
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_bottom_off.png b/technic/technic/textures/technic_nodebreaker_bottom_off.png
new file mode 100644
index 0000000..0f456eb
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_bottom_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_bottom_on.png b/technic/technic/textures/technic_nodebreaker_bottom_on.png
new file mode 100644
index 0000000..6c4811a
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_bottom_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_front_off.png b/technic/technic/textures/technic_nodebreaker_front_off.png
new file mode 100644
index 0000000..488fd0a
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_front_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_front_on.png b/technic/technic/textures/technic_nodebreaker_front_on.png
new file mode 100644
index 0000000..4904e8b
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_front_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_side.png b/technic/technic/textures/technic_nodebreaker_side.png
new file mode 100644
index 0000000..aefd7c8
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_side1.png b/technic/technic/textures/technic_nodebreaker_side1.png
new file mode 100644
index 0000000..8cb8634
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_side1.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_side1_off.png b/technic/technic/textures/technic_nodebreaker_side1_off.png
new file mode 100644
index 0000000..857face
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_side1_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_side1_on.png b/technic/technic/textures/technic_nodebreaker_side1_on.png
new file mode 100644
index 0000000..c756f09
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_side1_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_side2.png b/technic/technic/textures/technic_nodebreaker_side2.png
new file mode 100644
index 0000000..c2855d0
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_side2.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_side2_off.png b/technic/technic/textures/technic_nodebreaker_side2_off.png
new file mode 100644
index 0000000..4c62f98
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_side2_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_side2_on.png b/technic/technic/textures/technic_nodebreaker_side2_on.png
new file mode 100644
index 0000000..b9e4823
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_side2_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_top.png b/technic/technic/textures/technic_nodebreaker_top.png
new file mode 100644
index 0000000..941d333
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_top_off.png b/technic/technic/textures/technic_nodebreaker_top_off.png
new file mode 100644
index 0000000..9139afe
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_top_off.png
Binary files differ
diff --git a/technic/technic/textures/technic_nodebreaker_top_on.png b/technic/technic/textures/technic_nodebreaker_top_on.png
new file mode 100644
index 0000000..4b0a661
--- /dev/null
+++ b/technic/technic/textures/technic_nodebreaker_top_on.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter.png b/technic/technic/textures/technic_power_meter.png
new file mode 100644
index 0000000..f1e5120
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter0.png b/technic/technic/textures/technic_power_meter0.png
new file mode 100644
index 0000000..1b1e662
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter0.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter1.png b/technic/technic/textures/technic_power_meter1.png
new file mode 100644
index 0000000..eb6be3b
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter1.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter2.png b/technic/technic/textures/technic_power_meter2.png
new file mode 100644
index 0000000..e3a3772
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter2.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter3.png b/technic/technic/textures/technic_power_meter3.png
new file mode 100644
index 0000000..6333035
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter3.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter4.png b/technic/technic/textures/technic_power_meter4.png
new file mode 100644
index 0000000..6346dbd
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter4.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter5.png b/technic/technic/textures/technic_power_meter5.png
new file mode 100644
index 0000000..80f79c6
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter5.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter6.png b/technic/technic/textures/technic_power_meter6.png
new file mode 100644
index 0000000..fe91bf5
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter6.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter7.png b/technic/technic/textures/technic_power_meter7.png
new file mode 100644
index 0000000..e02dd6d
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter7.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter8.png b/technic/technic/textures/technic_power_meter8.png
new file mode 100644
index 0000000..a12064c
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter8.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter_bg.png b/technic/technic/textures/technic_power_meter_bg.png
new file mode 100644
index 0000000..9667cda
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter_bg.png
Binary files differ
diff --git a/technic/technic/textures/technic_power_meter_fg.png b/technic/technic/textures/technic_power_meter_fg.png
new file mode 100644
index 0000000..7f2dde8
--- /dev/null
+++ b/technic/technic/textures/technic_power_meter_fg.png
Binary files differ
diff --git a/technic/technic/textures/technic_prospector.png b/technic/technic/textures/technic_prospector.png
new file mode 100644
index 0000000..2f9ee6c
--- /dev/null
+++ b/technic/technic/textures/technic_prospector.png
Binary files differ
diff --git a/technic/technic/textures/technic_raw_latex.png b/technic/technic/textures/technic_raw_latex.png
new file mode 100644
index 0000000..49bb11b
--- /dev/null
+++ b/technic/technic/textures/technic_raw_latex.png
Binary files differ
diff --git a/technic/technic/textures/technic_rubber.png b/technic/technic/textures/technic_rubber.png
new file mode 100644
index 0000000..9ed4a9d
--- /dev/null
+++ b/technic/technic/textures/technic_rubber.png
Binary files differ
diff --git a/technic/technic/textures/technic_rubber_leaves.png b/technic/technic/textures/technic_rubber_leaves.png
new file mode 100644
index 0000000..ae013e0
--- /dev/null
+++ b/technic/technic/textures/technic_rubber_leaves.png
Binary files differ
diff --git a/technic/technic/textures/technic_rubber_sapling.png b/technic/technic/textures/technic_rubber_sapling.png
new file mode 100644
index 0000000..e5c9f5d
--- /dev/null
+++ b/technic/technic/textures/technic_rubber_sapling.png
Binary files differ
diff --git a/technic/technic/textures/technic_rubber_tree_empty.png b/technic/technic/textures/technic_rubber_tree_empty.png
new file mode 100644
index 0000000..1792951
--- /dev/null
+++ b/technic/technic/textures/technic_rubber_tree_empty.png
Binary files differ
diff --git a/technic/technic/textures/technic_rubber_tree_full.png b/technic/technic/textures/technic_rubber_tree_full.png
new file mode 100644
index 0000000..08067ef
--- /dev/null
+++ b/technic/technic/textures/technic_rubber_tree_full.png
Binary files differ
diff --git a/technic/technic/textures/technic_rubber_tree_grindings.png b/technic/technic/textures/technic_rubber_tree_grindings.png
new file mode 100644
index 0000000..9f2f5d6
--- /dev/null
+++ b/technic/technic/textures/technic_rubber_tree_grindings.png
Binary files differ
diff --git a/technic/technic/textures/technic_sawdust.png b/technic/technic/textures/technic_sawdust.png
new file mode 100644
index 0000000..976e7f9
--- /dev/null
+++ b/technic/technic/textures/technic_sawdust.png
Binary files differ
diff --git a/technic/technic/textures/technic_screwdriver.png b/technic/technic/textures/technic_screwdriver.png
new file mode 100644
index 0000000..bd2da22
--- /dev/null
+++ b/technic/technic/textures/technic_screwdriver.png
Binary files differ
diff --git a/technic/technic/textures/technic_silicon_wafer.png b/technic/technic/textures/technic_silicon_wafer.png
new file mode 100644
index 0000000..78aef20
--- /dev/null
+++ b/technic/technic/textures/technic_silicon_wafer.png
Binary files differ
diff --git a/technic/technic/textures/technic_silver_dust.png b/technic/technic/textures/technic_silver_dust.png
new file mode 100644
index 0000000..19a5754
--- /dev/null
+++ b/technic/technic/textures/technic_silver_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_solar_panel_bottom.png b/technic/technic/textures/technic_solar_panel_bottom.png
new file mode 100644
index 0000000..9e888e3
--- /dev/null
+++ b/technic/technic/textures/technic_solar_panel_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_solar_panel_side.png b/technic/technic/textures/technic_solar_panel_side.png
new file mode 100644
index 0000000..b22447e
--- /dev/null
+++ b/technic/technic/textures/technic_solar_panel_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_solar_panel_top.png b/technic/technic/textures/technic_solar_panel_top.png
new file mode 100644
index 0000000..492764b
--- /dev/null
+++ b/technic/technic/textures/technic_solar_panel_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_sonic_screwdriver.png b/technic/technic/textures/technic_sonic_screwdriver.png
new file mode 100644
index 0000000..9b26b81
--- /dev/null
+++ b/technic/technic/textures/technic_sonic_screwdriver.png
Binary files differ
diff --git a/technic/technic/textures/technic_stainless_steel_dust.png b/technic/technic/textures/technic_stainless_steel_dust.png
new file mode 100644
index 0000000..6398be8
--- /dev/null
+++ b/technic/technic/textures/technic_stainless_steel_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_stainless_steel_ingot.png b/technic/technic/textures/technic_stainless_steel_ingot.png
new file mode 100644
index 0000000..7ec5e00
--- /dev/null
+++ b/technic/technic/textures/technic_stainless_steel_ingot.png
Binary files differ
diff --git a/technic/technic/textures/technic_supply_converter_bottom.png b/technic/technic/textures/technic_supply_converter_bottom.png
new file mode 100644
index 0000000..a610660
--- /dev/null
+++ b/technic/technic/textures/technic_supply_converter_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_supply_converter_side.png b/technic/technic/textures/technic_supply_converter_side.png
new file mode 100644
index 0000000..6492d5c
--- /dev/null
+++ b/technic/technic/textures/technic_supply_converter_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_supply_converter_top.png b/technic/technic/textures/technic_supply_converter_top.png
new file mode 100644
index 0000000..a610660
--- /dev/null
+++ b/technic/technic/textures/technic_supply_converter_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_talinite_dust.png b/technic/technic/textures/technic_talinite_dust.png
new file mode 100644
index 0000000..f228206
--- /dev/null
+++ b/technic/technic/textures/technic_talinite_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_tin_dust.png b/technic/technic/textures/technic_tin_dust.png
new file mode 100644
index 0000000..98e6f3f
--- /dev/null
+++ b/technic/technic/textures/technic_tin_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode1.png b/technic/technic/textures/technic_tool_mode1.png
new file mode 100644
index 0000000..571dbe5
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode1.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode2.png b/technic/technic/textures/technic_tool_mode2.png
new file mode 100644
index 0000000..891aa82
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode2.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode3.png b/technic/technic/textures/technic_tool_mode3.png
new file mode 100644
index 0000000..cd099a7
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode3.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode4.png b/technic/technic/textures/technic_tool_mode4.png
new file mode 100644
index 0000000..62f50d7
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode4.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode5.png b/technic/technic/textures/technic_tool_mode5.png
new file mode 100644
index 0000000..c918314
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode5.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode6.png b/technic/technic/textures/technic_tool_mode6.png
new file mode 100644
index 0000000..9268f47
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode6.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode7.png b/technic/technic/textures/technic_tool_mode7.png
new file mode 100644
index 0000000..5ba572a
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode7.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode8.png b/technic/technic/textures/technic_tool_mode8.png
new file mode 100644
index 0000000..b2655b6
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode8.png
Binary files differ
diff --git a/technic/technic/textures/technic_tool_mode9.png b/technic/technic/textures/technic_tool_mode9.png
new file mode 100644
index 0000000..2077afb
--- /dev/null
+++ b/technic/technic/textures/technic_tool_mode9.png
Binary files differ
diff --git a/technic/technic/textures/technic_tree_tap.png b/technic/technic/textures/technic_tree_tap.png
new file mode 100644
index 0000000..542f30f
--- /dev/null
+++ b/technic/technic/textures/technic_tree_tap.png
Binary files differ
diff --git a/technic/technic/textures/technic_uranium_dust.png b/technic/technic/textures/technic_uranium_dust.png
new file mode 100644
index 0000000..9c211dc
--- /dev/null
+++ b/technic/technic/textures/technic_uranium_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_uranium_fuel.png b/technic/technic/textures/technic_uranium_fuel.png
new file mode 100644
index 0000000..0a32c62
--- /dev/null
+++ b/technic/technic/textures/technic_uranium_fuel.png
Binary files differ
diff --git a/technic/technic/textures/technic_vacuum.png b/technic/technic/textures/technic_vacuum.png
new file mode 100644
index 0000000..1ef5815
--- /dev/null
+++ b/technic/technic/textures/technic_vacuum.png
Binary files differ
diff --git a/technic/technic/textures/technic_water_can.png b/technic/technic/textures/technic_water_can.png
new file mode 100644
index 0000000..eec75db
--- /dev/null
+++ b/technic/technic/textures/technic_water_can.png
Binary files differ
diff --git a/technic/technic/textures/technic_water_mill_side.png b/technic/technic/textures/technic_water_mill_side.png
new file mode 100644
index 0000000..f4bdb16
--- /dev/null
+++ b/technic/technic/textures/technic_water_mill_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_water_mill_top.png b/technic/technic/textures/technic_water_mill_top.png
new file mode 100644
index 0000000..601ff15
--- /dev/null
+++ b/technic/technic/textures/technic_water_mill_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_water_mill_top_active.png b/technic/technic/textures/technic_water_mill_top_active.png
new file mode 100644
index 0000000..f02bec6
--- /dev/null
+++ b/technic/technic/textures/technic_water_mill_top_active.png
Binary files differ
diff --git a/technic/technic/textures/technic_workshop_bottom.png b/technic/technic/textures/technic_workshop_bottom.png
new file mode 100644
index 0000000..bd8fd55
--- /dev/null
+++ b/technic/technic/textures/technic_workshop_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technic_workshop_side.png b/technic/technic/textures/technic_workshop_side.png
new file mode 100644
index 0000000..9e3e7a7
--- /dev/null
+++ b/technic/technic/textures/technic_workshop_side.png
Binary files differ
diff --git a/technic/technic/textures/technic_workshop_top.png b/technic/technic/textures/technic_workshop_top.png
new file mode 100644
index 0000000..feae141
--- /dev/null
+++ b/technic/technic/textures/technic_workshop_top.png
Binary files differ
diff --git a/technic/technic/textures/technic_wrought_iron_dust.png b/technic/technic/textures/technic_wrought_iron_dust.png
new file mode 100644
index 0000000..ad23c62
--- /dev/null
+++ b/technic/technic/textures/technic_wrought_iron_dust.png
Binary files differ
diff --git a/technic/technic/textures/technic_zinc_dust.png b/technic/technic/textures/technic_zinc_dust.png
new file mode 100644
index 0000000..bbd826c
--- /dev/null
+++ b/technic/technic/textures/technic_zinc_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_akalin_dust.png b/technic/technic/textures/technicx32/technic_akalin_dust.png
new file mode 100644
index 0000000..90f3bac
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_akalin_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_alatro_dust.png b/technic/technic/textures/technicx32/technic_alatro_dust.png
new file mode 100644
index 0000000..1199614
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_alatro_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_alloy_furnace_front.png b/technic/technic/textures/technicx32/technic_alloy_furnace_front.png
new file mode 100644
index 0000000..9123fb6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_alloy_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_alloy_furnace_front_active.png b/technic/technic/textures/technicx32/technic_alloy_furnace_front_active.png
new file mode 100644
index 0000000..4dda2e6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_alloy_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_alloy_furnace_side.png b/technic/technic/textures/technicx32/technic_alloy_furnace_side.png
new file mode 100644
index 0000000..b5bd428
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_alloy_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_alloy_furnace_top.png b/technic/technic/textures/technicx32/technic_alloy_furnace_top.png
new file mode 100644
index 0000000..67ef4b7
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_alloy_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_arol_dust.png b/technic/technic/textures/technicx32/technic_arol_dust.png
new file mode 100644
index 0000000..f5a392f
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_arol_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_battery.png b/technic/technic/textures/technicx32/technic_battery.png
new file mode 100644
index 0000000..ee83b74
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_battery.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_battery_box_bottom.png b/technic/technic/textures/technicx32/technic_battery_box_bottom.png
new file mode 100644
index 0000000..03c7ccc
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_battery_box_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_battery_box_side0.png b/technic/technic/textures/technicx32/technic_battery_box_side0.png
new file mode 100644
index 0000000..2662ac0
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_battery_box_side0.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_battery_box_top.png b/technic/technic/textures/technicx32/technic_battery_box_top.png
new file mode 100644
index 0000000..4953a32
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_battery_box_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_battery_reload.png b/technic/technic/textures/technicx32/technic_battery_reload.png
new file mode 100644
index 0000000..164b4ac
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_battery_reload.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_brass_dust.png b/technic/technic/textures/technicx32/technic_brass_dust.png
new file mode 100644
index 0000000..f86167a
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_brass_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_bronze_dust.png b/technic/technic/textures/technicx32/technic_bronze_dust.png
new file mode 100644
index 0000000..0a2401e
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_bronze_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_carbon_steel_dust.png b/technic/technic/textures/technicx32/technic_carbon_steel_dust.png
new file mode 100644
index 0000000..0bf350f
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_carbon_steel_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_cast_iron_dust.png b/technic/technic/textures/technicx32/technic_cast_iron_dust.png
new file mode 100644
index 0000000..f355094
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_cast_iron_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_chainsaw.png b/technic/technic/textures/technicx32/technic_chainsaw.png
new file mode 100644
index 0000000..b7ceee6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_chainsaw.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_chromium_dust.png b/technic/technic/textures/technicx32/technic_chromium_dust.png
new file mode 100644
index 0000000..a33358b
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_chromium_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png
new file mode 100644
index 0000000..7a5eed7
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front.png
new file mode 100644
index 0000000..b00bef3
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png
new file mode 100644
index 0000000..b41f619
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_side.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_side.png
new file mode 100644
index 0000000..3db8daa
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_coal_alloy_furnace_top.png b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_top.png
new file mode 100644
index 0000000..c648fe8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_coal_alloy_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_coal_dust.png b/technic/technic/textures/technicx32/technic_coal_dust.png
new file mode 100644
index 0000000..0fe7db7
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_coal_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_back.png b/technic/technic/textures/technicx32/technic_constructor_back.png
new file mode 100644
index 0000000..6baf788
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_back.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_front_off.png b/technic/technic/textures/technicx32/technic_constructor_front_off.png
new file mode 100644
index 0000000..f878e55
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_front_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_front_on.png b/technic/technic/textures/technicx32/technic_constructor_front_on.png
new file mode 100644
index 0000000..89189d6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_front_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png b/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png
new file mode 100644
index 0000000..205dcc4
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png b/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png
new file mode 100644
index 0000000..9896c52
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_side1_off.png b/technic/technic/textures/technicx32/technic_constructor_mk1_side1_off.png
new file mode 100644
index 0000000..e8a01ff
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk1_side1_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_side1_on.png b/technic/technic/textures/technicx32/technic_constructor_mk1_side1_on.png
new file mode 100644
index 0000000..c897942
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk1_side1_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_side2_off.png b/technic/technic/textures/technicx32/technic_constructor_mk1_side2_off.png
new file mode 100644
index 0000000..8da65f6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk1_side2_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_side2_on.png b/technic/technic/textures/technicx32/technic_constructor_mk1_side2_on.png
new file mode 100644
index 0000000..da8ed34
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk1_side2_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_top_off.png b/technic/technic/textures/technicx32/technic_constructor_mk1_top_off.png
new file mode 100644
index 0000000..7d8c7e0
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk1_top_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk1_top_on.png b/technic/technic/textures/technicx32/technic_constructor_mk1_top_on.png
new file mode 100644
index 0000000..439caf5
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk1_top_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png b/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png
new file mode 100644
index 0000000..83c5b07
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png b/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png
new file mode 100644
index 0000000..9ad76f4
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_side1_off.png b/technic/technic/textures/technicx32/technic_constructor_mk2_side1_off.png
new file mode 100644
index 0000000..584dfe3
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk2_side1_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_side1_on.png b/technic/technic/textures/technicx32/technic_constructor_mk2_side1_on.png
new file mode 100644
index 0000000..fe02042
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk2_side1_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_side2_off.png b/technic/technic/textures/technicx32/technic_constructor_mk2_side2_off.png
new file mode 100644
index 0000000..fd9ad74
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk2_side2_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_side2_on.png b/technic/technic/textures/technicx32/technic_constructor_mk2_side2_on.png
new file mode 100644
index 0000000..f51411a
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk2_side2_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_top_off.png b/technic/technic/textures/technicx32/technic_constructor_mk2_top_off.png
new file mode 100644
index 0000000..e3e3292
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk2_top_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk2_top_on.png b/technic/technic/textures/technicx32/technic_constructor_mk2_top_on.png
new file mode 100644
index 0000000..83043d4
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk2_top_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png b/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png
new file mode 100644
index 0000000..5f46154
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png b/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png
new file mode 100644
index 0000000..f76f29b
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_side1_off.png b/technic/technic/textures/technicx32/technic_constructor_mk3_side1_off.png
new file mode 100644
index 0000000..0ea1fc0
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk3_side1_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_side1_on.png b/technic/technic/textures/technicx32/technic_constructor_mk3_side1_on.png
new file mode 100644
index 0000000..ba86332
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk3_side1_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_side2_off.png b/technic/technic/textures/technicx32/technic_constructor_mk3_side2_off.png
new file mode 100644
index 0000000..8e8dce4
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk3_side2_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_side2_on.png b/technic/technic/textures/technicx32/technic_constructor_mk3_side2_on.png
new file mode 100644
index 0000000..12dff69
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk3_side2_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_top_off.png b/technic/technic/textures/technicx32/technic_constructor_mk3_top_off.png
new file mode 100644
index 0000000..705f255
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk3_top_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_constructor_mk3_top_on.png b/technic/technic/textures/technicx32/technic_constructor_mk3_top_on.png
new file mode 100644
index 0000000..cef077e
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_constructor_mk3_top_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_control_logic_unit.png b/technic/technic/textures/technicx32/technic_control_logic_unit.png
new file mode 100644
index 0000000..6ed00eb
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_control_logic_unit.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_copper_coil.png b/technic/technic/textures/technicx32/technic_copper_coil.png
new file mode 100644
index 0000000..db6db1a
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_copper_coil.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_copper_dust.png b/technic/technic/textures/technicx32/technic_copper_dust.png
new file mode 100644
index 0000000..68678ed
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_copper_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_deployer_back.png b/technic/technic/textures/technicx32/technic_deployer_back.png
new file mode 100644
index 0000000..0bc8df9
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_deployer_back.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_deployer_bottom.png b/technic/technic/textures/technicx32/technic_deployer_bottom.png
new file mode 100644
index 0000000..ff1a2c6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_deployer_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_deployer_front_off.png b/technic/technic/textures/technicx32/technic_deployer_front_off.png
new file mode 100644
index 0000000..d0f6f55
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_deployer_front_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_deployer_front_on.png b/technic/technic/textures/technicx32/technic_deployer_front_on.png
new file mode 100644
index 0000000..368ce32
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_deployer_front_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_deployer_side.png b/technic/technic/textures/technicx32/technic_deployer_side.png
new file mode 100644
index 0000000..aefd7c8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_deployer_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_deployer_side1.png b/technic/technic/textures/technicx32/technic_deployer_side1.png
new file mode 100644
index 0000000..8cb8634
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_deployer_side1.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_deployer_side2.png b/technic/technic/textures/technicx32/technic_deployer_side2.png
new file mode 100644
index 0000000..c2855d0
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_deployer_side2.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_deployer_top.png b/technic/technic/textures/technicx32/technic_deployer_top.png
new file mode 100644
index 0000000..941d333
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_deployer_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_diamond_block_blue.png b/technic/technic/textures/technicx32/technic_diamond_block_blue.png
new file mode 100644
index 0000000..d89bd6e
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_diamond_block_blue.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_diamond_block_green.png b/technic/technic/textures/technicx32/technic_diamond_block_green.png
new file mode 100644
index 0000000..996b254
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_diamond_block_green.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_diamond_block_red.png b/technic/technic/textures/technicx32/technic_diamond_block_red.png
new file mode 100644
index 0000000..52fd893
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_diamond_block_red.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_diamond_drill_head.png b/technic/technic/textures/technicx32/technic_diamond_drill_head.png
new file mode 100644
index 0000000..e3d31e8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_diamond_drill_head.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_doped_silicon_wafer.png b/technic/technic/textures/technicx32/technic_doped_silicon_wafer.png
new file mode 100644
index 0000000..6ff06a6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_doped_silicon_wafer.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_bottom.png b/technic/technic/textures/technicx32/technic_electric_furnace_bottom.png
new file mode 100644
index 0000000..d16ac47
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_electric_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_front.png b/technic/technic/textures/technicx32/technic_electric_furnace_front.png
new file mode 100644
index 0000000..dfee663
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_electric_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_front_active.png b/technic/technic/textures/technicx32/technic_electric_furnace_front_active.png
new file mode 100644
index 0000000..038eec4
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_electric_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_side.png b/technic/technic/textures/technicx32/technic_electric_furnace_side.png
new file mode 100644
index 0000000..cf345e7
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_electric_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_electric_furnace_top.png b/technic/technic/textures/technicx32/technic_electric_furnace_top.png
new file mode 100644
index 0000000..d3309ec
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_electric_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_fine_copper_wire.png b/technic/technic/textures/technicx32/technic_fine_copper_wire.png
new file mode 100644
index 0000000..36e2ed6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_fine_copper_wire.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_fine_gold_wire.png b/technic/technic/textures/technicx32/technic_fine_gold_wire.png
new file mode 100644
index 0000000..be2a38a
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_fine_gold_wire.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_fine_silver_wire.png b/technic/technic/textures/technicx32/technic_fine_silver_wire.png
new file mode 100644
index 0000000..d43cb6a
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_fine_silver_wire.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_flashlight.png b/technic/technic/textures/technicx32/technic_flashlight.png
new file mode 100644
index 0000000..01afdbb
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_flashlight.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_generator_front.png b/technic/technic/textures/technicx32/technic_generator_front.png
new file mode 100644
index 0000000..2d64844
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_generator_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_generator_front_active.png b/technic/technic/textures/technicx32/technic_generator_front_active.png
new file mode 100644
index 0000000..4e57ca0
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_generator_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_generator_side.png b/technic/technic/textures/technicx32/technic_generator_side.png
new file mode 100644
index 0000000..5cbcbef
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_generator_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_generator_top.png b/technic/technic/textures/technicx32/technic_generator_top.png
new file mode 100644
index 0000000..e2f3db3
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_generator_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_geothermal_side.png b/technic/technic/textures/technicx32/technic_geothermal_side.png
new file mode 100644
index 0000000..90fb430
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_geothermal_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_geothermal_top.png b/technic/technic/textures/technicx32/technic_geothermal_top.png
new file mode 100644
index 0000000..601ff15
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_geothermal_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_geothermal_top_active.png b/technic/technic/textures/technicx32/technic_geothermal_top_active.png
new file mode 100644
index 0000000..f02bec6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_geothermal_top_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_gold_dust.png b/technic/technic/textures/technicx32/technic_gold_dust.png
new file mode 100644
index 0000000..e545bb6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_gold_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_grinder_front.png b/technic/technic/textures/technicx32/technic_grinder_front.png
new file mode 100644
index 0000000..a28dbc1
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_grinder_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_grinder_side.png b/technic/technic/textures/technicx32/technic_grinder_side.png
new file mode 100644
index 0000000..af562f2
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_grinder_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_grinder_top.png b/technic/technic/textures/technicx32/technic_grinder_top.png
new file mode 100644
index 0000000..b074e13
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_grinder_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_bottom.png b/technic/technic/textures/technicx32/technic_hv_grinder_bottom.png
new file mode 100644
index 0000000..d854193
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_grinder_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_front.png b/technic/technic/textures/technicx32/technic_hv_grinder_front.png
new file mode 100644
index 0000000..f20cb22
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_grinder_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_front_active.png b/technic/technic/textures/technicx32/technic_hv_grinder_front_active.png
new file mode 100644
index 0000000..d1fa468
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_grinder_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_side.png b/technic/technic/textures/technicx32/technic_hv_grinder_side.png
new file mode 100644
index 0000000..35cf031
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_grinder_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_side_tube.png b/technic/technic/textures/technicx32/technic_hv_grinder_side_tube.png
new file mode 100644
index 0000000..5b5b450
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_grinder_side_tube.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_grinder_top.png b/technic/technic/textures/technicx32/technic_hv_grinder_top.png
new file mode 100644
index 0000000..7869ea8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_grinder_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png b/technic/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png
new file mode 100644
index 0000000..3d380da
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_solar_array_bottom.png b/technic/technic/textures/technicx32/technic_hv_solar_array_bottom.png
new file mode 100644
index 0000000..94c8222
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_solar_array_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_solar_array_side.png b/technic/technic/textures/technicx32/technic_hv_solar_array_side.png
new file mode 100644
index 0000000..d39d3d8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_solar_array_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_solar_array_top.png b/technic/technic/textures/technicx32/technic_hv_solar_array_top.png
new file mode 100644
index 0000000..3e1b9e0
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_solar_array_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_hv_transformer.png b/technic/technic/textures/technicx32/technic_hv_transformer.png
new file mode 100644
index 0000000..7794644
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_hv_transformer.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_injector_bottom.png b/technic/technic/textures/technicx32/technic_injector_bottom.png
new file mode 100644
index 0000000..39916bd
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_injector_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_injector_side.png b/technic/technic/textures/technicx32/technic_injector_side.png
new file mode 100644
index 0000000..a5419a1
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_injector_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_injector_top.png b/technic/technic/textures/technicx32/technic_injector_top.png
new file mode 100644
index 0000000..440649c
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_injector_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_kalite_dust.png b/technic/technic/textures/technicx32/technic_kalite_dust.png
new file mode 100644
index 0000000..595edb5
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_kalite_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_laser_beam.png b/technic/technic/textures/technicx32/technic_laser_beam.png
new file mode 100644
index 0000000..4814a9b
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_laser_beam.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lava_can.png b/technic/technic/textures/technicx32/technic_lava_can.png
new file mode 100644
index 0000000..80d15a6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lava_can.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_light.png b/technic/technic/textures/technicx32/technic_light.png
new file mode 100644
index 0000000..334cb07
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_light.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_bottom.png b/technic/technic/textures/technicx32/technic_lv_grinder_bottom.png
new file mode 100644
index 0000000..816b969
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_grinder_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_front.png b/technic/technic/textures/technicx32/technic_lv_grinder_front.png
new file mode 100644
index 0000000..7451ca9
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_grinder_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_front_active.png b/technic/technic/textures/technicx32/technic_lv_grinder_front_active.png
new file mode 100644
index 0000000..8e17e4d
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_grinder_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_side.png b/technic/technic/textures/technicx32/technic_lv_grinder_side.png
new file mode 100644
index 0000000..908287b
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_grinder_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_grinder_top.png b/technic/technic/textures/technicx32/technic_lv_grinder_top.png
new file mode 100644
index 0000000..8520baf
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_grinder_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_solar_array_bottom.png b/technic/technic/textures/technicx32/technic_lv_solar_array_bottom.png
new file mode 100644
index 0000000..94c8222
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_solar_array_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_solar_array_side.png b/technic/technic/textures/technicx32/technic_lv_solar_array_side.png
new file mode 100644
index 0000000..d39d3d8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_solar_array_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_solar_array_top.png b/technic/technic/textures/technicx32/technic_lv_solar_array_top.png
new file mode 100644
index 0000000..3d8c7ab
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_solar_array_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_lv_transformer.png b/technic/technic/textures/technicx32/technic_lv_transformer.png
new file mode 100644
index 0000000..99ac927
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_lv_transformer.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_machine_bottom.png b/technic/technic/textures/technicx32/technic_machine_bottom.png
new file mode 100644
index 0000000..943dae1
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_machine_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mining_drill.png b/technic/technic/textures/technicx32/technic_mining_drill.png
new file mode 100644
index 0000000..171888d
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mining_drill.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mining_laser_mk1.png b/technic/technic/textures/technicx32/technic_mining_laser_mk1.png
new file mode 100644
index 0000000..acde392
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mining_laser_mk1.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mithril_dust.png b/technic/technic/textures/technicx32/technic_mithril_dust.png
new file mode 100644
index 0000000..988e449
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mithril_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_motor.png b/technic/technic/textures/technicx32/technic_motor.png
new file mode 100644
index 0000000..77d4b91
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_motor.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_music_player_bottom.png b/technic/technic/textures/technicx32/technic_music_player_bottom.png
new file mode 100644
index 0000000..bd8fd55
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_music_player_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_music_player_side.png b/technic/technic/textures/technicx32/technic_music_player_side.png
new file mode 100644
index 0000000..6c34fea
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_music_player_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_music_player_top.png b/technic/technic/textures/technicx32/technic_music_player_top.png
new file mode 100644
index 0000000..0d34563
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_music_player_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png
new file mode 100644
index 0000000..3723bb1
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front.png
new file mode 100644
index 0000000..a5dac82
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png
new file mode 100644
index 0000000..f6e69a9
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side.png
new file mode 100644
index 0000000..0430479
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png
new file mode 100644
index 0000000..69f89e7
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_alloy_furnace_top.png b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_top.png
new file mode 100644
index 0000000..f44e3c0
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_alloy_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_battery_box_bottom.png b/technic/technic/textures/technicx32/technic_mv_battery_box_bottom.png
new file mode 100644
index 0000000..2a9b292
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_battery_box_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_battery_box_side0.png b/technic/technic/textures/technicx32/technic_mv_battery_box_side0.png
new file mode 100644
index 0000000..39d8986
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_battery_box_side0.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_battery_box_top.png b/technic/technic/textures/technicx32/technic_mv_battery_box_top.png
new file mode 100644
index 0000000..f7f1ea9
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_battery_box_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_cable_wield.png b/technic/technic/textures/technicx32/technic_mv_cable_wield.png
new file mode 100644
index 0000000..aca9fd4
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_cable_wield.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png
new file mode 100644
index 0000000..d16ac47
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_front.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_front.png
new file mode 100644
index 0000000..4dfac63
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png
new file mode 100644
index 0000000..e206cd2
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_side.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_side.png
new file mode 100644
index 0000000..4aa27b7
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png
new file mode 100644
index 0000000..bfeba18
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_electric_furnace_top.png b/technic/technic/textures/technicx32/technic_mv_electric_furnace_top.png
new file mode 100644
index 0000000..635b6b7
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_electric_furnace_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_bottom.png b/technic/technic/textures/technicx32/technic_mv_grinder_bottom.png
new file mode 100644
index 0000000..f46cd72
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_grinder_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_front.png b/technic/technic/textures/technicx32/technic_mv_grinder_front.png
new file mode 100644
index 0000000..6445dfe
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_grinder_front.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_front_active.png b/technic/technic/textures/technicx32/technic_mv_grinder_front_active.png
new file mode 100644
index 0000000..428e1dc
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_grinder_front_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_side.png b/technic/technic/textures/technicx32/technic_mv_grinder_side.png
new file mode 100644
index 0000000..c014f08
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_grinder_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_side_tube.png b/technic/technic/textures/technicx32/technic_mv_grinder_side_tube.png
new file mode 100644
index 0000000..69050e4
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_grinder_side_tube.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_grinder_top.png b/technic/technic/textures/technicx32/technic_mv_grinder_top.png
new file mode 100644
index 0000000..e0320ef
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_grinder_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_solar_array_bottom.png b/technic/technic/textures/technicx32/technic_mv_solar_array_bottom.png
new file mode 100644
index 0000000..94c8222
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_solar_array_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_solar_array_side.png b/technic/technic/textures/technicx32/technic_mv_solar_array_side.png
new file mode 100644
index 0000000..d39d3d8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_solar_array_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_solar_array_top.png b/technic/technic/textures/technicx32/technic_mv_solar_array_top.png
new file mode 100644
index 0000000..e4999d5
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_solar_array_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_mv_transformer.png b/technic/technic/textures/technicx32/technic_mv_transformer.png
new file mode 100644
index 0000000..7c4688e
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_mv_transformer.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_back.png b/technic/technic/textures/technicx32/technic_nodebreaker_back.png
new file mode 100644
index 0000000..43ba821
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_back.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_bottom.png b/technic/technic/textures/technicx32/technic_nodebreaker_bottom.png
new file mode 100644
index 0000000..99ff685
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_bottom_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_bottom_off.png
new file mode 100644
index 0000000..47cd4e8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_bottom_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_bottom_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_bottom_on.png
new file mode 100644
index 0000000..994f787
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_bottom_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_front_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_front_off.png
new file mode 100644
index 0000000..5ece916
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_front_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_front_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_front_on.png
new file mode 100644
index 0000000..a53de2a
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_front_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side.png b/technic/technic/textures/technicx32/technic_nodebreaker_side.png
new file mode 100644
index 0000000..c2b401b
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side1.png b/technic/technic/textures/technicx32/technic_nodebreaker_side1.png
new file mode 100644
index 0000000..07e74aa
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_side1.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side1_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_side1_off.png
new file mode 100644
index 0000000..b63f3bb
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_side1_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side1_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_side1_on.png
new file mode 100644
index 0000000..b455f06
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_side1_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side2.png b/technic/technic/textures/technicx32/technic_nodebreaker_side2.png
new file mode 100644
index 0000000..7f4a0bf
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_side2.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side2_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_side2_off.png
new file mode 100644
index 0000000..7b60902
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_side2_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_side2_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_side2_on.png
new file mode 100644
index 0000000..12985f6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_side2_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_top.png b/technic/technic/textures/technicx32/technic_nodebreaker_top.png
new file mode 100644
index 0000000..0994c6d
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_top_off.png b/technic/technic/textures/technicx32/technic_nodebreaker_top_off.png
new file mode 100644
index 0000000..f08fc1b
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_top_off.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_nodebreaker_top_on.png b/technic/technic/textures/technicx32/technic_nodebreaker_top_on.png
new file mode 100644
index 0000000..ec28210
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_nodebreaker_top_on.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter.png b/technic/technic/textures/technicx32/technic_power_meter.png
new file mode 100644
index 0000000..f1e5120
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter1.png b/technic/technic/textures/technicx32/technic_power_meter1.png
new file mode 100644
index 0000000..0542c7b
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter1.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter2.png b/technic/technic/textures/technicx32/technic_power_meter2.png
new file mode 100644
index 0000000..bf5703c
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter2.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter3.png b/technic/technic/textures/technicx32/technic_power_meter3.png
new file mode 100644
index 0000000..4204815
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter3.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter4.png b/technic/technic/textures/technicx32/technic_power_meter4.png
new file mode 100644
index 0000000..82a0148
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter4.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter5.png b/technic/technic/textures/technicx32/technic_power_meter5.png
new file mode 100644
index 0000000..af783ca
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter5.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter6.png b/technic/technic/textures/technicx32/technic_power_meter6.png
new file mode 100644
index 0000000..44feff4
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter6.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter7.png b/technic/technic/textures/technicx32/technic_power_meter7.png
new file mode 100644
index 0000000..554baa2
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter7.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter8.png b/technic/technic/textures/technicx32/technic_power_meter8.png
new file mode 100644
index 0000000..8c4f4a8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter8.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter_bg.png b/technic/technic/textures/technicx32/technic_power_meter_bg.png
new file mode 100644
index 0000000..9667cda
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter_bg.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_power_meter_fg.png b/technic/technic/textures/technicx32/technic_power_meter_fg.png
new file mode 100644
index 0000000..7f2dde8
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_power_meter_fg.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_raw_latex.png b/technic/technic/textures/technicx32/technic_raw_latex.png
new file mode 100644
index 0000000..7fbbe64
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_raw_latex.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_rubber.png b/technic/technic/textures/technicx32/technic_rubber.png
new file mode 100644
index 0000000..9ed4a9d
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_rubber.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_rubber_sapling.png b/technic/technic/textures/technicx32/technic_rubber_sapling.png
new file mode 100644
index 0000000..e5c9f5d
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_rubber_sapling.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_rubber_tree_empty.png b/technic/technic/textures/technicx32/technic_rubber_tree_empty.png
new file mode 100644
index 0000000..1792951
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_rubber_tree_empty.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_rubber_tree_full.png b/technic/technic/textures/technicx32/technic_rubber_tree_full.png
new file mode 100644
index 0000000..08067ef
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_rubber_tree_full.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_screwdriver.png b/technic/technic/textures/technicx32/technic_screwdriver.png
new file mode 100644
index 0000000..bd2da22
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_screwdriver.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_silicon_wafer.png b/technic/technic/textures/technicx32/technic_silicon_wafer.png
new file mode 100644
index 0000000..78aef20
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_silicon_wafer.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_silver_dust.png b/technic/technic/textures/technicx32/technic_silver_dust.png
new file mode 100644
index 0000000..9092c90
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_silver_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_solar_panel_bottom.png b/technic/technic/textures/technicx32/technic_solar_panel_bottom.png
new file mode 100644
index 0000000..b0ad82f
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_solar_panel_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_solar_panel_side.png b/technic/technic/textures/technicx32/technic_solar_panel_side.png
new file mode 100644
index 0000000..b22447e
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_solar_panel_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_solar_panel_top.png b/technic/technic/textures/technicx32/technic_solar_panel_top.png
new file mode 100644
index 0000000..492764b
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_solar_panel_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_sonic_screwdriver.png b/technic/technic/textures/technicx32/technic_sonic_screwdriver.png
new file mode 100644
index 0000000..fb61d96
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_sonic_screwdriver.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_stainless_steel_dust.png b/technic/technic/textures/technicx32/technic_stainless_steel_dust.png
new file mode 100644
index 0000000..450e2bb
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_stainless_steel_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_talinite_dust.png b/technic/technic/textures/technicx32/technic_talinite_dust.png
new file mode 100644
index 0000000..39f9330
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_talinite_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_tin_dust.png b/technic/technic/textures/technicx32/technic_tin_dust.png
new file mode 100644
index 0000000..4e94e00
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_tin_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_tree_tap.png b/technic/technic/textures/technicx32/technic_tree_tap.png
new file mode 100644
index 0000000..542f30f
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_tree_tap.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_uranium_dust.png b/technic/technic/textures/technicx32/technic_uranium_dust.png
new file mode 100644
index 0000000..d8095c3
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_uranium_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_water_can.png b/technic/technic/textures/technicx32/technic_water_can.png
new file mode 100644
index 0000000..18e0225
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_water_can.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_water_mill_side.png b/technic/technic/textures/technicx32/technic_water_mill_side.png
new file mode 100644
index 0000000..f4bdb16
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_water_mill_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_water_mill_top.png b/technic/technic/textures/technicx32/technic_water_mill_top.png
new file mode 100644
index 0000000..601ff15
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_water_mill_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_water_mill_top_active.png b/technic/technic/textures/technicx32/technic_water_mill_top_active.png
new file mode 100644
index 0000000..f02bec6
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_water_mill_top_active.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_workshop_bottom.png b/technic/technic/textures/technicx32/technic_workshop_bottom.png
new file mode 100644
index 0000000..bd8fd55
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_workshop_bottom.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_workshop_side.png b/technic/technic/textures/technicx32/technic_workshop_side.png
new file mode 100644
index 0000000..9e3e7a7
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_workshop_side.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_workshop_top.png b/technic/technic/textures/technicx32/technic_workshop_top.png
new file mode 100644
index 0000000..feae141
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_workshop_top.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_wrought_iron_dust.png b/technic/technic/textures/technicx32/technic_wrought_iron_dust.png
new file mode 100644
index 0000000..d890e73
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_wrought_iron_dust.png
Binary files differ
diff --git a/technic/technic/textures/technicx32/technic_zinc_dust.png b/technic/technic/textures/technicx32/technic_zinc_dust.png
new file mode 100644
index 0000000..0d2f75a
--- /dev/null
+++ b/technic/technic/textures/technicx32/technic_zinc_dust.png
Binary files differ
diff --git a/technic/technic/tools/cans.lua b/technic/technic/tools/cans.lua
new file mode 100644
index 0000000..f12ec93
--- /dev/null
+++ b/technic/technic/tools/cans.lua
@@ -0,0 +1,114 @@
+local S = technic.getter
+
+local function set_can_wear(itemstack, level, max_level)
+ local temp
+ if level == 0 then
+ temp = 0
+ else
+ temp = 65536 - math.floor(level / max_level * 65535)
+ if temp > 65535 then temp = 65535 end
+ if temp < 1 then temp = 1 end
+ end
+ itemstack:set_wear(temp)
+end
+
+local function get_can_level(itemstack)
+ if itemstack:get_metadata() == "" then
+ return 0
+ else
+ return tonumber(itemstack:get_metadata())
+ end
+end
+
+function technic.register_can(d)
+ local data = {}
+ for k, v in pairs(d) do data[k] = v end
+ minetest.register_tool(data.can_name, {
+ description = data.can_description,
+ inventory_image = data.can_inventory_image,
+ stack_max = 1,
+ wear_represents = "content_level",
+ liquids_pointable = true,
+ on_use = function(itemstack, user, pointed_thing)
+ if pointed_thing.type ~= "node" then return end
+ local node = minetest.get_node(pointed_thing.under)
+ if node.name ~= data.liquid_source_name then return end
+ local charge = get_can_level(itemstack)
+ if charge == data.can_capacity then return end
+ if minetest.is_protected(pointed_thing.under, user:get_player_name()) then
+ minetest.log("action", user:get_player_name().." tried to take "..node.name.." at protected position "..minetest.pos_to_string(pointed_thing.under).." with a "..data.can_name)
+ return
+ end
+ minetest.remove_node(pointed_thing.under)
+ charge = charge + 1
+ itemstack:set_metadata(tostring(charge))
+ set_can_wear(itemstack, charge, data.can_capacity)
+ return itemstack
+ end,
+ on_place = function(itemstack, user, pointed_thing)
+ if pointed_thing.type ~= "node" then return end
+ local pos = pointed_thing.under
+ local def = minetest.registered_nodes[minetest.get_node(pos).name] or {}
+ if def.on_rightclick and user and not user:get_player_control().sneak then
+ return def.on_rightclick(pos, minetest.get_node(pos), user, itemstack, pointed_thing)
+ end
+ if not def.buildable_to then
+ pos = pointed_thing.above
+ def = minetest.registered_nodes[minetest.get_node(pos).name] or {}
+ if not def.buildable_to then return end
+ end
+ local charge = get_can_level(itemstack)
+ if charge == 0 then return end
+ if minetest.is_protected(pos, user:get_player_name()) then
+ minetest.log("action", user:get_player_name().." tried to place "..data.liquid_source_name.." at protected position "..minetest.pos_to_string(pos).." with a "..data.can_name)
+ return
+ end
+ minetest.set_node(pos, {name=data.liquid_source_name})
+ charge = charge - 1
+ itemstack:set_metadata(tostring(charge))
+ set_can_wear(itemstack, charge, data.can_capacity)
+ return itemstack
+ end,
+ on_refill = function(stack)
+ stack:set_metadata(tostring(data.can_capacity))
+ set_can_wear(stack, data.can_capacity, data.can_capacity)
+ return stack
+ end,
+ })
+end
+
+technic.register_can({
+ can_name = "technic:water_can",
+ can_description = S("Water Can"),
+ can_inventory_image = "technic_water_can.png",
+ can_capacity = 16,
+ liquid_source_name = "default:water_source",
+ liquid_flowing_name = "default:water_flowing",
+})
+
+minetest.register_craft({
+ output = 'technic:water_can 1',
+ recipe = {
+ {'technic:zinc_ingot', 'technic:rubber','technic:zinc_ingot'},
+ {'technic:carbon_steel_ingot', '', 'technic:carbon_steel_ingot'},
+ {'technic:zinc_ingot', 'technic:carbon_steel_ingot', 'technic:zinc_ingot'},
+ }
+})
+
+technic.register_can({
+ can_name = "technic:lava_can",
+ can_description = S("Lava Can"),
+ can_inventory_image = "technic_lava_can.png",
+ can_capacity = 8,
+ liquid_source_name = "default:lava_source",
+ liquid_flowing_name = "default:lava_flowing",
+})
+
+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'},
+ }
+})
diff --git a/technic/technic/tools/chainsaw.lua b/technic/technic/tools/chainsaw.lua
new file mode 100644
index 0000000..bf4efff
--- /dev/null
+++ b/technic/technic/tools/chainsaw.lua
@@ -0,0 +1,366 @@
+-- Configuration
+
+local chainsaw_max_charge = 30000 -- Maximum charge of the saw
+-- Gives 2500 nodes on a single charge (about 50 complete normal trees)
+local chainsaw_charge_per_node = 12
+-- Cut down tree leaves. Leaf decay may cause slowness on large trees
+-- if this is disabled.
+local chainsaw_leaves = true
+
+-- The default trees
+local timber_nodenames = {
+ ["default:jungletree"] = true,
+ ["default:papyrus"] = true,
+ ["default:cactus"] = true,
+ ["default:tree"] = true,
+ ["default:apple"] = true,
+ ["default:pinetree"] = true,
+}
+
+if chainsaw_leaves then
+ timber_nodenames["default:leaves"] = true
+ timber_nodenames["default:jungleleaves"] = true
+ timber_nodenames["default:pine_needles"] = true
+end
+
+-- technic_worldgen defines rubber trees if moretrees isn't installed
+if minetest.get_modpath("technic_worldgen") or
+ minetest.get_modpath("moretrees") then
+ timber_nodenames["moretrees:rubber_tree_trunk_empty"] = true
+ timber_nodenames["moretrees:rubber_tree_trunk"] = true
+ if chainsaw_leaves then
+ timber_nodenames["moretrees:rubber_tree_leaves"] = true
+ end
+end
+
+-- Support moretrees if it is there
+if minetest.get_modpath("moretrees") then
+ timber_nodenames["moretrees:acacia_trunk"] = true
+ timber_nodenames["moretrees:apple_tree_trunk"] = true
+ timber_nodenames["moretrees:beech_trunk"] = true
+ timber_nodenames["moretrees:birch_trunk"] = true
+ timber_nodenames["moretrees:fir_trunk"] = true
+ timber_nodenames["moretrees:oak_trunk"] = true
+ timber_nodenames["moretrees:palm_trunk"] = true
+ timber_nodenames["moretrees:pine_trunk"] = true
+ timber_nodenames["moretrees:sequoia_trunk"] = true
+ timber_nodenames["moretrees:spruce_trunk"] = true
+ timber_nodenames["moretrees:willow_trunk"] = true
+ timber_nodenames["moretrees:jungletree_trunk"] = true
+
+ if chainsaw_leaves then
+ timber_nodenames["moretrees:acacia_leaves"] = true
+ timber_nodenames["moretrees:apple_tree_leaves"] = true
+ timber_nodenames["moretrees:oak_leaves"] = true
+ timber_nodenames["moretrees:fir_leaves"] = true
+ timber_nodenames["moretrees:fir_leaves_bright"] = true
+ timber_nodenames["moretrees:sequoia_leaves"] = true
+ timber_nodenames["moretrees:birch_leaves"] = true
+ timber_nodenames["moretrees:birch_leaves"] = true
+ timber_nodenames["moretrees:palm_leaves"] = true
+ timber_nodenames["moretrees:spruce_leaves"] = true
+ timber_nodenames["moretrees:spruce_leaves"] = true
+ timber_nodenames["moretrees:pine_leaves"] = true
+ timber_nodenames["moretrees:willow_leaves"] = true
+ timber_nodenames["moretrees:jungletree_leaves_green"] = true
+ timber_nodenames["moretrees:jungletree_leaves_yellow"] = true
+ timber_nodenames["moretrees:jungletree_leaves_red"] = true
+ timber_nodenames["moretrees:acorn"] = true
+ timber_nodenames["moretrees:coconut"] = true
+ timber_nodenames["moretrees:spruce_cone"] = true
+ timber_nodenames["moretrees:pine_cone"] = true
+ timber_nodenames["moretrees:fir_cone"] = true
+ timber_nodenames["moretrees:apple_blossoms"] = true
+ end
+end
+
+-- Support growing_trees
+if minetest.get_modpath("growing_trees") then
+ timber_nodenames["growing_trees:trunk"] = true
+ timber_nodenames["growing_trees:medium_trunk"] = true
+ timber_nodenames["growing_trees:big_trunk"] = true
+ timber_nodenames["growing_trees:trunk_top"] = true
+ timber_nodenames["growing_trees:trunk_sprout"] = true
+ timber_nodenames["growing_trees:branch_sprout"] = true
+ timber_nodenames["growing_trees:branch"] = true
+ timber_nodenames["growing_trees:branch_xmzm"] = true
+ timber_nodenames["growing_trees:branch_xpzm"] = true
+ timber_nodenames["growing_trees:branch_xmzp"] = true
+ timber_nodenames["growing_trees:branch_xpzp"] = true
+ timber_nodenames["growing_trees:branch_zz"] = true
+ timber_nodenames["growing_trees:branch_xx"] = true
+
+ if chainsaw_leaves then
+ timber_nodenames["growing_trees:leaves"] = true
+ end
+end
+
+-- Support growing_cactus
+if minetest.get_modpath("growing_cactus") then
+ timber_nodenames["growing_cactus:sprout"] = true
+ timber_nodenames["growing_cactus:branch_sprout_vertical"] = true
+ timber_nodenames["growing_cactus:branch_sprout_vertical_fixed"] = true
+ timber_nodenames["growing_cactus:branch_sprout_xp"] = true
+ timber_nodenames["growing_cactus:branch_sprout_xm"] = true
+ timber_nodenames["growing_cactus:branch_sprout_zp"] = true
+ timber_nodenames["growing_cactus:branch_sprout_zm"] = true
+ timber_nodenames["growing_cactus:trunk"] = true
+ timber_nodenames["growing_cactus:branch_trunk"] = true
+ timber_nodenames["growing_cactus:branch"] = true
+ timber_nodenames["growing_cactus:branch_xp"] = true
+ timber_nodenames["growing_cactus:branch_xm"] = true
+ timber_nodenames["growing_cactus:branch_zp"] = true
+ timber_nodenames["growing_cactus:branch_zm"] = true
+ timber_nodenames["growing_cactus:branch_zz"] = true
+ timber_nodenames["growing_cactus:branch_xx"] = true
+end
+
+-- Support farming_plus
+if minetest.get_modpath("farming_plus") then
+ if chainsaw_leaves then
+ timber_nodenames["farming_plus:banana_leaves"] = true
+ timber_nodenames["farming_plus:banana"] = true
+ timber_nodenames["farming_plus:cocoa_leaves"] = true
+ timber_nodenames["farming_plus:cocoa"] = true
+ end
+end
+
+-- Support nature
+if minetest.get_modpath("nature") then
+ if chainsaw_leaves then
+ timber_nodenames["nature:blossom"] = true
+ end
+end
+
+-- Support snow
+if minetest.get_modpath("snow") then
+ if chainsaw_leaves then
+ timber_nodenames["snow:needles"] = true
+ timber_nodenames["snow:needles_decorated"] = true
+ timber_nodenames["snow:star"] = true
+ end
+end
+
+-- Support vines (also generated by moretrees if available)
+if minetest.get_modpath("vines") then
+ if chainsaw_leaves then
+ timber_nodenames["vines:vines"] = true
+ end
+end
+
+if minetest.get_modpath("trunks") then
+ if chainsaw_leaves then
+ timber_nodenames["trunks:moss"] = true
+ timber_nodenames["trunks:moss_fungus"] = true
+ timber_nodenames["trunks:treeroot"] = true
+ end
+end
+
+local S = technic.getter
+
+technic.register_power_tool("technic:chainsaw", chainsaw_max_charge)
+
+-- Table for saving what was sawed down
+local produced = {}
+
+-- Save the items sawed down so that we can drop them in a nice single stack
+local function handle_drops(drops)
+ for _, item in ipairs(drops) do
+ local stack = ItemStack(item)
+ local name = stack:get_name()
+ local p = produced[name]
+ if not p then
+ produced[name] = stack
+ else
+ p:set_count(p:get_count() + stack:get_count())
+ end
+ end
+end
+
+--- Iterator over positions to try to saw around a sawed node.
+-- This returns positions in a 3x1x3 area around the position, plus the
+-- position above it. This does not return the bottom position to prevent
+-- the chainsaw from cutting down nodes below the cutting position.
+-- @param pos Sawing position.
+local function iterSawTries(pos)
+ -- Copy position to prevent mangling it
+ local pos = vector.new(pos)
+ local i = 0
+
+ return function()
+ i = i + 1
+ -- Given a (top view) area like so (where 5 is the starting position):
+ -- X -->
+ -- Z 123
+ -- | 456
+ -- V 789
+ -- This will return positions 1, 4, 7, 2, 8 (skip 5), 3, 6, 9,
+ -- and the position above 5.
+ if i == 1 then
+ -- Move to starting position
+ pos.x = pos.x - 1
+ pos.z = pos.z - 1
+ elseif i == 4 or i == 7 then
+ -- Move to next X and back to start of Z when we reach
+ -- the end of a Z line.
+ pos.x = pos.x + 1
+ pos.z = pos.z - 2
+ elseif i == 5 then
+ -- Skip the middle position (we've already run on it)
+ -- and double-increment the counter.
+ pos.z = pos.z + 2
+ i = i + 1
+ elseif i <= 9 then
+ -- Go to next Z.
+ pos.z = pos.z + 1
+ elseif i == 10 then
+ -- Move back to center and up.
+ -- The Y+ position must be last so that we don't dig
+ -- straight upward and not come down (since the Y-
+ -- position isn't checked).
+ pos.x = pos.x - 1
+ pos.z = pos.z - 1
+ pos.y = pos.y + 1
+ else
+ return nil
+ end
+ return pos
+ end
+end
+
+-- This function does all the hard work. Recursively we dig the node at hand
+-- if it is in the table and then search the surroundings for more stuff to dig.
+local function recursive_dig(pos, remaining_charge)
+ if remaining_charge < chainsaw_charge_per_node then
+ return remaining_charge
+ end
+ local node = minetest.get_node(pos)
+
+ if not timber_nodenames[node.name] then
+ return remaining_charge
+ end
+
+ -- Wood found - cut it
+ handle_drops(minetest.get_node_drops(node.name, ""))
+ minetest.remove_node(pos)
+ remaining_charge = remaining_charge - chainsaw_charge_per_node
+
+ -- Check surroundings and run recursively if any charge left
+ for npos in iterSawTries(pos) do
+ if remaining_charge < chainsaw_charge_per_node then
+ break
+ end
+ if timber_nodenames[minetest.get_node(npos).name] then
+ remaining_charge = recursive_dig(npos, remaining_charge)
+ end
+ end
+ return remaining_charge
+end
+
+-- Function to randomize positions for new node drops
+local function get_drop_pos(pos)
+ local drop_pos = {}
+
+ for i = 0, 8 do
+ -- Randomize position for a new drop
+ drop_pos.x = pos.x + math.random(-3, 3)
+ drop_pos.y = pos.y - 1
+ drop_pos.z = pos.z + math.random(-3, 3)
+
+ -- Move the randomized position upwards until
+ -- the node is air or unloaded.
+ for y = drop_pos.y, drop_pos.y + 5 do
+ drop_pos.y = y
+ local node = minetest.get_node_or_nil(drop_pos)
+
+ if not node then
+ -- If the node is not loaded yet simply drop
+ -- the item at the original digging position.
+ return pos
+ elseif node.name == "air" then
+ -- Add variation to the entity drop position,
+ -- but don't let drops get too close to the edge
+ drop_pos.x = drop_pos.x + (math.random() * 0.8) - 0.5
+ drop_pos.z = drop_pos.z + (math.random() * 0.8) - 0.5
+ return drop_pos
+ end
+ end
+ end
+
+ -- Return the original position if this takes too long
+ return pos
+end
+
+-- Chainsaw entry point
+local function chainsaw_dig(pos, current_charge)
+ -- Start sawing things down
+ local remaining_charge = recursive_dig(pos, current_charge)
+ minetest.sound_play("chainsaw", {pos = pos, gain = 1.0,
+ max_hear_distance = 10})
+
+ -- Now drop items for the player
+ for name, stack in pairs(produced) do
+ -- Drop stacks of stack max or less
+ local count, max = stack:get_count(), stack:get_stack_max()
+ stack:set_count(max)
+ while count > max do
+ minetest.add_item(get_drop_pos(pos), stack)
+ count = count - max
+ end
+ stack:set_count(count)
+ minetest.add_item(get_drop_pos(pos), stack)
+ end
+
+ -- Clean up
+ produced = {}
+
+ return remaining_charge
+end
+
+
+minetest.register_tool("technic:chainsaw", {
+ description = S("Chainsaw"),
+ inventory_image = "technic_chainsaw.png",
+ stack_max = 1,
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ on_use = function(itemstack, user, pointed_thing)
+ if pointed_thing.type ~= "node" then
+ return itemstack
+ end
+
+ local meta = minetest.deserialize(itemstack:get_metadata())
+ if not meta or not meta.charge or
+ meta.charge < chainsaw_charge_per_node then
+ return
+ end
+
+ local name = user:get_player_name()
+ if minetest.is_protected(pointed_thing.under, name) then
+ minetest.record_protection_violation(pointed_thing.under, name)
+ return
+ end
+
+ -- Send current charge to digging function so that the
+ -- chainsaw will stop after digging a number of nodes
+ meta.charge = chainsaw_dig(pointed_thing.under, meta.charge)
+ if not technic.creative_mode then
+ technic.set_RE_wear(itemstack, meta.charge, chainsaw_max_charge)
+ itemstack:set_metadata(minetest.serialize(meta))
+ end
+ return itemstack
+ end,
+})
+
+local mesecons_button = minetest.get_modpath("mesecons_button")
+local trigger = mesecons_button and "mesecons_button:button_off" or "default:mese_crystal_fragment"
+
+minetest.register_craft({
+ output = "technic:chainsaw",
+ recipe = {
+ {"technic:stainless_steel_ingot", trigger, "technic:battery"},
+ {"technic:fine_copper_wire", "technic:motor", "technic:battery"},
+ {"", "", "technic:stainless_steel_ingot"},
+ }
+})
+
diff --git a/technic/technic/tools/flashlight.lua b/technic/technic/tools/flashlight.lua
new file mode 100644
index 0000000..252dc8c
--- /dev/null
+++ b/technic/technic/tools/flashlight.lua
@@ -0,0 +1,123 @@
+-- Original code comes from walkin_light mod by Echo
+-- http://minetest.net/forum/viewtopic.php?id=2621
+
+local flashlight_max_charge = 30000
+
+local S = technic.getter
+
+technic.register_power_tool("technic:flashlight", flashlight_max_charge)
+
+minetest.register_alias("technic:light_off", "air")
+
+minetest.register_tool("technic:flashlight", {
+ description = S("Flashlight"),
+ inventory_image = "technic_flashlight.png",
+ stack_max = 1,
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+})
+
+minetest.register_craft({
+ output = "technic:flashlight",
+ recipe = {
+ {"technic:rubber", "default:glass", "technic:rubber"},
+ {"technic:stainless_steel_ingot", "technic:battery", "technic:stainless_steel_ingot"},
+ {"", "technic:battery", ""}
+ }
+})
+
+
+local player_positions = {}
+local was_wielding = {}
+
+local 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 do
+ if hotbar[i]:get_name() == "technic:flashlight" then
+ local meta = minetest.deserialize(hotbar[i]:get_metadata())
+ if meta and meta.charge and meta.charge >= 2 then
+ if not technic.creative_mode then
+ meta.charge = meta.charge - 2;
+ technic.set_RE_wear(hotbar[i], meta.charge, flashlight_max_charge)
+ hotbar[i]:set_metadata(minetest.serialize(meta))
+ inv:set_stack("main", i, hotbar[i])
+ end
+ return true
+ end
+ end
+ end
+ return false
+end
+
+minetest.register_on_joinplayer(function(player)
+ local player_name = player:get_player_name()
+ local pos = player:getpos()
+ local rounded_pos = vector.round(pos)
+ rounded_pos.y = rounded_pos.y + 1
+ player_positions[player_name] = rounded_pos
+ was_wielding[player_name] = true
+end)
+
+
+minetest.register_on_leaveplayer(function(player)
+ local player_name = player:get_player_name()
+ local pos = player_positions[player_name]
+ local nodename = minetest.get_node(pos).name
+ if nodename == "technic:light" then
+ minetest.remove_node(pos)
+ end
+ player_positions[player_name] = nil
+end)
+
+minetest.register_globalstep(function(dtime)
+ for i, player in pairs(minetest.get_connected_players()) do
+ local player_name = player:get_player_name()
+ local flashlight_weared = check_for_flashlight(player)
+ local pos = player:getpos()
+ local rounded_pos = vector.round(pos)
+ rounded_pos.y = rounded_pos.y + 1
+ local old_pos = player_positions[player_name]
+ local player_moved = old_pos and not vector.equals(old_pos, rounded_pos)
+ if not old_pos then
+ old_pos = rounded_pos
+ player_moved = true
+ end
+
+ -- Remove light, flashlight weared out or was removed from hotbar
+ if was_wielding[player_name] and not flashlight_weared then
+ was_wielding[player_name] = false
+ local node = minetest.get_node_or_nil(old_pos)
+ if node and node.name == "technic:light" then
+ minetest.remove_node(old_pos)
+ end
+ elseif (player_moved or not was_wielding[player_name]) and flashlight_weared then
+ local node = minetest.get_node_or_nil(rounded_pos)
+ if node and node.name == "air" then
+ minetest.set_node(rounded_pos, {name="technic:light"})
+ end
+ local node = minetest.get_node_or_nil(old_pos)
+ if node and node.name == "technic:light" then
+ minetest.remove_node(old_pos)
+ end
+ player_positions[player_name] = rounded_pos
+ was_wielding[player_name] = true
+ end
+ end
+end)
+
+minetest.register_node("technic:light", {
+ drawtype = "glasslike",
+ tiles = {"technic_light.png"},
+ paramtype = "light",
+ groups = {not_in_creative_inventory=1},
+ drop = "",
+ walkable = false,
+ buildable_to = true,
+ sunlight_propagates = true,
+ light_source = LIGHT_MAX,
+ pointable = false,
+})
diff --git a/technic/technic/tools/init.lua b/technic/technic/tools/init.lua
new file mode 100644
index 0000000..5e0aa02
--- /dev/null
+++ b/technic/technic/tools/init.lua
@@ -0,0 +1,23 @@
+local path = technic.modpath.."/tools"
+
+if technic.config:get_bool("enable_mining_drill") then
+ dofile(path.."/mining_drill.lua")
+end
+if technic.config:get_bool("enable_mining_laser") then
+ dofile(path.."/mining_lasers.lua")
+end
+if technic.config:get_bool("enable_flashlight") then
+ dofile(path.."/flashlight.lua")
+end
+dofile(path.."/cans.lua")
+dofile(path.."/chainsaw.lua")
+dofile(path.."/tree_tap.lua")
+dofile(path.."/sonic_screwdriver.lua")
+dofile(path.."/prospector.lua")
+dofile(path.."/vacuum.lua")
+
+if minetest.get_modpath("screwdriver") then
+ -- compatibility alias
+ minetest.register_alias("technic:screwdriver", "screwdriver:screwdriver")
+end
+
diff --git a/technic/technic/tools/mining_drill.lua b/technic/technic/tools/mining_drill.lua
new file mode 100644
index 0000000..8a25abe
--- /dev/null
+++ b/technic/technic/tools/mining_drill.lua
@@ -0,0 +1,419 @@
+local max_charge = {50000, 200000, 650000}
+local power_usage_per_node = {200, 500, 800}
+
+local S = technic.getter
+
+minetest.register_craft({
+ output = 'technic:mining_drill',
+ recipe = {
+ {'moreores:tin_ingot', 'technic:diamond_drill_head', 'moreores:tin_ingot'},
+ {'technic:stainless_steel_ingot', 'technic:motor', 'technic:stainless_steel_ingot'},
+ {'', 'technic:red_energy_crystal', 'default:copper_ingot'},
+ }
+})
+minetest.register_craft({
+ output = 'technic:mining_drill_mk2',
+ recipe = {
+ {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'},
+ {'technic:stainless_steel_ingot', 'technic:mining_drill', 'technic:stainless_steel_ingot'},
+ {'', 'technic:green_energy_crystal', ''},
+ }
+})
+minetest.register_craft({
+ output = 'technic:mining_drill_mk3',
+ recipe = {
+ {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'},
+ {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2', 'technic:stainless_steel_ingot'},
+ {'', 'technic:blue_energy_crystal', ''},
+ }
+})
+for i = 1, 4 do
+ minetest.register_craft({
+ output = 'technic:mining_drill_mk3',
+ recipe = {
+ {'technic:diamond_drill_head', 'technic:diamond_drill_head', 'technic:diamond_drill_head'},
+ {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2_'..i, 'technic:stainless_steel_ingot'},
+ {'', 'technic:blue_energy_crystal', ''},
+ }
+ })
+end
+
+local mining_drill_mode_text = {
+ {S("Single node.")},
+ {S("3 nodes deep.")},
+ {S("3 nodes wide.")},
+ {S("3 nodes tall.")},
+ {S("3x3 nodes.")},
+}
+
+local function drill_dig_it0 (pos,player)
+ if minetest.is_protected(pos, player:get_player_name()) then
+ minetest.record_protection_violation(pos, player:get_player_name())
+ return
+ end
+ local node=minetest.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.remove_node(pos) return end
+ if node.name == "default:water_flowing" then minetest.remove_node(pos) return end
+ minetest.node_dig(pos,node,player)
+end
+
+local function drill_dig_it1 (player)
+ local dir=player:get_look_dir()
+ if math.abs(dir.x)>math.abs(dir.z) then
+ if dir.x>0 then return 0 end
+ return 1
+ end
+ if dir.z>0 then return 2 end
+ return 3
+end
+
+local function drill_dig_it2 (pos,player)
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z+1
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z-2
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z+1
+ pos.y=pos.y+1
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z+1
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z-2
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z+1
+ pos.y=pos.y-2
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z+1
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z-2
+ drill_dig_it0 (pos,player)
+end
+
+local function drill_dig_it3 (pos,player)
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x-2
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ pos.y=pos.y+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x-2
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ pos.y=pos.y-2
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x-2
+ drill_dig_it0 (pos,player)
+end
+
+local function drill_dig_it4 (pos,player)
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x-2
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ pos.z=pos.z+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x-2
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ pos.z=pos.z-2
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x-2
+ drill_dig_it0 (pos,player)
+end
+
+local function cost_to_use(drill_type, mode)
+ local mult
+ if mode == 1 then
+ mult = 1
+ elseif mode <= 4 then
+ mult = 3
+ else
+ mult = 9
+ end
+ return power_usage_per_node[drill_type] * mult
+end
+
+local function drill_dig_it(pos, player, mode)
+ if mode == 1 then
+ drill_dig_it0(pos, player)
+ end
+
+ if mode == 2 then -- 3 deep
+ dir = drill_dig_it1(player)
+ if dir == 0 then -- x+
+ drill_dig_it0(pos, player)
+ pos.x = pos.x + 1
+ drill_dig_it0(pos, player)
+ pos.x = pos.x + 1
+ drill_dig_it0(pos, player)
+ end
+ if dir == 1 then -- x-
+ drill_dig_it0(pos, player)
+ pos.x=pos.x-1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x-1
+ drill_dig_it0 (pos,player)
+ end
+ if dir==2 then -- z+
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z+1
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z+1
+ drill_dig_it0 (pos,player)
+ end
+ if dir==3 then -- z-
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z-1
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z-1
+ drill_dig_it0 (pos,player)
+ end
+ end
+
+ if mode==3 then -- 3 wide
+ dir=drill_dig_it1(player)
+ if dir==0 or dir==1 then -- x
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z+1
+ drill_dig_it0 (pos,player)
+ pos.z=pos.z-2
+ drill_dig_it0 (pos,player)
+ end
+ if dir==2 or dir==3 then -- z
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x+1
+ drill_dig_it0 (pos,player)
+ pos.x=pos.x-2
+ drill_dig_it0 (pos,player)
+ end
+ end
+
+ if mode==4 then -- 3 tall, selected in the middle
+ drill_dig_it0 (pos,player)
+ pos.y=pos.y-1
+ drill_dig_it0 (pos,player)
+ pos.y=pos.y-1
+ drill_dig_it0 (pos,player)
+ end
+
+ if mode==5 then -- 3 x 3
+ local dir=player:get_look_dir()
+ if math.abs(dir.y)<0.5 then
+ dir=drill_dig_it1(player)
+ if dir==0 or dir==1 then -- x
+ drill_dig_it2(pos,player)
+ end
+ if dir==2 or dir==3 then -- z
+ drill_dig_it3(pos,player)
+ end
+ else
+ drill_dig_it4(pos,player)
+ end
+ end
+
+ minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
+end
+
+local function pos_is_pointable(pos)
+ local node = minetest.get_node(pos)
+ local nodedef = minetest.registered_nodes[node.name]
+ return nodedef and nodedef.pointable
+end
+
+local function mining_drill_mk2_setmode(user,itemstack)
+ local player_name=user:get_player_name()
+ local item=itemstack:to_table()
+ local meta=minetest.deserialize(item["metadata"])
+ if meta==nil then
+ meta={}
+ mode=0
+ end
+ if meta["mode"]==nil then
+ minetest.chat_send_player(player_name, S("Use while sneaking to change Mining Drill Mk%d modes."):format(2))
+ meta["mode"]=0
+ mode=0
+ end
+ mode=(meta["mode"])
+ mode=mode+1
+ if mode>=5 then mode=1 end
+ minetest.chat_send_player(player_name, S("Mining Drill Mk%d Mode %d"):format(2, mode)..": "..mining_drill_mode_text[mode][1])
+ item["name"]="technic:mining_drill_mk2_"..mode
+ meta["mode"]=mode
+ item["metadata"]=minetest.serialize(meta)
+ itemstack:replace(item)
+ return itemstack
+end
+
+local function mining_drill_mk3_setmode(user,itemstack)
+ local player_name=user:get_player_name()
+ local item=itemstack:to_table()
+ local meta=minetest.deserialize(item["metadata"])
+ if meta==nil then
+ meta={}
+ mode=0
+ end
+ if meta["mode"]==nil then
+ minetest.chat_send_player(player_name, S("Use while sneaking to change Mining Drill Mk%d modes."):format(3))
+ meta["mode"]=0
+ mode=0
+ end
+ mode=(meta["mode"])
+ mode=mode+1
+ if mode>=6 then mode=1 end
+ minetest.chat_send_player(player_name, S("Mining Drill Mk%d Mode %d"):format(3, mode)..": "..mining_drill_mode_text[mode][1])
+ item["name"]="technic:mining_drill_mk3_"..mode
+ meta["mode"]=mode
+ item["metadata"]=minetest.serialize(meta)
+ itemstack:replace(item)
+ return itemstack
+end
+
+
+local function mining_drill_mk2_handler(itemstack, user, pointed_thing)
+ local keys = user:get_player_control()
+ local player_name = user:get_player_name()
+ local meta = minetest.deserialize(itemstack:get_metadata())
+ if not meta or not meta.mode or keys.sneak then
+ return mining_drill_mk2_setmode(user, itemstack)
+ end
+ if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then
+ return
+ end
+ local charge_to_take = cost_to_use(2, meta.mode)
+ if meta.charge >= charge_to_take then
+ local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+ drill_dig_it(pos, user, meta.mode)
+ if not technic.creative_mode then
+ meta.charge = meta.charge - charge_to_take
+ itemstack:set_metadata(minetest.serialize(meta))
+ technic.set_RE_wear(itemstack, meta.charge, max_charge[2])
+ end
+ end
+ return itemstack
+end
+
+local function mining_drill_mk3_handler(itemstack, user, pointed_thing)
+ local keys = user:get_player_control()
+ local player_name = user:get_player_name()
+ local meta = minetest.deserialize(itemstack:get_metadata())
+ if not meta or not meta.mode or keys.sneak then
+ return mining_drill_mk3_setmode(user, itemstack)
+ end
+ if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then
+ return
+ end
+ local charge_to_take = cost_to_use(3, meta.mode)
+ if meta.charge >= charge_to_take then
+ local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+ drill_dig_it(pos, user, meta.mode)
+ if not technic.creative_mode then
+ meta.charge = meta.charge - charge_to_take
+ itemstack:set_metadata(minetest.serialize(meta))
+ technic.set_RE_wear(itemstack, meta.charge, max_charge[3])
+ end
+ end
+ return itemstack
+end
+
+technic.register_power_tool("technic:mining_drill", max_charge[1])
+
+minetest.register_tool("technic:mining_drill", {
+ description = S("Mining Drill Mk%d"):format(1),
+ inventory_image = "technic_mining_drill.png",
+ stack_max = 1,
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ on_use = function(itemstack, user, pointed_thing)
+ if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then
+ return itemstack
+ end
+ local meta = minetest.deserialize(itemstack:get_metadata())
+ if not meta or not meta.charge then
+ return
+ end
+ local charge_to_take = cost_to_use(1, 1)
+ if meta.charge >= charge_to_take then
+ local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+ drill_dig_it(pos, user, 1)
+ if not technic.creative_mode then
+ meta.charge = meta.charge - charge_to_take
+ itemstack:set_metadata(minetest.serialize(meta))
+ technic.set_RE_wear(itemstack, meta.charge, max_charge[1])
+ end
+ end
+ return itemstack
+ end,
+})
+
+minetest.register_tool("technic:mining_drill_mk2", {
+ description = S("Mining Drill Mk%d"):format(2),
+ inventory_image = "technic_mining_drill_mk2.png",
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ on_use = function(itemstack, user, pointed_thing)
+ mining_drill_mk2_handler(itemstack, user, pointed_thing)
+ return itemstack
+ end,
+})
+
+technic.register_power_tool("technic:mining_drill_mk2", max_charge[2])
+
+for i = 1, 4 do
+ technic.register_power_tool("technic:mining_drill_mk2_"..i, max_charge[2])
+ minetest.register_tool("technic:mining_drill_mk2_"..i, {
+ description = S("Mining Drill Mk%d Mode %d"):format(2, i),
+ inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png",
+ wield_image = "technic_mining_drill_mk2.png",
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ groups = {not_in_creative_inventory=1},
+ on_use = function(itemstack, user, pointed_thing)
+ mining_drill_mk2_handler(itemstack, user, pointed_thing)
+ return itemstack
+ end,
+ })
+end
+
+minetest.register_tool("technic:mining_drill_mk3", {
+ description = S("Mining Drill Mk%d"):format(3),
+ inventory_image = "technic_mining_drill_mk3.png",
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ on_use = function(itemstack, user, pointed_thing)
+ mining_drill_mk3_handler(itemstack,user,pointed_thing)
+ return itemstack
+ end,
+})
+
+technic.register_power_tool("technic:mining_drill_mk3", max_charge[3])
+
+for i=1,5,1 do
+ technic.register_power_tool("technic:mining_drill_mk3_"..i, max_charge[3])
+ minetest.register_tool("technic:mining_drill_mk3_"..i, {
+ description = S("Mining Drill Mk%d Mode %d"):format(3, i),
+ inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png",
+ wield_image = "technic_mining_drill_mk3.png",
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ groups = {not_in_creative_inventory=1},
+ on_use = function(itemstack, user, pointed_thing)
+ mining_drill_mk3_handler(itemstack,user,pointed_thing)
+ return itemstack
+ end,
+ })
+end
diff --git a/technic/technic/tools/mining_lasers.lua b/technic/technic/tools/mining_lasers.lua
new file mode 100644
index 0000000..4c83ae9
--- /dev/null
+++ b/technic/technic/tools/mining_lasers.lua
@@ -0,0 +1,178 @@
+local mining_lasers_list = {
+-- {<num>, <range of the laser shots>, <max_charge>, <charge_per_shot>},
+ {"1", 7, 50000, 1000},
+ {"2", 14, 200000, 2000},
+ {"3", 21, 650000, 3000},
+}
+
+local S = technic.getter
+
+minetest.register_craft({
+ output = 'technic:laser_mk1',
+ recipe = {
+ {'default:diamond', 'technic:brass_ingot', 'default:obsidian_glass'},
+ {'', 'technic:brass_ingot', 'technic:red_energy_crystal'},
+ {'', '', 'default:copper_ingot'},
+ }
+})
+minetest.register_craft({
+ output = 'technic:laser_mk2',
+ recipe = {
+ {'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk1'},
+ {'', 'technic:carbon_steel_ingot', 'technic:green_energy_crystal'},
+ {'', '', 'default:copper_ingot'},
+ }
+})
+minetest.register_craft({
+ output = 'technic:laser_mk3',
+ recipe = {
+ {'default:diamond', 'technic:carbon_steel_ingot', 'technic:laser_mk2'},
+ {'', 'technic:carbon_steel_ingot', 'technic:blue_energy_crystal'},
+ {'', '', 'default:copper_ingot'},
+ }
+})
+
+-- Based on code by Uberi: https://gist.github.com/Uberi/3125280
+local function rayIter(pos, dir, range)
+ local p = vector.round(pos)
+ local x_step, y_step, z_step = 0, 0, 0
+ local x_component, y_component, z_component = 0, 0, 0
+ local x_intersect, y_intersect, z_intersect = 0, 0, 0
+
+ if dir.x == 0 then
+ x_intersect = math.huge
+ elseif dir.x > 0 then
+ x_step = 1
+ x_component = 1 / dir.x
+ x_intersect = x_component
+ else
+ x_step = -1
+ x_component = 1 / -dir.x
+ end
+ if dir.y == 0 then
+ y_intersect = math.huge
+ elseif dir.y > 0 then
+ y_step = 1
+ y_component = 1 / dir.y
+ y_intersect = y_component
+ else
+ y_step = -1
+ y_component = 1 / -dir.y
+ end
+ if dir.z == 0 then
+ z_intersect = math.huge
+ elseif dir.z > 0 then
+ z_step = 1
+ z_component = 1 / dir.z
+ z_intersect = z_component
+ else
+ z_step = -1
+ z_component = 1 / -dir.z
+ end
+
+ return function()
+ if x_intersect < y_intersect then
+ if x_intersect < z_intersect then
+ p.x = p.x + x_step
+ x_intersect = x_intersect + x_component
+ else
+ p.z = p.z + z_step
+ z_intersect = z_intersect + z_component
+ end
+ elseif y_intersect < z_intersect then
+ p.y = p.y + y_step
+ y_intersect = y_intersect + y_component
+ else
+ p.z = p.z + z_step
+ z_intersect = z_intersect + z_component
+ end
+ if vector.distance(pos, p) > range then
+ return nil
+ end
+ return p
+ end
+end
+
+local function laser_node(pos, node, player)
+ local def = minetest.registered_nodes[node.name]
+ if def and def.liquidtype ~= "none" then
+ minetest.remove_node(pos)
+ minetest.add_particle({
+ pos = pos,
+ vel = {x=0, y=2, z=0},
+ acc = {x=0, y=-1, z=0},
+ expirationtime = 1.5,
+ size = 6 + math.random() * 2,
+ texture = "smoke_puff.png^[transform" .. math.random(0, 7),
+ })
+ return
+ end
+ minetest.node_dig(pos, node, player)
+end
+
+local no_destroy = {
+ ["air"] = true,
+ ["default:lava_source"] = true,
+ ["default:lava_flowing"] = true,
+}
+local function laser_shoot(player, range, particle_texture, sound)
+ local player_pos = player:getpos()
+ local player_name = player:get_player_name()
+ local dir = player:get_look_dir()
+
+ local start_pos = vector.new(player_pos)
+ -- Adjust to head height
+ start_pos.y = start_pos.y + 1.9
+ minetest.add_particle({
+ pos = startpos,
+ vel = dir,
+ acc = vector.multiply(dir, 50),
+ expirationtime = range / 11,
+ size = 1,
+ texture = particle_texture .. "^[transform" .. math.random(0, 7),
+ })
+ minetest.sound_play(sound, {pos = player_pos, max_hear_distance = range})
+ for pos in rayIter(start_pos, dir, range) do
+ if minetest.is_protected(pos, player_name) then
+ minetest.record_protection_violation(pos, player_name)
+ break
+ end
+ local node = minetest.get_node_or_nil(pos)
+ if not node then
+ break
+ end
+ if not no_destroy[node.name] then
+ laser_node(pos, node, player)
+ end
+ end
+end
+
+
+for _, m in pairs(mining_lasers_list) do
+ technic.register_power_tool("technic:laser_mk"..m[1], m[3])
+ minetest.register_tool("technic:laser_mk"..m[1], {
+ description = S("Mining Laser Mk%d"):format(m[1]),
+ inventory_image = "technic_mining_laser_mk"..m[1]..".png",
+ stack_max = 1,
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ on_use = function(itemstack, user)
+ local meta = minetest.deserialize(itemstack:get_metadata())
+ if not meta or not meta.charge then
+ return
+ end
+
+ -- If there's enough charge left, fire the laser
+ if meta.charge >= m[4] then
+ laser_shoot(user, m[2], "technic_laser_beam_mk"..m[1]..".png", "technic_laser_mk"..m[1])
+ if not technic.creative_mode then
+ meta.charge = meta.charge - m[4]
+ technic.set_RE_wear(itemstack, meta.charge, m[3])
+ itemstack:set_metadata(minetest.serialize(meta))
+ end
+ end
+ return itemstack
+ end,
+ })
+end
+
diff --git a/technic/technic/tools/prospector.lua b/technic/technic/tools/prospector.lua
new file mode 100644
index 0000000..b28f1d8
--- /dev/null
+++ b/technic/technic/tools/prospector.lua
@@ -0,0 +1,128 @@
+local S = technic.getter
+
+technic.register_power_tool("technic:prospector", 300000)
+
+local function get_metadata(toolstack)
+ local m = minetest.deserialize(toolstack:get_metadata())
+ if not m then m = {} end
+ if not m.charge then m.charge = 0 end
+ if not m.target then m.target = "" end
+ if not m.look_depth then m.look_depth = 7 end
+ if not m.look_radius then m.look_radius = 1 end
+ return m
+end
+
+minetest.register_tool("technic:prospector", {
+ description = S("Prospector"),
+ inventory_image = "technic_prospector.png",
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ on_use = function(toolstack, user, pointed_thing)
+ if not user or not user:is_player() or user.is_fake_player then return end
+ if pointed_thing.type ~= "node" then return end
+ local toolmeta = get_metadata(toolstack)
+ local look_diameter = toolmeta.look_radius * 2 + 1
+ local charge_to_take = toolmeta.look_depth * (toolmeta.look_depth + 1) * look_diameter * look_diameter
+ if toolmeta.charge < charge_to_take then return end
+ if toolmeta.target == "" then
+ minetest.chat_send_player(user:get_player_name(), "Right-click to set target block type")
+ return
+ end
+ if not technic.creative_mode then
+ toolmeta.charge = toolmeta.charge - charge_to_take
+ toolstack:set_metadata(minetest.serialize(toolmeta))
+ technic.set_RE_wear(toolstack, toolmeta.charge, technic.power_tools[toolstack:get_name()])
+ end
+ local start_pos = pointed_thing.under
+ local forward = minetest.facedir_to_dir(minetest.dir_to_facedir(user:get_look_dir(), true))
+ local right = forward.x ~= 0 and { x=0, y=1, z=0 } or (forward.y ~= 0 and { x=0, y=0, z=1 } or { x=1, y=0, z=0 })
+ local up = forward.x ~= 0 and { x=0, y=0, z=1 } or (forward.y ~= 0 and { x=1, y=0, z=0 } or { x=0, y=1, z=0 })
+ local base_pos = vector.add(start_pos, vector.multiply(vector.add(right, up), - toolmeta.look_radius))
+ local found = false
+ for f = 0, toolmeta.look_depth-1 do
+ for r = 0, look_diameter-1 do
+ for u = 0, look_diameter-1 do
+ if minetest.get_node(vector.add(vector.add(vector.add(base_pos, vector.multiply(forward, f)), vector.multiply(right, r)), vector.multiply(up, u))).name == toolmeta.target then found = true end
+ end
+ end
+ end
+ if math.random() < 0.02 then found = not found end
+ minetest.chat_send_player(user:get_player_name(), minetest.registered_nodes[toolmeta.target].description.." is "..(found and "present" or "absent").." in "..look_diameter.."x"..look_diameter.."x"..toolmeta.look_depth.." region")
+ minetest.sound_play("technic_prospector_"..(found and "hit" or "miss"), { pos = vector.add(user:getpos(), { x = 0, y = 1, z = 0 }), gain = 1.0, max_hear_distance = 10 })
+ return toolstack
+ end,
+ on_place = function(toolstack, user, pointed_thing)
+ if not user or not user:is_player() or user.is_fake_player then return end
+ local toolmeta = get_metadata(toolstack)
+ local pointed
+ if pointed_thing.type == "node" then
+ local pname = minetest.get_node(pointed_thing.under).name
+ local pdef = minetest.registered_nodes[pname]
+ if pdef and (pdef.groups.not_in_creative_inventory or 0) == 0 and pname ~= toolmeta.target then
+ pointed = pname
+ end
+ end
+ local look_diameter = toolmeta.look_radius * 2 + 1
+ minetest.show_formspec(user:get_player_name(), "technic:prospector_control",
+ "size[7,8.5]"..
+ "item_image[0,0;1,1;"..toolstack:get_name().."]"..
+ "label[1,0;"..minetest.formspec_escape(toolstack:get_definition().description).."]"..
+ (toolmeta.target ~= "" and
+ "label[0,1.5;Current target:]"..
+ "label[0,2;"..minetest.formspec_escape(minetest.registered_nodes[toolmeta.target].description).."]"..
+ "item_image[0,2.5;1,1;"..toolmeta.target.."]" or
+ "label[0,1.5;No target set]")..
+ (pointed and
+ "label[3.5,1.5;May set new target:]"..
+ "label[3.5,2;"..minetest.formspec_escape(minetest.registered_nodes[pointed].description).."]"..
+ "item_image[3.5,2.5;1,1;"..pointed.."]"..
+ "button_exit[3.5,3.65;2,0.5;target_"..pointed..";Set target]" or
+ "label[3.5,1.5;No new target available]")..
+ "label[0,4.5;Region cross section:]"..
+ "label[0,5;"..look_diameter.."x"..look_diameter.."]"..
+ "label[3.5,4.5;Set region cross section:]"..
+ "button_exit[3.5,5.15;1,0.5;look_radius_0;1x1]"..
+ "button_exit[4.5,5.15;1,0.5;look_radius_1;3x3]"..
+ "button_exit[5.5,5.15;1,0.5;look_radius_3;7x7]"..
+ "label[0,6;Region depth:]"..
+ "label[0,6.5;"..toolmeta.look_depth.."]"..
+ "label[3.5,6;Set region depth:]"..
+ "button_exit[3.5,6.65;1,0.5;look_depth_7;7]"..
+ "button_exit[4.5,6.65;1,0.5;look_depth_14;14]"..
+ "button_exit[5.5,6.65;1,0.5;look_depth_21;21]"..
+ "label[0,7.5;Accuracy:]"..
+ "label[0,8;98%]")
+ return
+ end,
+})
+
+minetest.register_on_player_receive_fields(function(user, formname, fields)
+ if formname ~= "technic:prospector_control" then return false end
+ if not user or not user:is_player() or user.is_fake_player then return end
+ local toolstack = user:get_wielded_item()
+ if toolstack:get_name() ~= "technic:prospector" then return true end
+ local toolmeta = get_metadata(toolstack)
+ for field, value in pairs(fields) do
+ if field:sub(1, 7) == "target_" then
+ toolmeta.target = field:sub(8)
+ end
+ if field:sub(1, 12) == "look_radius_" then
+ toolmeta.look_radius = field:sub(13)
+ end
+ if field:sub(1, 11) == "look_depth_" then
+ toolmeta.look_depth = field:sub(12)
+ end
+ end
+ toolstack:set_metadata(minetest.serialize(toolmeta))
+ user:set_wielded_item(toolstack)
+ return true
+end)
+
+minetest.register_craft({
+ output = "technic:prospector",
+ recipe = {
+ {"moreores:pick_silver", "moreores:mithril_block", "pipeworks:teleport_tube_1"},
+ {"technic:brass_ingot", "technic:control_logic_unit", "technic:brass_ingot"},
+ {"", "technic:blue_energy_crystal", ""},
+ }
+})
diff --git a/technic/technic/tools/sonic_screwdriver.lua b/technic/technic/tools/sonic_screwdriver.lua
new file mode 100644
index 0000000..300d363
--- /dev/null
+++ b/technic/technic/tools/sonic_screwdriver.lua
@@ -0,0 +1,98 @@
+local sonic_screwdriver_max_charge = 15000
+
+local S = technic.getter
+
+technic.register_power_tool("technic:sonic_screwdriver", sonic_screwdriver_max_charge)
+
+-- screwdriver handler code reused from minetest/minetest_game screwdriver @a9ac480
+local ROTATE_FACE = 1
+local ROTATE_AXIS = 2
+
+local function nextrange(x, max)
+ x = x + 1
+ if x > max then
+ x = 0
+ end
+ return x
+end
+
+-- Handles rotation
+local function screwdriver_handler(itemstack, user, pointed_thing, mode)
+ if pointed_thing.type ~= "node" then
+ return
+ end
+
+ local pos = pointed_thing.under
+
+ if minetest.is_protected(pos, user:get_player_name()) then
+ minetest.record_protection_violation(pos, user:get_player_name())
+ return
+ end
+
+ local node = minetest.get_node(pos)
+ local ndef = minetest.registered_nodes[node.name]
+ if not ndef or not ndef.paramtype2 == "facedir" or
+ (ndef.drawtype == "nodebox" and
+ not ndef.node_box.type == "fixed") or
+ node.param2 == nil then
+ return
+ end
+
+ -- contrary to the default screwdriver, do not check for can_dig, to allow rotating machines with CLU's in them
+ -- this is consistent with the previous sonic screwdriver
+
+ local meta1 = minetest.deserialize(itemstack:get_metadata())
+ if not meta1 or not meta1.charge or meta1.charge < 100 then
+ return
+ end
+
+ minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10})
+
+ -- Set param2
+ local rotationPart = node.param2 % 32 -- get first 4 bits
+ local preservePart = node.param2 - rotationPart
+
+ local axisdir = math.floor(rotationPart / 4)
+ local rotation = rotationPart - axisdir * 4
+ if mode == ROTATE_FACE then
+ rotationPart = axisdir * 4 + nextrange(rotation, 3)
+ elseif mode == ROTATE_AXIS then
+ rotationPart = nextrange(axisdir, 5) * 4
+ end
+
+ node.param2 = preservePart + rotationPart
+ minetest.swap_node(pos, node)
+
+ if not technic.creative_mode then
+ meta1.charge = meta1.charge - 100
+ itemstack:set_metadata(minetest.serialize(meta1))
+ technic.set_RE_wear(itemstack, meta1.charge, sonic_screwdriver_max_charge)
+ end
+
+ return itemstack
+end
+
+minetest.register_tool("technic:sonic_screwdriver", {
+ description = S("Sonic Screwdriver (left-click rotates face, right-click rotates axis)"),
+ inventory_image = "technic_sonic_screwdriver.png",
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ on_use = function(itemstack, user, pointed_thing)
+ screwdriver_handler(itemstack, user, pointed_thing, ROTATE_FACE)
+ return itemstack
+ end,
+ on_place = function(itemstack, user, pointed_thing)
+ screwdriver_handler(itemstack, user, pointed_thing, ROTATE_AXIS)
+ return itemstack
+ end,
+})
+
+minetest.register_craft({
+ output = "technic:sonic_screwdriver",
+ recipe = {
+ {"", "default:diamond", ""},
+ {"mesecons_materials:fiber", "technic:battery", "mesecons_materials:fiber"},
+ {"mesecons_materials:fiber", "moreores:mithril_ingot", "mesecons_materials:fiber"}
+ }
+})
+
diff --git a/technic/technic/tools/tree_tap.lua b/technic/technic/tools/tree_tap.lua
new file mode 100644
index 0000000..e84fe33
--- /dev/null
+++ b/technic/technic/tools/tree_tap.lua
@@ -0,0 +1,75 @@
+
+local S = technic.getter
+local mesecons_materials = minetest.get_modpath("mesecons_materials")
+
+minetest.register_tool("technic:treetap", {
+ description = S("Tree Tap"),
+ inventory_image = "technic_tree_tap.png",
+ on_use = function(itemstack, user, pointed_thing)
+ if pointed_thing.type ~= "node" then
+ return
+ end
+ local pos = pointed_thing.under
+ if minetest.is_protected(pos, user:get_player_name()) then
+ minetest.record_protection_violation(pos, user:get_player_name())
+ return
+ end
+ local node = minetest.get_node(pos)
+ local node_name = node.name
+ if node_name ~= "moretrees:rubber_tree_trunk" then
+ return
+ end
+ node.name = "moretrees:rubber_tree_trunk_empty"
+ minetest.swap_node(pos, node)
+ minetest.handle_node_drops(pointed_thing.above, {"technic:raw_latex"}, user)
+ if not technic.creative_mode then
+ local item_wear = tonumber(itemstack:get_wear())
+ item_wear = item_wear + 819
+ if item_wear > 65535 then
+ itemstack:clear()
+ return itemstack
+ end
+ itemstack:set_wear(item_wear)
+ end
+ return itemstack
+ end,
+})
+
+minetest.register_craft({
+ output = "technic:treetap",
+ recipe = {
+ {"pipeworks:tube_1", "group:wood", "default:stick"},
+ {"", "default:stick", "default:stick"}
+ },
+})
+
+minetest.register_craftitem("technic:raw_latex", {
+ description = S("Raw Latex"),
+ inventory_image = "technic_raw_latex.png",
+})
+
+if mesecons_materials then
+ minetest.register_craft({
+ type = "cooking",
+ recipe = "technic:raw_latex",
+ output = "mesecons_materials:glue",
+ })
+end
+
+minetest.register_craftitem("technic:rubber", {
+ description = S("Rubber Fiber"),
+ inventory_image = "technic_rubber.png",
+})
+
+minetest.register_abm({
+ nodenames = {"moretrees:rubber_tree_trunk_empty"},
+ interval = 60,
+ chance = 15,
+ action = function(pos, node)
+ if minetest.find_node_near(pos, (moretrees and moretrees.leafdecay_radius) or 5, {"moretrees:rubber_tree_leaves"}) then
+ node.name = "moretrees:rubber_tree_trunk"
+ minetest.swap_node(pos, node)
+ end
+ end
+})
+
diff --git a/technic/technic/tools/vacuum.lua b/technic/technic/tools/vacuum.lua
new file mode 100644
index 0000000..f5fac9a
--- /dev/null
+++ b/technic/technic/tools/vacuum.lua
@@ -0,0 +1,61 @@
+-- Configuration
+local vacuum_max_charge = 10000 -- 10000 - Maximum charge of the vacuum cleaner
+local vacuum_charge_per_object = 100 -- 100 - Capable of picking up 50 objects
+local vacuum_range = 8 -- 8 - Area in which to pick up objects
+
+local S = technic.getter
+
+technic.register_power_tool("technic:vacuum", vacuum_max_charge)
+
+minetest.register_tool("technic:vacuum", {
+ description = S("Vacuum Cleaner"),
+ inventory_image = "technic_vacuum.png",
+ stack_max = 1,
+ wear_represents = "technic_RE_charge",
+ on_refill = technic.refill_RE_charge,
+ on_use = function(itemstack, user, pointed_thing)
+ local meta = minetest.deserialize(itemstack:get_metadata())
+ if not meta or not meta.charge then
+ return
+ end
+ if meta.charge > vacuum_charge_per_object then
+ minetest.sound_play("vacuumcleaner", {
+ to_player = user:get_player_name(),
+ gain = 0.4,
+ })
+ end
+ local pos = user:getpos()
+ local inv = user:get_inventory()
+ for _, object in ipairs(minetest.env:get_objects_inside_radius(pos, vacuum_range)) do
+ local luaentity = object:get_luaentity()
+ if not object:is_player() and luaentity and luaentity.name == "__builtin:item" and luaentity.itemstring ~= "" then
+ if inv and inv:room_for_item("main", ItemStack(luaentity.itemstring)) then
+ meta.charge = meta.charge - vacuum_charge_per_object
+ if meta.charge < vacuum_charge_per_object then
+ return
+ end
+ inv:add_item("main", ItemStack(luaentity.itemstring))
+ minetest.sound_play("item_drop_pickup", {
+ to_player = user:get_player_name(),
+ gain = 0.4,
+ })
+ luaentity.itemstring = ""
+ object:remove()
+ end
+ end
+ end
+
+ technic.set_RE_wear(itemstack, meta.charge, vacuum_max_charge)
+ itemstack:set_metadata(minetest.serialize(meta))
+ return itemstack
+ end,
+})
+
+minetest.register_craft({
+ output = 'technic:vacuum',
+ recipe = {
+ {'pipeworks:tube_1', 'pipeworks:filter', 'technic:battery'},
+ {'pipeworks:tube_1', 'technic:motor', 'technic:battery'},
+ {'technic:stainless_steel_ingot', '', ''},
+ }
+})
diff --git a/technic/technic_chests/README.md b/technic/technic_chests/README.md
new file mode 100644
index 0000000..a570346
--- /dev/null
+++ b/technic/technic_chests/README.md
@@ -0,0 +1,24 @@
+Technic chests
+==============
+
+License
+-------
+
+Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel)
+
+Technic chests code is licensed under the GNU LGPLv2+.
+
+Texture licenses:
+
+VanessaE: (WTFPL)
+ * technic\_pencil\_icon.png
+ * technic\_checkmark\_icon.png
+ * technic\_chest\_overlay\_*.png
+ * technic\_*\_chest\_lock\_overlay.png
+
+sdzen (Elise Staudter) modified by VanessaE (CC BY-SA 3.0):
+ * copper, iron, silver, gold, mithril chest textures 16x16
+
+RealBadAngel: (WTFPL)
+ * Everything else.
+
diff --git a/technic/technic_chests/common.lua b/technic/technic_chests/common.lua
new file mode 100644
index 0000000..47054f5
--- /dev/null
+++ b/technic/technic_chests/common.lua
@@ -0,0 +1,71 @@
+
+technic.chests.groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
+ tubedevice=1, tubedevice_receiver=1}
+technic.chests.groups_noinv = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
+ tubedevice=1, tubedevice_receiver=1, not_in_creative_inventory=1}
+
+technic.chests.tube = {
+ insert_object = function(pos, node, stack, direction)
+ local meta = minetest.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.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:room_for_item("main",stack)
+ end,
+ input_inventory = "main",
+ connect_sides = {left=1, right=1, front=1, back=1, top=1, bottom=1},
+}
+
+technic.chests.can_dig = function(pos, player)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:is_empty("main")
+end
+
+local function inv_change(pos, count, player)
+ local meta = minetest.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
+
+function technic.chests.inv_move(pos, from_list, from_index, to_list, to_index, count, player)
+ return inv_change(pos, count, player)
+end
+function technic.chests.inv_put(pos, listname, index, stack, player)
+ return inv_change(pos, stack:get_count(), player)
+end
+function technic.chests.inv_take(pos, listname, index, stack, player)
+ return inv_change(pos, stack:get_count(), player)
+end
+
+function technic.chests.on_inv_move(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))
+end
+
+function technic.chests.on_inv_put(pos, listname, index, stack, player)
+ minetest.log("action", player:get_player_name()..
+ " puts stuff in to chest at "
+ ..minetest.pos_to_string(pos))
+end
+
+function technic.chests.on_inv_take(pos, listname, index, stack, player)
+ minetest.log("action", player:get_player_name()..
+ " takes stuff from chest at "
+ ..minetest.pos_to_string(pos))
+end
+
+function has_locked_chest_privilege(meta, player)
+ return player:get_player_name() == meta:get_string("owner")
+end
+
diff --git a/technic/technic_chests/copper_chest.lua b/technic/technic_chests/copper_chest.lua
new file mode 100644
index 0000000..d40284b
--- /dev/null
+++ b/technic/technic_chests/copper_chest.lua
@@ -0,0 +1,46 @@
+minetest.register_craft({
+ output = 'technic:copper_chest 1',
+ recipe = {
+ {'default:copper_ingot','default:copper_ingot','default:copper_ingot'},
+ {'default:copper_ingot','technic:iron_chest','default:copper_ingot'},
+ {'default:copper_ingot','default:copper_ingot','default:copper_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:copper_locked_chest 1',
+ recipe = {
+ {'default:copper_ingot','default:copper_ingot','default:copper_ingot'},
+ {'default:copper_ingot','technic:iron_locked_chest','default:copper_ingot'},
+ {'default:copper_ingot','default:copper_ingot','default:copper_ingot'},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:copper_locked_chest 1',
+ recipe = {
+ {'default:steel_ingot'},
+ {'technic:copper_chest'},
+ }
+})
+
+technic.chests:register("Copper", {
+ width = 12,
+ height = 5,
+ sort = true,
+ autosort = true,
+ infotext = false,
+ color = false,
+ locked = false,
+})
+
+technic.chests:register("Copper", {
+ width = 12,
+ height = 5,
+ sort = true,
+ autosort = true,
+ infotext = false,
+ color = false,
+ locked = true,
+})
+
diff --git a/technic/technic_chests/depends.txt b/technic/technic_chests/depends.txt
new file mode 100644
index 0000000..b9ca665
--- /dev/null
+++ b/technic/technic_chests/depends.txt
@@ -0,0 +1,4 @@
+default
+moreores?
+pipeworks?
+intllib?
diff --git a/technic/technic_chests/gold_chest.lua b/technic/technic_chests/gold_chest.lua
new file mode 100644
index 0000000..c66b2f6
--- /dev/null
+++ b/technic/technic_chests/gold_chest.lua
@@ -0,0 +1,57 @@
+
+local material_list
+if minetest.get_modpath("moreores") then
+ material_list = { 'silver' }
+else
+ -- Make the gold chest obtainable for mere mortals (the silver chest is not obtainable)
+ material_list = { 'copper', 'silver' }
+end
+
+for _, material in ipairs(material_list) do
+ minetest.register_craft({
+ output = 'technic:gold_chest',
+ recipe = {
+ {'default:gold_ingot','default:gold_ingot','default:gold_ingot'},
+ {'default:gold_ingot',"technic:"..material.."_chest",'default:gold_ingot'},
+ {'default:gold_ingot','default:gold_ingot','default:gold_ingot'},
+ }
+ })
+
+ minetest.register_craft({
+ output = 'technic:gold_locked_chest',
+ recipe = {
+ {'default:gold_ingot','default:gold_ingot','default:gold_ingot'},
+ {'default:gold_ingot',"technic:"..material.."_locked_chest",'default:gold_ingot'},
+ {'default:gold_ingot','default:gold_ingot','default:gold_ingot'},
+ }
+ })
+end
+
+minetest.register_craft({
+ output = 'technic:gold_locked_chest',
+ recipe = {
+ {'default:steel_ingot'},
+ {'technic:gold_chest'},
+ }
+})
+
+technic.chests:register("Gold", {
+ width = 15,
+ height = 6,
+ sort = true,
+ autosort = true,
+ infotext = true,
+ color = true,
+ locked = false,
+})
+
+technic.chests:register("Gold", {
+ width = 15,
+ height = 6,
+ sort = true,
+ autosort = true,
+ infotext = true,
+ color = true,
+ locked = true,
+})
+
diff --git a/technic/technic_chests/init.lua b/technic/technic_chests/init.lua
new file mode 100644
index 0000000..af9e041
--- /dev/null
+++ b/technic/technic_chests/init.lua
@@ -0,0 +1,18 @@
+-- Minetest 0.4.6 mod: technic_chests
+-- namespace: technic
+-- (c) 2012-2013 by RealBadAngel <mk@realbadangel.pl>
+
+local modpath = minetest.get_modpath("technic_chests")
+
+technic = rawget(_G, "technic") or {}
+technic.chests = {}
+
+dofile(modpath.."/common.lua")
+dofile(modpath.."/register.lua")
+dofile(modpath.."/wooden_chest.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")
+
diff --git a/technic/technic_chests/iron_chest.lua b/technic/technic_chests/iron_chest.lua
new file mode 100644
index 0000000..90434bb
--- /dev/null
+++ b/technic/technic_chests/iron_chest.lua
@@ -0,0 +1,53 @@
+local cast_iron_ingot
+if minetest.get_modpath("technic_worldgen") then
+ cast_iron_ingot = "technic:cast_iron_ingot"
+else
+ cast_iron_ingot = "default:steel_ingot"
+end
+
+minetest.register_craft({
+ output = 'technic:iron_chest 1',
+ recipe = {
+ {cast_iron_ingot,cast_iron_ingot,cast_iron_ingot},
+ {cast_iron_ingot,'default:chest',cast_iron_ingot},
+ {cast_iron_ingot,cast_iron_ingot,cast_iron_ingot},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:iron_locked_chest 1',
+ recipe = {
+ {cast_iron_ingot,cast_iron_ingot,cast_iron_ingot},
+ {cast_iron_ingot,'default:chest_locked',cast_iron_ingot},
+ {cast_iron_ingot,cast_iron_ingot,cast_iron_ingot},
+ }
+})
+
+minetest.register_craft({
+ output = 'technic:iron_locked_chest 1',
+ recipe = {
+ {'default:steel_ingot'},
+ {'technic:iron_chest'},
+ }
+})
+
+technic.chests:register("Iron", {
+ width = 9,
+ height = 5,
+ sort = true,
+ autosort = false,
+ infotext = false,
+ color = false,
+ locked = false,
+})
+
+technic.chests:register("Iron", {
+ width = 9,
+ height = 5,
+ sort = true,
+ autosort = false,
+ infotext = false,
+ color = false,
+ locked = true,
+})
+
diff --git a/technic/technic_chests/locale/de.txt b/technic/technic_chests/locale/de.txt
new file mode 100644
index 0000000..e22d2c2
--- /dev/null
+++ b/technic/technic_chests/locale/de.txt
@@ -0,0 +1,41 @@
+# German Translation for technic_chests
+# Deutsche Übersetzung von technic_chests
+# by Xanthin
+
+%s Chest = %struhe
+%s Locked Chest = Verschlossene %struhe
+%s Locked Chest (owned by %s) = Verschlossene %struhe (gehoert %s)
+Color Filter: %s = Farbfilter: %s
+Edit chest description: = Bearbeite die Beschreibung
+
+# Colors
+Black = Schwarz
+Blue = Blau
+Brown = Braun
+Cyan = Tuerkis
+Dark Green = Dunkelgruen
+Dark Grey = Dunkelgrau
+Green = Gruen
+Grey = Grau
+Magenta = Magenta
+Orange = Orange
+Pink = Rosa
+Red = Rot
+Violet = Violett
+White = Weiss
+Yellow = Gelb
+None = Farblos
+
+# Materials
+Copper = Kupfer
+Gold = Gold
+Iron = Eisen
+Mithril = Mithril
+Silver = Silber
+Wooden = Holz
+
+# Sorting
+Sort =
+Auto-sort is %s =
+Off =
+On =
diff --git a/technic/technic_chests/locale/template.txt b/technic/technic_chests/locale/template.txt
new file mode 100644
index 0000000..4d422b2
--- /dev/null
+++ b/technic/technic_chests/locale/template.txt
@@ -0,0 +1,39 @@
+# technic_chests translation template
+
+%s Chest =
+%s Locked Chest =
+%s Locked Chest (owned by %s) =
+Color Filter: %s =
+Edit chest description: =
+
+# Colors
+Black =
+Blue =
+Brown =
+Cyan =
+Dark Green =
+Dark Grey =
+Green =
+Grey =
+Magenta =
+Orange =
+Pink =
+Red =
+Violet =
+White =
+Yellow =
+None =
+
+# Materials
+Copper =
+Gold =
+Iron =
+Mithril =
+Silver =
+Wooden =
+
+# Sorting
+Sort =
+Auto-sort is %s =
+Off =
+On =
diff --git a/technic/technic_chests/locale/tr.txt b/technic/technic_chests/locale/tr.txt
new file mode 100644
index 0000000..6bef5be
--- /dev/null
+++ b/technic/technic_chests/locale/tr.txt
@@ -0,0 +1,41 @@
+# Turkish translation
+# mahmutelmas06@hotmail.com
+# Türkçe çeviri
+
+%s Chest = %s Sandık
+%s Locked Chest = %s Kilitli sandık
+%s Locked Chest (owned by %s) = %s Kilitli sandık (Sahibi %s)
+Color Filter: %s = Renk süzgeci: %s
+Edit chest description: = Sandık bilgilerini düzenle
+
+# Colors - Renkler
+Black = Siyah
+Blue = Mavi
+Brown = Kahverengi
+Cyan = Cam göbeği
+Dark Green = Koyu yeşil
+Dark Grey = Koyu gri
+Green = Yeşil
+Grey = Gri
+Magenta = Mor
+Orange = Turuncu
+Pink = Pembe
+Red = Kırmızı
+Violet = Koyu mor
+White = Beyaz
+Yellow = Sarı
+None = Hiç
+
+# Materials - Metaryeller
+Copper = Bakır
+Gold = Altın
+Iron = Demir
+Mithril = Mithril
+Silver = Gümüş
+Wooden = Ahşap
+
+# Sorting - Sıralama
+Sort = Sırala
+Auto-sort is %s = Otomatik sıralama %s
+Off = Kapalı
+On = Açık
diff --git a/technic/technic_chests/mithril_chest.lua b/technic/technic_chests/mithril_chest.lua
new file mode 100644
index 0000000..909ff9e
--- /dev/null
+++ b/technic/technic_chests/mithril_chest.lua
@@ -0,0 +1,48 @@
+if minetest.get_modpath("moreores") then
+ 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'},
+ }
+ })
+end
+
+minetest.register_craft({
+ output = 'technic:mithril_locked_chest 1',
+ recipe = {
+ {'default:steel_ingot'},
+ {'technic:mithril_chest'},
+ }
+})
+
+technic.chests:register("Mithril", {
+ width = 15,
+ height = 6,
+ sort = true,
+ autosort = true,
+ infotext = false,
+ color = false,
+ locked = false,
+})
+
+technic.chests:register("Mithril", {
+ width = 15,
+ height = 6,
+ sort = true,
+ autosort = true,
+ infotext = false,
+ color = false,
+ locked = true,
+})
+
diff --git a/technic/technic_chests/register.lua b/technic/technic_chests/register.lua
new file mode 100644
index 0000000..25e4cde
--- /dev/null
+++ b/technic/technic_chests/register.lua
@@ -0,0 +1,303 @@
+local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
+
+local pipeworks = rawget(_G, "pipeworks")
+if not minetest.get_modpath("pipeworks") then
+ -- Pipeworks is not installed. Simulate using a dummy table...
+ pipeworks = {}
+ local pipeworks_meta = {}
+ setmetatable(pipeworks, pipeworks_meta)
+ local dummy = function()
+ end
+ pipeworks_meta.__index = function(table, key)
+ print("[technic_chests] WARNING: variable or method '"..key.."' not present in dummy pipeworks table - assuming it is a method...")
+ pipeworks[key] = dummy
+ return dummy
+ end
+ pipeworks.after_place = dummy
+ pipeworks.after_dig = dummy
+end
+
+local chest_mark_colors = {
+ {"black", S("Black")},
+ {"blue", S("Blue")},
+ {"brown", S("Brown")},
+ {"cyan", S("Cyan")},
+ {"dark_green", S("Dark Green")},
+ {"dark_grey", S("Dark Grey")},
+ {"green", S("Green")},
+ {"grey", S("Grey")},
+ {"magenta", S("Magenta")},
+ {"orange", S("Orange")},
+ {"pink", S("Pink")},
+ {"red", S("Red")},
+ {"violet", S("Violet")},
+ {"white", S("White")},
+ {"yellow", S("Yellow")},
+}
+
+
+local function colorid_to_postfix(id)
+ return chest_mark_colors[id] and "_"..chest_mark_colors[id][1] or ""
+end
+
+
+local function get_color_buttons(coleft, lotop)
+ local buttons_string = ""
+ for y = 0, 3 do
+ for x = 0, 3 do
+ local file_name = "technic_colorbutton"..(y * 4 + x)..".png"
+ buttons_string = buttons_string.."image_button["
+ ..(coleft + 0.1 + x * 0.7)..","..(lotop + 0.1 + y * 0.7)
+ ..";0.8,0.8;"..file_name..";color_button"
+ ..(y * 4 + x + 1)..";]"
+ end
+ end
+ return buttons_string
+end
+
+
+local function check_color_buttons(pos, meta, chest_name, fields)
+ for i = 1, 16 do
+ if fields["color_button"..i] then
+ local node = minetest.get_node(pos)
+ node.name = chest_name..colorid_to_postfix(i)
+ minetest.swap_node(pos, node)
+ meta:set_string("color", i)
+ return
+ end
+ end
+end
+
+local function set_formspec(pos, data, page)
+ local meta = minetest.get_meta(pos)
+ local node = minetest.get_node(pos)
+ local formspec = data.base_formspec
+ if data.autosort then
+ local status = meta:get_int("autosort")
+ formspec = formspec.."button["..(data.hileft+2)..","..(data.height+1.1)..";3,0.8;autosort_to_"..(1-status)..";"..S("Auto-sort is %s"):format(status == 1 and S("On") or S("Off")).."]"
+ end
+ if data.infotext then
+ local formspec_infotext = minetest.formspec_escape(meta:get_string("infotext"))
+ if page == "main" then
+ formspec = formspec.."image_button["..(data.hileft+2.1)..",0.1;0.8,0.8;"
+ .."technic_pencil_icon.png;edit_infotext;]"
+ .."label["..(data.hileft+3)..",0;"..formspec_infotext.."]"
+ elseif page == "edit_infotext" then
+ formspec = formspec.."image_button["..(data.hileft+2.1)..",0.1;0.8,0.8;"
+ .."technic_checkmark_icon.png;save_infotext;]"
+ .."field["..(data.hileft+3.3)..",0.2;4.8,1;"
+ .."infotext_box;"..S("Edit chest description:")..";"
+ ..formspec_infotext.."]"
+ end
+ end
+ if data.color then
+ local colorID = meta:get_int("color")
+ local colorName
+ if chest_mark_colors[colorID] then
+ colorName = chest_mark_colors[colorID][2]
+ else
+ colorName = S("None")
+ end
+ formspec = formspec.."label["..(data.coleft+0.2)..","..(data.lotop+3)..";"..S("Color Filter: %s"):format(colorName).."]"
+ end
+ meta:set_string("formspec", formspec)
+end
+
+local function sort_inventory(inv)
+ local inlist = inv:get_list("main")
+ local typecnt = {}
+ local typekeys = {}
+ for _, st in ipairs(inlist) do
+ if not st:is_empty() then
+ local n = st:get_name()
+ local w = st:get_wear()
+ local m = st:get_metadata()
+ local k = string.format("%s %05d %s", n, w, m)
+ if not typecnt[k] then
+ typecnt[k] = {
+ name = n,
+ wear = w,
+ metadata = m,
+ stack_max = st:get_stack_max(),
+ count = 0,
+ }
+ table.insert(typekeys, k)
+ end
+ typecnt[k].count = typecnt[k].count + st:get_count()
+ end
+ end
+ table.sort(typekeys)
+ local outlist = {}
+ for _, k in ipairs(typekeys) do
+ local tc = typecnt[k]
+ while tc.count > 0 do
+ local c = math.min(tc.count, tc.stack_max)
+ table.insert(outlist, ItemStack({
+ name = tc.name,
+ wear = tc.wear,
+ metadata = tc.metadata,
+ count = c,
+ }))
+ tc.count = tc.count - c
+ end
+ end
+ if #outlist > #inlist then return end
+ while #outlist < #inlist do
+ table.insert(outlist, ItemStack(nil))
+ end
+ inv:set_list("main", outlist)
+end
+
+local function get_receive_fields(name, data)
+ local lname = name:lower()
+ return function(pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ local page = "main"
+ if fields.sort or (data.autosort and fields.quit and meta:get_int("autosort") == 1) then
+ sort_inventory(meta:get_inventory())
+ end
+ if fields.edit_infotext then
+ page = "edit_infotext"
+ end
+ if fields.autosort_to_1 then meta:set_int("autosort", 1) end
+ if fields.autosort_to_0 then meta:set_int("autosort", 0) end
+ if fields.infotext_box then
+ meta:set_string("infotext", fields.infotext_box)
+ end
+ if data.color then
+ -- This sets the node
+ local nn = "technic:"..lname..(data.locked and "_locked" or "").."_chest"
+ check_color_buttons(pos, meta, nn, fields)
+ end
+ meta:get_inventory():set_size("main", data.width * data.height)
+ set_formspec(pos, data, page)
+ end
+end
+
+
+function technic.chests:definition(name, data)
+ local lname = name:lower()
+ name = S(name)
+ local d = {}
+ for k, v in pairs(data) do d[k] = v end
+ data = d
+
+ data.lowidth = 8
+ data.ovwidth = math.max(data.lowidth, data.width)
+ data.hileft = (data.ovwidth - data.width) / 2
+ data.loleft = (data.ovwidth - data.lowidth) / 2
+ if data.color then
+ if data.lowidth + 3 <= data.ovwidth then
+ data.coleft = data.ovwidth - 3
+ if data.loleft + data.lowidth > data.coleft then
+ data.loleft = data.coleft - data.lowidth
+ end
+ else
+ data.loleft = 0
+ data.coleft = data.lowidth
+ data.ovwidth = data.lowidth + 3
+ end
+ end
+ data.lotop = data.height + 2
+ data.ovheight = data.lotop + 4
+
+ local locked_after_place = nil
+ local front = {"technic_"..lname.."_chest_front.png"}
+ data.base_formspec = "size["..data.ovwidth..","..data.ovheight.."]"..
+ "label[0,0;"..S("%s Chest"):format(name).."]"..
+ "list[context;main;"..data.hileft..",1;"..data.width..","..data.height..";]"..
+ "list[current_player;main;"..data.loleft..","..data.lotop..";8,4;]"..
+ "background[-0.19,-0.25;"..(data.ovwidth+0.4)..","..(data.ovheight+0.75)..";technic_chest_form_bg.png]"..
+ "background["..data.hileft..",1;"..data.width..","..data.height..";technic_"..lname.."_chest_inventory.png]"..
+ "background["..data.loleft..","..data.lotop..";8,4;technic_main_inventory.png]"..
+ "listring[]"
+ if data.sort then
+ data.base_formspec = data.base_formspec.."button["..data.hileft..","..(data.height+1.1)..";1,0.8;sort;"..S("Sort").."]"
+ end
+ if data.color then
+ data.base_formspec = data.base_formspec..get_color_buttons(data.coleft, data.lotop)
+ end
+
+ if data.locked then
+ locked_after_place = function(pos, placer)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("owner", placer:get_player_name() or "")
+ meta:set_string("infotext",
+ S("%s Locked Chest (owned by %s)")
+ :format(name, meta:get_string("owner")))
+ pipeworks.after_place(pos)
+ end
+ table.insert(front, "technic_"..lname.."_chest_lock_overlay.png")
+ else
+ locked_after_place = pipeworks.after_place
+ end
+
+ local desc
+ if data.locked then
+ desc = S("%s Locked Chest"):format(name)
+ else
+ desc = S("%s Chest"):format(name)
+ end
+
+ local def = {
+ description = desc,
+ tiles = {"technic_"..lname.."_chest_top.png", "technic_"..lname.."_chest_top.png",
+ "technic_"..lname.."_chest_side.png", "technic_"..lname.."_chest_side.png",
+ "technic_"..lname.."_chest_side.png", table.concat(front, "^")},
+ paramtype2 = "facedir",
+ groups = self.groups,
+ tube = self.tube,
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ after_place_node = locked_after_place,
+ after_dig_node = pipeworks.after_dig,
+
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("%s Chest"):format(name))
+ set_formspec(pos, data, "main")
+ local inv = meta:get_inventory()
+ inv:set_size("main", data.width * data.height)
+ end,
+ can_dig = self.can_dig,
+ on_receive_fields = get_receive_fields(name, data),
+ on_metadata_inventory_move = self.on_inv_move,
+ on_metadata_inventory_put = self.on_inv_put,
+ on_metadata_inventory_take = self.on_inv_take,
+ }
+ if data.locked then
+ def.allow_metadata_inventory_move = self.inv_move
+ def.allow_metadata_inventory_put = self.inv_put
+ def.allow_metadata_inventory_take = self.inv_take
+ end
+ return def
+end
+
+function technic.chests:register(name, data)
+ local def = technic.chests:definition(name, data)
+
+ local nn = "technic:"..name:lower()..(data.locked and "_locked" or "").."_chest"
+ minetest.register_node(":"..nn, def)
+
+ if data.color then
+ local mk_front
+ if string.find(def.tiles[6], "%^") then
+ mk_front = function (overlay) return def.tiles[6]:gsub("%^", "^"..overlay.."^") end
+ else
+ mk_front = function (overlay) return def.tiles[6].."^"..overlay end
+ end
+ for i = 1, 15 do
+ local postfix = colorid_to_postfix(i)
+ local colordef = {}
+ for k, v in pairs(def) do
+ colordef[k] = v
+ end
+ colordef.drop = nn
+ colordef.groups = self.groups_noinv
+ colordef.tiles = { def.tiles[1], def.tiles[2], def.tiles[3], def.tiles[4], def.tiles[5], mk_front("technic_chest_overlay"..postfix..".png") }
+ minetest.register_node(":"..nn..postfix, colordef)
+ end
+ end
+
+end
+
diff --git a/technic/technic_chests/silver_chest.lua b/technic/technic_chests/silver_chest.lua
new file mode 100644
index 0000000..c615304
--- /dev/null
+++ b/technic/technic_chests/silver_chest.lua
@@ -0,0 +1,48 @@
+if minetest.get_modpath("moreores") then
+ minetest.register_craft({
+ output = 'technic:silver_chest',
+ 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',
+ 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'},
+ }
+ })
+end
+
+minetest.register_craft({
+ output = 'technic:silver_locked_chest',
+ recipe = {
+ {'default:steel_ingot'},
+ {'technic:silver_chest'},
+ }
+})
+
+technic.chests:register("Silver", {
+ width = 12,
+ height = 6,
+ sort = true,
+ autosort = true,
+ infotext = true,
+ color = false,
+ locked = false,
+})
+
+technic.chests:register("Silver", {
+ width = 12,
+ height = 6,
+ sort = true,
+ autosort = true,
+ infotext = true,
+ color = false,
+ locked = true,
+})
+
diff --git a/technic/technic_chests/textures/technic_checkmark_icon.png b/technic/technic_chests/textures/technic_checkmark_icon.png
new file mode 100644
index 0000000..369d294
--- /dev/null
+++ b/technic/technic_chests/textures/technic_checkmark_icon.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_form_bg.png b/technic/technic_chests/textures/technic_chest_form_bg.png
new file mode 100644
index 0000000..37683f0
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_form_bg.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_black.png b/technic/technic_chests/textures/technic_chest_overlay_black.png
new file mode 100644
index 0000000..fa25304
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_black.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_blue.png b/technic/technic_chests/textures/technic_chest_overlay_blue.png
new file mode 100644
index 0000000..512cd4f
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_blue.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_brown.png b/technic/technic_chests/textures/technic_chest_overlay_brown.png
new file mode 100644
index 0000000..64c1d55
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_brown.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_cyan.png b/technic/technic_chests/textures/technic_chest_overlay_cyan.png
new file mode 100644
index 0000000..46732f4
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_cyan.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_dark_green.png b/technic/technic_chests/textures/technic_chest_overlay_dark_green.png
new file mode 100644
index 0000000..941236b
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_dark_green.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_dark_grey.png b/technic/technic_chests/textures/technic_chest_overlay_dark_grey.png
new file mode 100644
index 0000000..e6b8f77
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_dark_grey.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_green.png b/technic/technic_chests/textures/technic_chest_overlay_green.png
new file mode 100644
index 0000000..4b9543f
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_green.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_grey.png b/technic/technic_chests/textures/technic_chest_overlay_grey.png
new file mode 100644
index 0000000..8a1c9f0
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_grey.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_magenta.png b/technic/technic_chests/textures/technic_chest_overlay_magenta.png
new file mode 100644
index 0000000..75b220d
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_magenta.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_orange.png b/technic/technic_chests/textures/technic_chest_overlay_orange.png
new file mode 100644
index 0000000..02c095d
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_orange.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_pink.png b/technic/technic_chests/textures/technic_chest_overlay_pink.png
new file mode 100644
index 0000000..0b6ccb4
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_pink.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_red.png b/technic/technic_chests/textures/technic_chest_overlay_red.png
new file mode 100644
index 0000000..4b44642
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_red.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_violet.png b/technic/technic_chests/textures/technic_chest_overlay_violet.png
new file mode 100644
index 0000000..89471f9
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_violet.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_white.png b/technic/technic_chests/textures/technic_chest_overlay_white.png
new file mode 100644
index 0000000..b49e253
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_white.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_chest_overlay_yellow.png b/technic/technic_chests/textures/technic_chest_overlay_yellow.png
new file mode 100644
index 0000000..d563257
--- /dev/null
+++ b/technic/technic_chests/textures/technic_chest_overlay_yellow.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton0.png b/technic/technic_chests/textures/technic_colorbutton0.png
new file mode 100644
index 0000000..35b7db2
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton0.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton1.png b/technic/technic_chests/textures/technic_colorbutton1.png
new file mode 100644
index 0000000..cbf095d
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton1.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton10.png b/technic/technic_chests/textures/technic_colorbutton10.png
new file mode 100644
index 0000000..8dfc5f0
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton10.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton11.png b/technic/technic_chests/textures/technic_colorbutton11.png
new file mode 100644
index 0000000..3b279e0
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton11.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton12.png b/technic/technic_chests/textures/technic_colorbutton12.png
new file mode 100644
index 0000000..a387b5f
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton12.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton13.png b/technic/technic_chests/textures/technic_colorbutton13.png
new file mode 100644
index 0000000..b1e7790
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton13.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton14.png b/technic/technic_chests/textures/technic_colorbutton14.png
new file mode 100644
index 0000000..c4ad486
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton14.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton15.png b/technic/technic_chests/textures/technic_colorbutton15.png
new file mode 100644
index 0000000..b7060d6
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton15.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton2.png b/technic/technic_chests/textures/technic_colorbutton2.png
new file mode 100644
index 0000000..caf1fc6
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton2.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton3.png b/technic/technic_chests/textures/technic_colorbutton3.png
new file mode 100644
index 0000000..6ac79a3
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton3.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton4.png b/technic/technic_chests/textures/technic_colorbutton4.png
new file mode 100644
index 0000000..dc43592
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton4.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton5.png b/technic/technic_chests/textures/technic_colorbutton5.png
new file mode 100644
index 0000000..98b8c67
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton5.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton6.png b/technic/technic_chests/textures/technic_colorbutton6.png
new file mode 100644
index 0000000..66478bc
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton6.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton7.png b/technic/technic_chests/textures/technic_colorbutton7.png
new file mode 100644
index 0000000..85f6b93
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton7.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton8.png b/technic/technic_chests/textures/technic_colorbutton8.png
new file mode 100644
index 0000000..868c35d
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton8.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_colorbutton9.png b/technic/technic_chests/textures/technic_colorbutton9.png
new file mode 100644
index 0000000..50eac0b
--- /dev/null
+++ b/technic/technic_chests/textures/technic_colorbutton9.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_copper_chest_front.png b/technic/technic_chests/textures/technic_copper_chest_front.png
new file mode 100644
index 0000000..add51e8
--- /dev/null
+++ b/technic/technic_chests/textures/technic_copper_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_copper_chest_inventory.png b/technic/technic_chests/textures/technic_copper_chest_inventory.png
new file mode 100644
index 0000000..70da510
--- /dev/null
+++ b/technic/technic_chests/textures/technic_copper_chest_inventory.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_copper_chest_lock_overlay.png b/technic/technic_chests/textures/technic_copper_chest_lock_overlay.png
new file mode 100644
index 0000000..49f7f2a
--- /dev/null
+++ b/technic/technic_chests/textures/technic_copper_chest_lock_overlay.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_copper_chest_side.png b/technic/technic_chests/textures/technic_copper_chest_side.png
new file mode 100644
index 0000000..2231cce
--- /dev/null
+++ b/technic/technic_chests/textures/technic_copper_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_copper_chest_top.png b/technic/technic_chests/textures/technic_copper_chest_top.png
new file mode 100644
index 0000000..69f1078
--- /dev/null
+++ b/technic/technic_chests/textures/technic_copper_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_form_bg.png b/technic/technic_chests/textures/technic_form_bg.png
new file mode 100644
index 0000000..37683f0
--- /dev/null
+++ b/technic/technic_chests/textures/technic_form_bg.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_gold_chest_front.png b/technic/technic_chests/textures/technic_gold_chest_front.png
new file mode 100644
index 0000000..27036d7
--- /dev/null
+++ b/technic/technic_chests/textures/technic_gold_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_gold_chest_inventory.png b/technic/technic_chests/textures/technic_gold_chest_inventory.png
new file mode 100644
index 0000000..d4aa8b3
--- /dev/null
+++ b/technic/technic_chests/textures/technic_gold_chest_inventory.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_gold_chest_lock_overlay.png b/technic/technic_chests/textures/technic_gold_chest_lock_overlay.png
new file mode 100644
index 0000000..51dea71
--- /dev/null
+++ b/technic/technic_chests/textures/technic_gold_chest_lock_overlay.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_gold_chest_side.png b/technic/technic_chests/textures/technic_gold_chest_side.png
new file mode 100644
index 0000000..9a0de39
--- /dev/null
+++ b/technic/technic_chests/textures/technic_gold_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_gold_chest_top.png b/technic/technic_chests/textures/technic_gold_chest_top.png
new file mode 100644
index 0000000..abfc081
--- /dev/null
+++ b/technic/technic_chests/textures/technic_gold_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_iron_chest_front.png b/technic/technic_chests/textures/technic_iron_chest_front.png
new file mode 100644
index 0000000..8c00473
--- /dev/null
+++ b/technic/technic_chests/textures/technic_iron_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_iron_chest_inventory.png b/technic/technic_chests/textures/technic_iron_chest_inventory.png
new file mode 100644
index 0000000..a33967b
--- /dev/null
+++ b/technic/technic_chests/textures/technic_iron_chest_inventory.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_iron_chest_lock_overlay.png b/technic/technic_chests/textures/technic_iron_chest_lock_overlay.png
new file mode 100644
index 0000000..1750b82
--- /dev/null
+++ b/technic/technic_chests/textures/technic_iron_chest_lock_overlay.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_iron_chest_side.png b/technic/technic_chests/textures/technic_iron_chest_side.png
new file mode 100644
index 0000000..7233688
--- /dev/null
+++ b/technic/technic_chests/textures/technic_iron_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_iron_chest_top.png b/technic/technic_chests/textures/technic_iron_chest_top.png
new file mode 100644
index 0000000..48d2437
--- /dev/null
+++ b/technic/technic_chests/textures/technic_iron_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_main_inventory.png b/technic/technic_chests/textures/technic_main_inventory.png
new file mode 100644
index 0000000..b65dabb
--- /dev/null
+++ b/technic/technic_chests/textures/technic_main_inventory.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_mithril_chest_front.png b/technic/technic_chests/textures/technic_mithril_chest_front.png
new file mode 100644
index 0000000..f0e0c23
--- /dev/null
+++ b/technic/technic_chests/textures/technic_mithril_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_mithril_chest_inventory.png b/technic/technic_chests/textures/technic_mithril_chest_inventory.png
new file mode 100644
index 0000000..d4aa8b3
--- /dev/null
+++ b/technic/technic_chests/textures/technic_mithril_chest_inventory.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_mithril_chest_lock_overlay.png b/technic/technic_chests/textures/technic_mithril_chest_lock_overlay.png
new file mode 100644
index 0000000..d227c51
--- /dev/null
+++ b/technic/technic_chests/textures/technic_mithril_chest_lock_overlay.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_mithril_chest_side.png b/technic/technic_chests/textures/technic_mithril_chest_side.png
new file mode 100644
index 0000000..1c2c3a7
--- /dev/null
+++ b/technic/technic_chests/textures/technic_mithril_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_mithril_chest_top.png b/technic/technic_chests/textures/technic_mithril_chest_top.png
new file mode 100644
index 0000000..e196baf
--- /dev/null
+++ b/technic/technic_chests/textures/technic_mithril_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_pencil_icon.png b/technic/technic_chests/textures/technic_pencil_icon.png
new file mode 100644
index 0000000..8079ede
--- /dev/null
+++ b/technic/technic_chests/textures/technic_pencil_icon.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_silver_chest_front.png b/technic/technic_chests/textures/technic_silver_chest_front.png
new file mode 100644
index 0000000..5ae5831
--- /dev/null
+++ b/technic/technic_chests/textures/technic_silver_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_silver_chest_inventory.png b/technic/technic_chests/textures/technic_silver_chest_inventory.png
new file mode 100644
index 0000000..b2fe835
--- /dev/null
+++ b/technic/technic_chests/textures/technic_silver_chest_inventory.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_silver_chest_lock_overlay.png b/technic/technic_chests/textures/technic_silver_chest_lock_overlay.png
new file mode 100644
index 0000000..cb1bdb0
--- /dev/null
+++ b/technic/technic_chests/textures/technic_silver_chest_lock_overlay.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_silver_chest_side.png b/technic/technic_chests/textures/technic_silver_chest_side.png
new file mode 100644
index 0000000..4b4ce54
--- /dev/null
+++ b/technic/technic_chests/textures/technic_silver_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_silver_chest_top.png b/technic/technic_chests/textures/technic_silver_chest_top.png
new file mode 100644
index 0000000..79196d6
--- /dev/null
+++ b/technic/technic_chests/textures/technic_silver_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/technic_wooden_chest_inventory.png b/technic/technic_chests/textures/technic_wooden_chest_inventory.png
new file mode 100644
index 0000000..5ffbc12
--- /dev/null
+++ b/technic/technic_chests/textures/technic_wooden_chest_inventory.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_copper_chest_front.png b/technic/technic_chests/textures/x32/technic_copper_chest_front.png
new file mode 100644
index 0000000..1769435
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_copper_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_copper_chest_side.png b/technic/technic_chests/textures/x32/technic_copper_chest_side.png
new file mode 100644
index 0000000..2c7943f
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_copper_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_copper_chest_top.png b/technic/technic_chests/textures/x32/technic_copper_chest_top.png
new file mode 100644
index 0000000..2ab8104
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_copper_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_gold_chest_front.png b/technic/technic_chests/textures/x32/technic_gold_chest_front.png
new file mode 100644
index 0000000..9bc9615
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_gold_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_gold_chest_side.png b/technic/technic_chests/textures/x32/technic_gold_chest_side.png
new file mode 100644
index 0000000..5d5ad0f
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_gold_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_gold_chest_top.png b/technic/technic_chests/textures/x32/technic_gold_chest_top.png
new file mode 100644
index 0000000..f9c8fec
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_gold_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_iron_chest_front.png b/technic/technic_chests/textures/x32/technic_iron_chest_front.png
new file mode 100644
index 0000000..79d5b49
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_iron_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_iron_chest_side.png b/technic/technic_chests/textures/x32/technic_iron_chest_side.png
new file mode 100644
index 0000000..e12daa5
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_iron_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_iron_chest_top.png b/technic/technic_chests/textures/x32/technic_iron_chest_top.png
new file mode 100644
index 0000000..da1ab7b
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_iron_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_mithril_chest_front.png b/technic/technic_chests/textures/x32/technic_mithril_chest_front.png
new file mode 100644
index 0000000..9f7ca7e
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_mithril_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_mithril_chest_side.png b/technic/technic_chests/textures/x32/technic_mithril_chest_side.png
new file mode 100644
index 0000000..0763511
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_mithril_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_mithril_chest_top.png b/technic/technic_chests/textures/x32/technic_mithril_chest_top.png
new file mode 100644
index 0000000..2429576
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_mithril_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_silver_chest_front.png b/technic/technic_chests/textures/x32/technic_silver_chest_front.png
new file mode 100644
index 0000000..fe5ce2c
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_silver_chest_front.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_silver_chest_side.png b/technic/technic_chests/textures/x32/technic_silver_chest_side.png
new file mode 100644
index 0000000..3a2ed4a
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_silver_chest_side.png
Binary files differ
diff --git a/technic/technic_chests/textures/x32/technic_silver_chest_top.png b/technic/technic_chests/textures/x32/technic_silver_chest_top.png
new file mode 100644
index 0000000..353a11c
--- /dev/null
+++ b/technic/technic_chests/textures/x32/technic_silver_chest_top.png
Binary files differ
diff --git a/technic/technic_chests/wooden_chest.lua b/technic/technic_chests/wooden_chest.lua
new file mode 100644
index 0000000..0fad12c
--- /dev/null
+++ b/technic/technic_chests/wooden_chest.lua
@@ -0,0 +1,51 @@
+local udef = technic.chests:definition("Wooden", {
+ width = 8,
+ height = 4,
+ sort = false,
+ autosort = false,
+ infotext = false,
+ color = false,
+ locked = false,
+})
+local uudef = {
+ groups = udef.groups,
+ tube = udef.tube,
+ on_construct = udef.on_construct,
+ can_dig = udef.can_dig,
+ on_receive_fields = udef.on_receive_fields,
+ on_metadata_inventory_move = udef.on_metadata_inventory_move,
+ on_metadata_inventory_put = udef.on_metadata_inventory_put,
+ on_metadata_inventory_take = udef.on_metadata_inventory_take,
+}
+if minetest.registered_nodes["default:chest"].description == "Chest" then
+ uudef.description = udef.description
+end
+minetest.override_item("default:chest", uudef)
+
+local ldef = technic.chests:definition("Wooden", {
+ width = 8,
+ height = 4,
+ sort = false,
+ autosort = false,
+ infotext = false,
+ color = false,
+ locked = true,
+})
+local lldef = {
+ groups = ldef.groups,
+ tube = ldef.tube,
+ after_place_node = ldef.after_place_node,
+ on_construct = ldef.on_construct,
+ can_dig = ldef.can_dig,
+ on_receive_fields = ldef.on_receive_fields,
+ allow_metadata_inventory_move = ldef.allow_metadata_inventory_move,
+ allow_metadata_inventory_put = ldef.allow_metadata_inventory_put,
+ allow_metadata_inventory_take = ldef.allow_metadata_inventory_take,
+ on_metadata_inventory_move = ldef.on_metadata_inventory_move,
+ on_metadata_inventory_put = ldef.on_metadata_inventory_put,
+ on_metadata_inventory_take = ldef.on_metadata_inventory_take,
+}
+if minetest.registered_nodes["default:chest_locked"].description == "Locked Chest" then
+ lldef.description = ldef.description
+end
+minetest.override_item("default:chest_locked", lldef)
diff --git a/technic/technic_worldgen/config.lua b/technic/technic_worldgen/config.lua
new file mode 100644
index 0000000..4ac748c
--- /dev/null
+++ b/technic/technic_worldgen/config.lua
@@ -0,0 +1,15 @@
+technic.config = technic.config or Settings(minetest.get_worldpath().."/technic.conf")
+
+local conf_table = technic.config:to_table()
+
+local defaults = {
+ enable_granite_generation = "true",
+ enable_marble_generation = "true",
+ enable_rubber_tree_generation = "true",
+}
+
+for k, v in pairs(defaults) do
+ if conf_table[k] == nil then
+ technic.config:set(k, v)
+ end
+end
diff --git a/technic/technic_worldgen/crafts.lua b/technic/technic_worldgen/crafts.lua
new file mode 100644
index 0000000..fba9df9
--- /dev/null
+++ b/technic/technic_worldgen/crafts.lua
@@ -0,0 +1,198 @@
+
+local S = technic.worldgen.gettext
+
+minetest.register_craftitem(":technic:uranium_lump", {
+ description = S("Uranium Lump"),
+ inventory_image = "technic_uranium_lump.png",
+})
+minetest.register_alias("technic:uranium", "technic:uranium_lump")
+
+minetest.register_craftitem(":technic:uranium_ingot", {
+ description = S("Uranium Ingot"),
+ inventory_image = "technic_uranium_ingot.png",
+ groups = {uranium_ingot=1},
+})
+
+minetest.register_craftitem(":technic:chromium_lump", {
+ description = S("Chromium Lump"),
+ inventory_image = "technic_chromium_lump.png",
+})
+
+minetest.register_craftitem(":technic:chromium_ingot", {
+ description = S("Chromium Ingot"),
+ inventory_image = "technic_chromium_ingot.png",
+})
+
+minetest.register_craftitem(":technic:zinc_lump", {
+ description = S("Zinc Lump"),
+ inventory_image = "technic_zinc_lump.png",
+})
+
+minetest.register_craftitem(":technic:zinc_ingot", {
+ description = S("Zinc Ingot"),
+ inventory_image = "technic_zinc_ingot.png",
+})
+
+minetest.register_craftitem(":technic:lead_lump", {
+ description = S("Lead Lump"),
+ inventory_image = "technic_lead_lump.png",
+})
+
+minetest.register_craftitem(":technic:lead_ingot", {
+ description = S("Lead Ingot"),
+ inventory_image = "technic_lead_ingot.png",
+})
+
+minetest.register_craftitem(":technic:sulfur_lump", {
+ description = S("Sulfur Lump"),
+ inventory_image = "technic_sulfur_lump.png",
+})
+
+minetest.register_craftitem(":technic:brass_ingot", {
+ description = S("Brass Ingot"),
+ inventory_image = "technic_brass_ingot.png",
+})
+
+minetest.register_alias("technic:wrought_iron_ingot", "default:steel_ingot")
+
+minetest.override_item("default:steel_ingot", {
+ description = S("Wrought Iron Ingot"),
+ inventory_image = "technic_wrought_iron_ingot.png",
+})
+
+minetest.register_craftitem(":technic:cast_iron_ingot", {
+ description = S("Cast Iron Ingot"),
+ inventory_image = "technic_cast_iron_ingot.png",
+})
+
+minetest.register_craftitem(":technic:carbon_steel_ingot", {
+ description = S("Carbon Steel Ingot"),
+ inventory_image = "technic_carbon_steel_ingot.png",
+})
+
+minetest.register_craftitem(":technic:stainless_steel_ingot", {
+ description = S("Stainless Steel Ingot"),
+ inventory_image = "technic_stainless_steel_ingot.png",
+})
+
+local function register_block(block, ingot)
+ minetest.register_craft({
+ output = block,
+ recipe = {
+ {ingot, ingot, ingot},
+ {ingot, ingot, ingot},
+ {ingot, ingot, ingot},
+ }
+ })
+
+ minetest.register_craft({
+ output = ingot.." 9",
+ recipe = {
+ {block}
+ }
+ })
+end
+
+register_block("technic:uranium_block", "technic:uranium_ingot")
+register_block("technic:chromium_block", "technic:chromium_ingot")
+register_block("technic:zinc_block", "technic:zinc_ingot")
+register_block("technic:lead_block", "technic:lead_ingot")
+register_block("technic:brass_block", "technic:brass_ingot")
+register_block("technic:cast_iron_block", "technic:cast_iron_ingot")
+register_block("technic:carbon_steel_block", "technic:carbon_steel_ingot")
+register_block("technic:stainless_steel_block", "technic:stainless_steel_ingot")
+
+minetest.register_craft({
+ type = 'cooking',
+ recipe = "technic:zinc_lump",
+ output = "technic:zinc_ingot",
+})
+
+minetest.register_craft({
+ type = 'cooking',
+ recipe = "technic:chromium_lump",
+ output = "technic:chromium_ingot",
+})
+
+minetest.register_craft({
+ type = 'cooking',
+ recipe = "technic:uranium_lump",
+ output = "technic:uranium_ingot",
+})
+
+minetest.register_craft({
+ type = 'cooking',
+ recipe = "technic:lead_lump",
+ output = "technic:lead_ingot",
+})
+
+
+minetest.register_craft({
+ type = 'cooking',
+ recipe = minetest.registered_aliases["technic:wrought_iron_ingot"],
+ output = "technic:cast_iron_ingot",
+})
+
+minetest.register_craft({
+ type = 'cooking',
+ recipe = "technic:cast_iron_ingot",
+ cooktime = 2,
+ output = "technic:wrought_iron_ingot",
+})
+
+minetest.register_craft({
+ type = 'cooking',
+ recipe = "technic:carbon_steel_ingot",
+ cooktime = 2,
+ output = "technic:wrought_iron_ingot",
+})
+
+local function for_each_registered_item(action)
+ local already_reg = {}
+ for k, _ in pairs(minetest.registered_items) do
+ table.insert(already_reg, k)
+ end
+ local really_register_craftitem = minetest.register_craftitem
+ minetest.register_craftitem = function(name, def)
+ really_register_craftitem(name, def)
+ action(string.gsub(name, "^:", ""))
+ end
+ local really_register_tool = minetest.register_tool
+ minetest.register_tool = function(name, def)
+ really_register_tool(name, def)
+ action(string.gsub(name, "^:", ""))
+ end
+ local really_register_node = minetest.register_node
+ minetest.register_node = function(name, def)
+ really_register_node(name, def)
+ action(string.gsub(name, "^:", ""))
+ end
+ for _, name in ipairs(already_reg) do
+ action(name)
+ end
+end
+
+local steel_to_iron = {}
+for _, i in ipairs({
+ "default:axe_steel",
+ "default:pick_steel",
+ "default:shovel_steel",
+ "default:sword_steel",
+ "doors:door_steel",
+ "farming:hoe_steel",
+ "glooptest:hammer_steel",
+ "glooptest:handsaw_steel",
+ "glooptest:reinforced_crystal_glass",
+ "mesecons_doors:op_door_steel",
+ "mesecons_doors:sig_door_steel",
+ "vessels:steel_bottle",
+}) do
+ steel_to_iron[i] = true
+end
+
+for_each_registered_item(function(item_name)
+ local item_def = minetest.registered_items[item_name]
+ if steel_to_iron[item_name] and string.find(item_def.description, "Steel") then
+ minetest.override_item(item_name, { description = string.gsub(item_def.description, "Steel", S("Iron")) })
+ end
+end)
diff --git a/technic/technic_worldgen/depends.txt b/technic/technic_worldgen/depends.txt
new file mode 100644
index 0000000..ac858d0
--- /dev/null
+++ b/technic/technic_worldgen/depends.txt
@@ -0,0 +1,3 @@
+default
+intllib?
+mg?
diff --git a/technic/technic_worldgen/init.lua b/technic/technic_worldgen/init.lua
new file mode 100644
index 0000000..2f36920
--- /dev/null
+++ b/technic/technic_worldgen/init.lua
@@ -0,0 +1,26 @@
+local modpath = minetest.get_modpath("technic_worldgen")
+
+technic = rawget(_G, "technic") or {}
+technic.worldgen = {
+ gettext = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end,
+}
+
+dofile(modpath.."/config.lua")
+dofile(modpath.."/nodes.lua")
+dofile(modpath.."/oregen.lua")
+dofile(modpath.."/crafts.lua")
+
+-- Rubber trees, moretrees also supplies these
+if not minetest.get_modpath("moretrees") then
+ dofile(modpath.."/rubber.lua")
+else
+ -- older versions of technic provided rubber trees regardless
+ minetest.register_alias("technic:rubber_sapling", "moretrees:rubber_tree_sapling")
+ minetest.register_alias("technic:rubber_tree_empty", "moretrees:rubber_tree_trunk_empty")
+end
+
+-- mg suppport
+if minetest.get_modpath("mg") then
+ dofile(modpath.."/mg.lua")
+end
+
diff --git a/technic/technic_worldgen/locale/de.txt b/technic/technic_worldgen/locale/de.txt
new file mode 100644
index 0000000..401c94c
--- /dev/null
+++ b/technic/technic_worldgen/locale/de.txt
@@ -0,0 +1,39 @@
+# German Translation for technic_worldgen
+# Deutsche Übersetzung von technic_worldgen
+# by Xanthin
+
+## crafts.lua
+Uranium Lump = Uranklumpen
+Uranium Ingot = Uranbarren
+Chromium Lump = Chromklumpen
+Chromium Ingot = Chrombarren
+Zinc Lump = Zinkklumpen
+Zinc Ingot = Zinkbarren
+Brass Ingot = Messingbarren
+Wrought Iron Ingot = Schmiedeeisenbarren
+Cast Iron Ingot = Gusseisenbarren
+Carbon Steel Ingot = Kohlenstoffstahlbarren
+Stainless Steel Ingot = Edelstahlbarren
+Iron = Eisen
+
+## nodes.lua
+Uranium Ore = Uranerz
+Chromium Ore = Chromerz
+Zinc Ore = Zinkerz
+Granite = Granit
+Marble = Marmor
+Marble Bricks = Marmorziegel
+Uranium Block = Uranblock
+Chromium Block = Chromblock
+Zinc Block = Zinkblock
+Wrought Iron Block = Schmiedeeisenblock
+Cast Iron Block = Gusseisenblock
+Carbon Steel Block = Kohlenstoffstahlblock
+Stainless Steel Block = Edelstahlblock
+Brass Block = Messingblock
+Wrought Iron = Schmiedeeisen
+
+## rubber.lua
+Rubber Tree Sapling = Gummibaumsetzling
+Rubber Tree = Gummibaum
+
diff --git a/technic/technic_worldgen/locale/template.txt b/technic/technic_worldgen/locale/template.txt
new file mode 100644
index 0000000..594e0ce
--- /dev/null
+++ b/technic/technic_worldgen/locale/template.txt
@@ -0,0 +1,37 @@
+# template.txt
+# technic_worldgen translation template
+
+###crafts.lua
+Uranium Lump =
+Uranium Ingot =
+Chromium Lump =
+Chromium Ingot =
+Zinc Lump =
+Zinc Ingot =
+Brass Ingot =
+Wrought Iron Ingot =
+Cast Iron Ingot =
+Carbon Steel Ingot =
+Stainless Steel Ingot =
+Iron =
+
+###nodes.lua
+Uranium Ore =
+Chromium Ore =
+Zinc Ore =
+Granite =
+Marble =
+Marble Bricks =
+Uranium Block =
+Chromium Block =
+Zinc Block =
+Wrought Iron Block =
+Cast Iron Block =
+Carbon Steel Block =
+Stainless Steel Block =
+Brass Block =
+Wrought Iron =
+
+###rubber.lua
+Rubber Tree Sapling =
+Rubber Tree =
diff --git a/technic/technic_worldgen/locale/tr.txt b/technic/technic_worldgen/locale/tr.txt
new file mode 100644
index 0000000..a04597f
--- /dev/null
+++ b/technic/technic_worldgen/locale/tr.txt
@@ -0,0 +1,38 @@
+# Turkish translation
+# mahmutelmas06@hotmail.com
+# Türkçe çeviri
+
+###crafts.lua
+Uranium Lump = Uranyum yığını
+Uranium Ingot = Uranyum külçesi
+Chromium Lump = Krom yığını
+Chromium Ingot = Krom külçesi
+Zinc Lump = Çinko yığını
+Zinc Ingot = Çünko külçesi
+Brass Ingot = Pirinç yığını
+Wrought Iron Ingot = İşlenmiş demir yığını
+Cast Iron Ingot = Döküm demir yığını
+Carbon Steel Ingot = Karbon çelik külçe
+Stainless Steel Ingot =Paslanmaz çelik külçe
+Iron = Demir
+
+###nodes.lua
+Uranium Ore = Uranyum madeni
+Chromium Ore = Krom madeni
+Zinc Ore = Çinko madeni
+Granite = Granit
+Marble = Mermer
+Marble Bricks = Mermer tuğla
+Uranium Block = Uranyum blok
+Chromium Block = Karbon blok
+Zinc Block = Çinko blok
+Wrought Iron Block = İşlenmiş demir blok
+Cast Iron Block = Döküm demir blok
+Carbon Steel Block = Karbon çelik blok
+Stainless Steel Block = Paslanmaz çelik blok
+Brass Block = Pirinç blok
+Wrought Iron = İşlenmiş demir
+
+###rubber.lua
+Rubber Tree Sapling = Kauçuk ağacı fidanı
+Rubber Tree = Kauçuk ağacı
diff --git a/technic/technic_worldgen/mg.lua b/technic/technic_worldgen/mg.lua
new file mode 100644
index 0000000..4025384
--- /dev/null
+++ b/technic/technic_worldgen/mg.lua
@@ -0,0 +1,90 @@
+mg.register_ore({
+ name = "technic:mineral_uranium",
+ wherein = "default:stone",
+ seeddiff = 11,
+ maxvdistance = 10.5,
+ maxheight = -80,
+ minheight = -300,
+ sizen = 20,
+ sizedev = 10,
+ seglenghtn = 3,
+ seglenghtdev = 1,
+ segincln = 0.4,
+ segincldev = 0.6,
+ turnangle = 57,
+ numperblock = 1,
+ fork_chance = 0
+})
+
+mg.register_ore({
+ name = "technic:mineral_chromium",
+ wherein = "default:stone",
+ seeddiff = 12,
+ maxvdistance = 10.5,
+ maxheight = -100,
+ sizen = 50,
+ sizedev = 20,
+ seglenghtn = 8,
+ seglenghtdev = 3,
+ segincln = 0,
+ segincldev = 0.6,
+ turnangle = 57,
+ forkturnangle = 57,
+ numperblock = 2
+})
+
+mg.register_ore({
+ name = "technic:mineral_zinc",
+ wherein = "default:stone",
+ seeddiff = 13,
+ maxvdistance = 10.5,
+ maxheight = 2,
+ seglenghtn = 15,
+ seglenghtdev = 6,
+ segincln = 0,
+ segincldev = 0.6,
+ turnangle = 57,
+ forkturnangle = 57,
+ numperblock = 2
+})
+
+mg.register_ore({
+ name = "technic:mineral_lead",
+ wherein = "default:stone",
+ seeddiff = 13,
+ maxvdistance = 10.5,
+ maxheight = 16,
+ seglenghtn = 15,
+ seglenghtdev = 6,
+ segincln = 0,
+ segincldev = 0.6,
+ turnangle = 57,
+ forkturnangle = 57,
+ numperblock = 3
+})
+
+if technic.config:get_bool("enable_granite_generation") then
+ mg.register_ore_sheet({
+ name = "technic:granite",
+ wherein = "default:stone",
+ height_min = -31000,
+ height_max = -150,
+ tmin = 3,
+ tmax = 6,
+ threshhold = 0.4,
+ noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
+ })
+end
+
+if technic.config:get_bool("enable_marble_generation") then
+ mg.register_ore_sheet({
+ name = "technic:marble",
+ wherein = "default:stone",
+ height_min = -31000,
+ height_max = -50,
+ tmin = 3,
+ tmax = 6,
+ threshhold = 0.4,
+ noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=23, octaves=3, persist=0.70}
+ })
+end
diff --git a/technic/technic_worldgen/nodes.lua b/technic/technic_worldgen/nodes.lua
new file mode 100644
index 0000000..a4fe2dd
--- /dev/null
+++ b/technic/technic_worldgen/nodes.lua
@@ -0,0 +1,196 @@
+
+local S = technic.worldgen.gettext
+
+minetest.register_node( ":technic:mineral_uranium", {
+ description = S("Uranium Ore"),
+ tiles = { "default_stone.png^technic_mineral_uranium.png" },
+ is_ground_content = true,
+ groups = {cracky=3, radioactive=1000},
+ sounds = default.node_sound_stone_defaults(),
+ drop = "technic:uranium_lump",
+})
+
+minetest.register_node( ":technic:mineral_chromium", {
+ description = S("Chromium Ore"),
+ tiles = { "default_stone.png^technic_mineral_chromium.png" },
+ is_ground_content = true,
+ groups = {cracky=3},
+ sounds = default.node_sound_stone_defaults(),
+ drop = "technic:chromium_lump",
+})
+
+minetest.register_node( ":technic:mineral_zinc", {
+ description = S("Zinc Ore"),
+ tiles = { "default_stone.png^technic_mineral_zinc.png" },
+ is_ground_content = true,
+ groups = {cracky=3},
+ sounds = default.node_sound_stone_defaults(),
+ drop = "technic:zinc_lump",
+})
+
+minetest.register_node( ":technic:mineral_lead", {
+ description = S("Lead Ore"),
+ tiles = { "default_stone.png^technic_mineral_lead.png" },
+ is_ground_content = true,
+ groups = {cracky=3},
+ sounds = default.node_sound_stone_defaults(),
+ drop = "technic:lead_lump",
+})
+
+minetest.register_node( ":technic:mineral_sulfur", {
+ description = S("Sulfur Ore"),
+ tiles = { "default_stone.png^technic_mineral_sulfur.png" },
+ is_ground_content = true,
+ groups = {cracky=3},
+ sounds = default.node_sound_stone_defaults(),
+ drop = "technic:sulfur_lump",
+})
+
+minetest.register_node( ":technic:granite", {
+ description = S("Granite"),
+ tiles = { "technic_granite.png" },
+ is_ground_content = true,
+ groups = {cracky=1},
+ sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_node( ":technic:marble", {
+ description = S("Marble"),
+ tiles = { "technic_marble.png" },
+ is_ground_content = true,
+ groups = {cracky=3, marble=1},
+ sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_node( ":technic:marble_bricks", {
+ description = S("Marble Bricks"),
+ tiles = { "technic_marble_bricks.png" },
+ is_ground_content = true,
+ groups = {cracky=3},
+ sounds = default.node_sound_stone_defaults(),
+})
+
+minetest.register_node(":technic:uranium_block", {
+ description = S("Uranium Block"),
+ tiles = { "technic_uranium_block.png" },
+ is_ground_content = true,
+ groups = {uranium_block=1, cracky=1, level=2, radioactive=3000},
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_node(":technic:chromium_block", {
+ description = S("Chromium Block"),
+ tiles = { "technic_chromium_block.png" },
+ is_ground_content = true,
+ groups = {cracky=1, level=2},
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_node(":technic:zinc_block", {
+ description = S("Zinc Block"),
+ tiles = { "technic_zinc_block.png" },
+ is_ground_content = true,
+ groups = {cracky=1, level=2},
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_node(":technic:lead_block", {
+ description = S("Lead Block"),
+ tiles = { "technic_lead_block.png" },
+ is_ground_content = true,
+ groups = {cracky=1, level=2},
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_alias("technic:wrought_iron_block", "default:steelblock")
+
+minetest.override_item("default:steelblock", {
+ description = S("Wrought Iron Block"),
+ tiles = { "technic_wrought_iron_block.png" },
+})
+
+minetest.register_node(":technic:cast_iron_block", {
+ description = S("Cast Iron Block"),
+ tiles = { "technic_cast_iron_block.png" },
+ is_ground_content = true,
+ groups = {cracky=1, level=2},
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_node(":technic:carbon_steel_block", {
+ description = S("Carbon Steel Block"),
+ tiles = { "technic_carbon_steel_block.png" },
+ is_ground_content = true,
+ groups = {cracky=1, level=2},
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_node(":technic:stainless_steel_block", {
+ description = S("Stainless Steel Block"),
+ tiles = { "technic_stainless_steel_block.png" },
+ is_ground_content = true,
+ groups = {cracky=1, level=2},
+ sounds = default.node_sound_stone_defaults()
+})
+
+minetest.register_node(":technic:brass_block", {
+ description = S("Brass Block"),
+ tiles = { "technic_brass_block.png" },
+ is_ground_content = true,
+ groups = {cracky=1, level=2},
+ 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_alias("technic:diamond_block", "default:diamondblock")
+minetest.register_alias("technic:diamond", "default:diamond")
+minetest.register_alias("technic:mineral_diamond", "default:stone_with_diamond")
+
+local function for_each_registered_node(action)
+ local really_register_node = minetest.register_node
+ minetest.register_node = function(name, def)
+ really_register_node(name, def)
+ action(name:gsub("^:", ""), def)
+ end
+ for name, def in pairs(minetest.registered_nodes) do
+ action(name, def)
+ end
+end
+
+for_each_registered_node(function(node_name, node_def)
+ if node_name ~= "default:steelblock" and
+ node_name:find("steelblock", 1, true) and
+ node_def.description:find("Steel", 1, true) then
+ minetest.override_item(node_name, {
+ description = node_def.description:gsub("Steel", S("Wrought Iron")),
+ })
+ end
+ local tiles = node_def.tiles or node_def.tile_images
+ if tiles then
+ local new_tiles = {}
+ local do_override = false
+ if type(tiles) == "string" then
+ tiles = {tiles}
+ end
+ for i, t in ipairs(tiles) do
+ if type(t) == "string" and t == "default_steel_block.png" then
+ do_override = true
+ t = "technic_wrought_iron_block.png"
+ end
+ table.insert(new_tiles, t)
+ end
+ if do_override then
+ minetest.override_item(node_name, {
+ tiles = new_tiles
+ })
+ end
+ end
+end)
+
diff --git a/technic/technic_worldgen/oregen.lua b/technic/technic_worldgen/oregen.lua
new file mode 100644
index 0000000..795f0ec
--- /dev/null
+++ b/technic/technic_worldgen/oregen.lua
@@ -0,0 +1,191 @@
+local uranium_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 420, octaves = 3, persist = 0.7}
+local uranium_threshhold = 0.55
+
+local chromium_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 421, octaves = 3, persist = 0.7}
+local chromium_threshhold = 0.55
+
+local zinc_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 422, octaves = 3, persist = 0.7}
+local zinc_threshhold = 0.5
+
+local lead_params = {offset = 0, scale = 1, spread = {x = 100, y = 100, z = 100}, seed = 423, octaves = 3, persist = 0.7}
+local lead_threshhold = 0.3
+
+minetest.register_ore({
+ ore_type = "scatter",
+ ore = "technic:mineral_uranium",
+ wherein = "default:stone",
+ clust_scarcity = 8*8*8,
+ clust_num_ores = 4,
+ clust_size = 3,
+ y_min = -300,
+ y_max = -80,
+ noise_params = uranium_params,
+ noise_threshhold = uranium_threshhold,
+})
+
+minetest.register_ore({
+ ore_type = "scatter",
+ ore = "technic:mineral_chromium",
+ wherein = "default:stone",
+ clust_scarcity = 8*8*8,
+ clust_num_ores = 2,
+ clust_size = 3,
+ y_min = -200,
+ y_max = -100,
+ noise_params = chromium_params,
+ noise_threshhold = chromium_threshhold,
+})
+
+minetest.register_ore({
+ ore_type = "scatter",
+ ore = "technic:mineral_chromium",
+ wherein = "default:stone",
+ clust_scarcity = 6*6*6,
+ clust_num_ores = 2,
+ clust_size = 3,
+ y_min = -31000,
+ y_max = -200,
+ flags = "absheight",
+ noise_params = chromium_params,
+ noise_threshhold = chromium_threshhold,
+})
+
+minetest.register_ore({
+ ore_type = "scatter",
+ ore = "technic:mineral_zinc",
+ wherein = "default:stone",
+ clust_scarcity = 8*8*8,
+ clust_num_ores = 4,
+ clust_size = 3,
+ y_min = -32,
+ y_max = 2,
+ noise_params = zinc_params,
+ noise_threshhold = zinc_threshhold,
+})
+
+minetest.register_ore({
+ ore_type = "scatter",
+ ore = "technic:mineral_zinc",
+ wherein = "default:stone",
+ clust_scarcity = 6*6*6,
+ clust_num_ores = 4,
+ clust_size = 3,
+ y_min = -31000,
+ y_max = -32,
+ flags = "absheight",
+ noise_params = zinc_params,
+ noise_threshhold = zinc_threshhold,
+})
+
+minetest.register_ore({
+ ore_type = "scatter",
+ ore = "technic:mineral_lead",
+ wherein = "default:stone",
+ clust_scarcity = 9*9*9,
+ clust_num_ores = 5,
+ clust_size = 3,
+ y_min = -16,
+ y_max = 16,
+ noise_params = lead_params,
+ noise_threshhold = lead_threshhold,
+})
+
+minetest.register_ore({
+ ore_type = "scatter",
+ ore = "technic:mineral_lead",
+ wherein = "default:stone",
+ clust_scarcity = 8*8*8,
+ clust_num_ores = 5,
+ clust_size = 3,
+ y_min = -128,
+ y_max = -16,
+ noise_params = lead_params,
+ noise_threshhold = lead_threshhold,
+})
+
+minetest.register_ore({
+ ore_type = "scatter",
+ ore = "technic:mineral_lead",
+ wherein = "default:stone",
+ clust_scarcity = 6*6*6,
+ clust_num_ores = 5,
+ clust_size = 3,
+ y_min = -31000,
+ y_max = -128,
+ flags = "absheight",
+ noise_params = lead_params,
+ noise_threshhold = lead_threshhold,
+})
+
+-- Sulfur
+minetest.register_on_generated(function(minp, maxp, seed)
+ local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
+ local a = VoxelArea:new{
+ MinEdge = {x = emin.x, y = emin.y, z = emin.z},
+ MaxEdge = {x = emax.x, y = emax.y, z = emax.z},
+ }
+ local data = vm:get_data()
+ local pr = PseudoRandom(17 * minp.x + 42 * minp.y + 101 * minp.z)
+ local noise = minetest.get_perlin(9876, 3, 0.5, 100)
+
+ local c_lava = minetest.get_content_id("default:lava_source")
+ local c_lava_flowing = minetest.get_content_id("default:lava_flowing")
+ local c_stone = minetest.get_content_id("default:stone")
+ local c_sulfur = minetest.get_content_id("technic:mineral_sulfur")
+
+ local grid_size = 5
+ for x = minp.x + math.floor(grid_size / 2), maxp.x, grid_size do
+ for y = minp.y + math.floor(grid_size / 2), maxp.y, grid_size do
+ for z = minp.z + math.floor(grid_size / 2), maxp.z, grid_size do
+ local c = data[a:index(x, y, z)]
+ if (c == c_lava or c == c_lava_flowing) and noise:get3d({x = x, y = z, z = z}) >= 0.4 then
+ for xx = math.max(minp.x, x - grid_size), math.min(maxp.x, x + grid_size) do
+ for yy = math.max(minp.y, y - grid_size), math.min(maxp.y, y + grid_size) do
+ for zz = math.max(minp.z, z - grid_size), math.min(maxp.z, z + grid_size) do
+ local i = a:index(xx, yy, zz)
+ if data[i] == c_stone and pr:next(1, 10) <= 7 then
+ data[i] = c_sulfur
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+
+ vm:set_data(data)
+ vm:write_to_map(data)
+end)
+
+
+if technic.config:get_bool("enable_marble_generation") then
+minetest.register_ore({
+ ore_type = "sheet",
+ ore = "technic:marble",
+ wherein = "default:stone",
+ clust_scarcity = 1,
+ clust_num_ores = 1,
+ clust_size = 3,
+ y_min = -31000,
+ y_max = -50,
+ noise_threshhold = 0.4,
+ noise_params = {offset=0, scale=15, spread={x=150, y=150, z=150}, seed=23, octaves=3, persist=0.70}
+})
+end
+
+if technic.config:get_bool("enable_granite_generation") then
+minetest.register_ore({
+ ore_type = "sheet",
+ ore = "technic:granite",
+ wherein = "default:stone",
+ clust_scarcity = 1,
+ clust_num_ores = 1,
+ clust_size = 4,
+ y_min = -31000,
+ y_max = -150,
+ noise_threshhold = 0.4,
+ noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
+})
+end
+
diff --git a/technic/technic_worldgen/rubber.lua b/technic/technic_worldgen/rubber.lua
new file mode 100644
index 0000000..3094fa0
--- /dev/null
+++ b/technic/technic_worldgen/rubber.lua
@@ -0,0 +1,100 @@
+-- Code of rubber tree by PilzAdam
+
+local S = technic.worldgen.gettext
+
+minetest.register_node(":moretrees:rubber_tree_sapling", {
+ description = S("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_craft({
+ type = "fuel",
+ recipe = "moretrees:rubber_tree_sapling",
+ burntime = 10
+})
+
+minetest.register_node(":moretrees:rubber_tree_trunk", {
+ description = S("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},
+ sounds = default.node_sound_wood_defaults(),
+})
+
+minetest.register_node(":moretrees:rubber_tree_trunk_empty", {
+ description = S("Rubber Tree"),
+ 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},
+ sounds = default.node_sound_wood_defaults(),
+})
+
+minetest.register_node(":moretrees:rubber_tree_leaves", {
+ drawtype = "allfaces_optional",
+ description = S("Rubber Tree Leaves"),
+ tiles = {"technic_rubber_leaves.png"},
+ paramtype = "light",
+ groups = {snappy=3, leafdecay=3, flammable=2, leaves=1},
+ drop = {
+ max_items = 1,
+ items = {{
+ items = {"moretrees:rubber_tree_sapling"},
+ rarity = 20,
+ },
+ {
+ items = {"moretrees:rubber_tree_leaves"},
+ }
+ }
+ },
+ sounds = default.node_sound_leaves_defaults(),
+})
+
+technic.rubber_tree_model={
+ axiom = "FFFFA",
+ rules_a = "[&FFBFA]////[&BFFFA]////[&FBFFA]",
+ rules_b = "[&FFA]////[&FFA]////[&FFA]",
+ trunk = "moretrees:rubber_tree_trunk",
+ leaves = "moretrees:rubber_tree_leaves",
+ angle = 35,
+ iterations = 3,
+ random_level = 1,
+ trunk_type = "double",
+ thin_branches = true
+}
+
+minetest.register_abm({
+ nodenames = {"moretrees:rubber_tree_sapling"},
+ interval = 60,
+ chance = 20,
+ action = function(pos, node)
+ minetest.remove_node(pos)
+ minetest.spawn_tree(pos, technic.rubber_tree_model)
+ end
+})
+
+if technic.config:get_bool("enable_rubber_tree_generation") then
+ 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.find_node_near(tmp, maxp.x - minp.x,
+ {"default:dirt_with_grass"})
+ if pos ~= nil then
+ minetest.spawn_tree({x=pos.x, y=pos.y+1, z=pos.z}, technic.rubber_tree_model)
+ end
+ end)
+end
+
diff --git a/technic/technic_worldgen/textures/technic_brass_block.png b/technic/technic_worldgen/textures/technic_brass_block.png
new file mode 100644
index 0000000..bc6fe78
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_brass_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_brass_dust.png b/technic/technic_worldgen/textures/technic_brass_dust.png
new file mode 100644
index 0000000..63d9ba4
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_brass_dust.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_brass_ingot.png b/technic/technic_worldgen/textures/technic_brass_ingot.png
new file mode 100644
index 0000000..06056e7
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_brass_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_carbon_steel_block.png b/technic/technic_worldgen/textures/technic_carbon_steel_block.png
new file mode 100644
index 0000000..f3cfdc1
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_carbon_steel_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_carbon_steel_ingot.png b/technic/technic_worldgen/textures/technic_carbon_steel_ingot.png
new file mode 100644
index 0000000..c30ec80
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_carbon_steel_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_cast_iron_block.png b/technic/technic_worldgen/textures/technic_cast_iron_block.png
new file mode 100644
index 0000000..2df61e5
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_cast_iron_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_cast_iron_ingot.png b/technic/technic_worldgen/textures/technic_cast_iron_ingot.png
new file mode 100644
index 0000000..5c182ce
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_cast_iron_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_chromium_block.png b/technic/technic_worldgen/textures/technic_chromium_block.png
new file mode 100644
index 0000000..ad173ca
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_chromium_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_chromium_ingot.png b/technic/technic_worldgen/textures/technic_chromium_ingot.png
new file mode 100644
index 0000000..248b0c3
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_chromium_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_chromium_lump.png b/technic/technic_worldgen/textures/technic_chromium_lump.png
new file mode 100644
index 0000000..0fe03a1
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_chromium_lump.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_granite.png b/technic/technic_worldgen/textures/technic_granite.png
new file mode 100644
index 0000000..abb1385
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_granite.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_lead_block.png b/technic/technic_worldgen/textures/technic_lead_block.png
new file mode 100644
index 0000000..11da56a
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_lead_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_lead_dust.png b/technic/technic_worldgen/textures/technic_lead_dust.png
new file mode 100644
index 0000000..af6ee29
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_lead_dust.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_lead_ingot.png b/technic/technic_worldgen/textures/technic_lead_ingot.png
new file mode 100644
index 0000000..fae0cbf
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_lead_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_lead_lump.png b/technic/technic_worldgen/textures/technic_lead_lump.png
new file mode 100644
index 0000000..64584cb
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_lead_lump.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_marble.png b/technic/technic_worldgen/textures/technic_marble.png
new file mode 100644
index 0000000..846a170
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_marble.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_marble_bricks.png b/technic/technic_worldgen/textures/technic_marble_bricks.png
new file mode 100644
index 0000000..2ea1e42
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_marble_bricks.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_mineral_chromium.png b/technic/technic_worldgen/textures/technic_mineral_chromium.png
new file mode 100644
index 0000000..c66f1c5
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_mineral_chromium.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_mineral_lead.png b/technic/technic_worldgen/textures/technic_mineral_lead.png
new file mode 100644
index 0000000..0309cd3
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_mineral_lead.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_mineral_sulfur.png b/technic/technic_worldgen/textures/technic_mineral_sulfur.png
new file mode 100644
index 0000000..26cb19d
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_mineral_sulfur.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_mineral_uranium.png b/technic/technic_worldgen/textures/technic_mineral_uranium.png
new file mode 100644
index 0000000..aad9c07
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_mineral_uranium.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_mineral_zinc.png b/technic/technic_worldgen/textures/technic_mineral_zinc.png
new file mode 100644
index 0000000..598efeb
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_mineral_zinc.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_rubber.png b/technic/technic_worldgen/textures/technic_rubber.png
new file mode 100644
index 0000000..9ed4a9d
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_rubber.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_rubber_leaves.png b/technic/technic_worldgen/textures/technic_rubber_leaves.png
new file mode 100644
index 0000000..ae013e0
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_rubber_leaves.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_rubber_sapling.png b/technic/technic_worldgen/textures/technic_rubber_sapling.png
new file mode 100644
index 0000000..e5c9f5d
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_rubber_sapling.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_rubber_tree_empty.png b/technic/technic_worldgen/textures/technic_rubber_tree_empty.png
new file mode 100644
index 0000000..1792951
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_rubber_tree_empty.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_rubber_tree_full.png b/technic/technic_worldgen/textures/technic_rubber_tree_full.png
new file mode 100644
index 0000000..08067ef
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_rubber_tree_full.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_rubber_tree_grindings.png b/technic/technic_worldgen/textures/technic_rubber_tree_grindings.png
new file mode 100644
index 0000000..9f2f5d6
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_rubber_tree_grindings.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_stainless_steel_block.png b/technic/technic_worldgen/textures/technic_stainless_steel_block.png
new file mode 100644
index 0000000..e451768
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_stainless_steel_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_sulfur_dust.png b/technic/technic_worldgen/textures/technic_sulfur_dust.png
new file mode 100644
index 0000000..04ffee0
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_sulfur_dust.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_sulfur_lump.png b/technic/technic_worldgen/textures/technic_sulfur_lump.png
new file mode 100644
index 0000000..017c8e1
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_sulfur_lump.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_uranium_block.png b/technic/technic_worldgen/textures/technic_uranium_block.png
new file mode 100644
index 0000000..99dd51c
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_uranium_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_uranium_ingot.png b/technic/technic_worldgen/textures/technic_uranium_ingot.png
new file mode 100644
index 0000000..38978f8
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_uranium_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_uranium_lump.png b/technic/technic_worldgen/textures/technic_uranium_lump.png
new file mode 100644
index 0000000..2f5a66c
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_uranium_lump.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_wrought_iron_block.png b/technic/technic_worldgen/textures/technic_wrought_iron_block.png
new file mode 100644
index 0000000..cf6c961
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_wrought_iron_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_wrought_iron_ingot.png b/technic/technic_worldgen/textures/technic_wrought_iron_ingot.png
new file mode 100644
index 0000000..af00ea0
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_wrought_iron_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_zinc_block.png b/technic/technic_worldgen/textures/technic_zinc_block.png
new file mode 100644
index 0000000..5ae7947
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_zinc_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_zinc_ingot.png b/technic/technic_worldgen/textures/technic_zinc_ingot.png
new file mode 100644
index 0000000..a36a11c
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_zinc_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/technic_zinc_lump.png b/technic/technic_worldgen/textures/technic_zinc_lump.png
new file mode 100644
index 0000000..1a620ab
--- /dev/null
+++ b/technic/technic_worldgen/textures/technic_zinc_lump.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_brass_ingot.png b/technic/technic_worldgen/textures/x32/technic_brass_ingot.png
new file mode 100644
index 0000000..2d8b153
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_brass_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_chromium_ingot.png b/technic/technic_worldgen/textures/x32/technic_chromium_ingot.png
new file mode 100644
index 0000000..91d5b20
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_chromium_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_chromium_lump.png b/technic/technic_worldgen/textures/x32/technic_chromium_lump.png
new file mode 100644
index 0000000..1588f92
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_chromium_lump.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_concrete_block.png b/technic/technic_worldgen/textures/x32/technic_concrete_block.png
new file mode 100644
index 0000000..91364f3
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_concrete_block.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_granite.png b/technic/technic_worldgen/textures/x32/technic_granite.png
new file mode 100644
index 0000000..abb1385
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_granite.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_marble.png b/technic/technic_worldgen/textures/x32/technic_marble.png
new file mode 100644
index 0000000..846a170
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_marble.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_marble_bricks.png b/technic/technic_worldgen/textures/x32/technic_marble_bricks.png
new file mode 100644
index 0000000..2ea1e42
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_marble_bricks.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_mineral_chromium.png b/technic/technic_worldgen/textures/x32/technic_mineral_chromium.png
new file mode 100644
index 0000000..c66f1c5
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_mineral_chromium.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_mineral_uranium.png b/technic/technic_worldgen/textures/x32/technic_mineral_uranium.png
new file mode 100644
index 0000000..aad9c07
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_mineral_uranium.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_mineral_zinc.png b/technic/technic_worldgen/textures/x32/technic_mineral_zinc.png
new file mode 100644
index 0000000..598efeb
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_mineral_zinc.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_rebar.png b/technic/technic_worldgen/textures/x32/technic_rebar.png
new file mode 100644
index 0000000..16d1fc5
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_rebar.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png b/technic/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png
new file mode 100644
index 0000000..46fa296
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_uranium.png b/technic/technic_worldgen/textures/x32/technic_uranium.png
new file mode 100644
index 0000000..54225f8
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_uranium.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_zinc_ingot.png b/technic/technic_worldgen/textures/x32/technic_zinc_ingot.png
new file mode 100644
index 0000000..096ff9c
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_zinc_ingot.png
Binary files differ
diff --git a/technic/technic_worldgen/textures/x32/technic_zinc_lump.png b/technic/technic_worldgen/textures/x32/technic_zinc_lump.png
new file mode 100644
index 0000000..d28a6dc
--- /dev/null
+++ b/technic/technic_worldgen/textures/x32/technic_zinc_lump.png
Binary files differ
diff --git a/technic/wrench/depends.txt b/technic/wrench/depends.txt
new file mode 100644
index 0000000..a681af3
--- /dev/null
+++ b/technic/wrench/depends.txt
@@ -0,0 +1,6 @@
+default
+technic?
+technic_chests?
+technic_worldgen?
+intllib?
+
diff --git a/technic/wrench/init.lua b/technic/wrench/init.lua
new file mode 100644
index 0000000..76605c4
--- /dev/null
+++ b/technic/wrench/init.lua
@@ -0,0 +1,162 @@
+--[[
+Wrench mod
+
+Adds a wrench that allows the player to pickup nodes that contain an inventory
+with items or metadata that needs perserving.
+The wrench has the same tool capability as the normal hand.
+To pickup a node simply right click on it. If the node contains a formspec,
+you will need to shift+right click instead.
+Because it enables arbitrary nesting of chests, and so allows the player
+to carry an unlimited amount of material at once, this wrench is not
+available to survival-mode players.
+--]]
+
+local LATEST_SERIALIZATION_VERSION = 1
+
+wrench = {}
+
+local modpath = minetest.get_modpath(minetest.get_current_modname())
+dofile(modpath.."/support.lua")
+dofile(modpath.."/technic.lua")
+
+-- Boilerplate to support localized strings if intllib mod is installed.
+local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
+
+local function get_meta_type(name, metaname)
+ local def = wrench.registered_nodes[name]
+ if not def or not def.metas or not def.metas[metaname] then
+ return nil
+ end
+ return def.metas[metaname]
+end
+
+local function get_pickup_name(name)
+ return "wrench:picked_up_"..(name:gsub(":", "_"))
+end
+
+local function restore(pos, placer, itemstack)
+ local name = itemstack:get_name()
+ local node = minetest.get_node(pos)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local data = minetest.deserialize(itemstack:get_metadata())
+ minetest.set_node(pos, {name = data.name, param2 = node.param2})
+ local lists = data.lists
+ for name, value in pairs(data.metas) do
+ local meta_type = get_meta_type(data.name, name)
+ if meta_type == wrench.META_TYPE_INT then
+ meta:set_int(name, value)
+ elseif meta_type == wrench.META_TYPE_FLOAT then
+ meta:set_float(name, value)
+ elseif meta_type == wrench.META_TYPE_STRING then
+ meta:set_string(name, value)
+ end
+ end
+ for listname, list in pairs(lists) do
+ inv:set_list(listname, list)
+ end
+ itemstack:take_item()
+ return itemstack
+end
+
+for name, info in pairs(wrench.registered_nodes) do
+ local olddef = minetest.registered_nodes[name]
+ if olddef then
+ local newdef = {}
+ for key, value in pairs(olddef) do
+ newdef[key] = value
+ end
+ newdef.stack_max = 1
+ newdef.description = S("%s with items"):format(newdef.description)
+ newdef.groups = {}
+ newdef.groups.not_in_creative_inventory = 1
+ newdef.on_construct = nil
+ newdef.on_destruct = nil
+ newdef.after_place_node = restore
+ minetest.register_node(":"..get_pickup_name(name), newdef)
+ end
+end
+
+minetest.register_tool("wrench:wrench", {
+ description = S("Wrench"),
+ inventory_image = "technic_wrench.png",
+ tool_capabilities = {
+ full_punch_interval = 0.9,
+ max_drop_level = 0,
+ groupcaps = {
+ crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1},
+ snappy = {times={[3]=0.40}, uses=0, maxlevel=1},
+ oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40},
+ uses=0, maxlevel=3}
+ },
+ damage_groups = {fleshy=1},
+ },
+ on_place = function(itemstack, placer, pointed_thing)
+ local pos = pointed_thing.under
+ if not placer or not pos then
+ return
+ end
+ if minetest.is_protected(pos, placer:get_player_name()) then
+ minetest.record_protection_violation(pos, placer:get_player_name())
+ return
+ end
+ local name = minetest.get_node(pos).name
+ local def = wrench.registered_nodes[name]
+ if not def then
+ return
+ end
+
+ local stack = ItemStack(get_pickup_name(name))
+ local player_inv = placer:get_inventory()
+ if not player_inv:room_for_item("main", stack) then
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if def.owned then
+ local owner = meta:get_string("owner")
+ if owner and owner ~= placer:get_player_name() then
+ minetest.log("action", placer:get_player_name()..
+ " tried to pick up a owned node belonging to "..
+ owner.." at "..
+ minetest.pos_to_string(pos))
+ return
+ end
+ end
+
+ local metadata = {}
+ metadata.name = name
+ metadata.version = LATEST_SERIALIZATION_VERSION
+
+ local inv = meta:get_inventory()
+ local lists = {}
+ for _, listname in pairs(def.lists or {}) do
+ if not inv:is_empty(listname) then
+ empty = false
+ end
+ local list = inv:get_list(listname)
+ for i, stack in pairs(list) do
+ list[i] = stack:to_string()
+ end
+ lists[listname] = list
+ end
+ metadata.lists = lists
+
+ local metas = {}
+ for name, meta_type in pairs(def.metas or {}) do
+ if meta_type == wrench.META_TYPE_INT then
+ metas[name] = meta:get_int(name)
+ elseif meta_type == wrench.META_TYPE_FLOAT then
+ metas[name] = meta:get_float(name)
+ elseif meta_type == wrench.META_TYPE_STRING then
+ metas[name] = meta:get_string(name)
+ end
+ end
+ metadata.metas = metas
+
+ stack:set_metadata(minetest.serialize(metadata))
+ minetest.remove_node(pos)
+ itemstack:add_wear(65535 / 20)
+ player_inv:add_item("main", stack)
+ return itemstack
+ end,
+})
diff --git a/technic/wrench/locale/de.txt b/technic/wrench/locale/de.txt
new file mode 100644
index 0000000..b285cd3
--- /dev/null
+++ b/technic/wrench/locale/de.txt
@@ -0,0 +1,7 @@
+# German Translation for technic_wrench
+# Deutsche Übersetzung von technic_wrench
+# by Xanthin
+
+Wrench = Schraubenschluessel
+%s with items = %s mit Gegenstaenden
+
diff --git a/technic/wrench/locale/template.txt b/technic/wrench/locale/template.txt
new file mode 100644
index 0000000..eff2da2
--- /dev/null
+++ b/technic/wrench/locale/template.txt
@@ -0,0 +1,5 @@
+# technic_wrench translation template
+
+Wrench =
+%s with items =
+
diff --git a/technic/wrench/locale/tr.txt b/technic/wrench/locale/tr.txt
new file mode 100644
index 0000000..2050bce
--- /dev/null
+++ b/technic/wrench/locale/tr.txt
@@ -0,0 +1,5 @@
+# Turkish translation by mahmutelmas06
+# mahmutelmas06@hotmail.com
+
+Wrench = İngiliz anahtarı
+%s with items = Araçlarla birlikte %s
diff --git a/technic/wrench/support.lua b/technic/wrench/support.lua
new file mode 100644
index 0000000..1d21811
--- /dev/null
+++ b/technic/wrench/support.lua
@@ -0,0 +1,73 @@
+--[[
+supported_nodes
+This table stores all nodes that are compatible with the wrench mod.
+Syntax:
+ [<node name>] = {
+ lists = {"<inventory list name>"},
+ metas = {["<meta name>"] = STRING,
+ ["<meta name>"] = INT,
+ ["<meta name>"] = FLOAT},
+ owned = true,
+ store_meta_always = true,
+ }
+ owned - nodes that are protected by owner requirements (Ex. locked chests)
+ store_meta_always - when nodes are broken this ensures metadata and
+ inventory is always stored (Ex. active state for machines)
+--]]
+
+wrench.META_TYPE_INT = 0
+wrench.META_TYPE_FLOAT = 1
+wrench.META_TYPE_STRING = 2
+
+local INT, STRING, FLOAT =
+ wrench.META_TYPE_INT,
+ wrench.META_TYPE_STRING,
+ wrench.META_TYPE_FLOAT
+
+wrench.registered_nodes = {
+ ["default:chest"] = {
+ lists = {"main"},
+ },
+ ["default:chest_locked"] = {
+ lists = {"main"},
+ metas = {owner = STRING,
+ infotext = STRING},
+ owned = true,
+ },
+ ["default:furnace"] = {
+ lists = {"fuel", "src", "dst"},
+ metas = {infotext = STRING,
+ fuel_totaltime = FLOAT,
+ fuel_time = FLOAT,
+ src_totaltime = FLOAT,
+ src_time = FLOAT},
+ },
+ ["default:furnace_active"] = {
+ lists = {"fuel", "src", "dst"},
+ metas = {infotext = STRING,
+ fuel_totaltime = FLOAT,
+ fuel_time = FLOAT,
+ src_totaltime = FLOAT,
+ src_time = FLOAT},
+ store_meta_always = true,
+ },
+ ["default:sign_wall"] = {
+ metas = {infotext = STRING,
+ text = STRING},
+ },
+}
+
+function wrench:original_name(name)
+ for key, value in pairs(self.registered_nodes) do
+ if name == value.name then
+ return key
+ end
+ end
+end
+
+function wrench:register_node(name, def)
+ if minetest.registered_nodes[name] then
+ self.registered_nodes[name] = def
+ end
+end
+
diff --git a/technic/wrench/technic.lua b/technic/wrench/technic.lua
new file mode 100644
index 0000000..c404180
--- /dev/null
+++ b/technic/wrench/technic.lua
@@ -0,0 +1,343 @@
+
+local INT, STRING, FLOAT =
+ wrench.META_TYPE_INT,
+ wrench.META_TYPE_STRING,
+ wrench.META_TYPE_FLOAT
+
+wrench:register_node("technic:iron_chest", {
+ lists = {"main"},
+})
+wrench:register_node("technic:iron_locked_chest", {
+ lists = {"main"},
+ metas = {infotext = STRING,
+ owner = STRING},
+ owned = true,
+})
+wrench:register_node("technic:copper_chest", {
+ lists = {"main"},
+})
+wrench:register_node("technic:copper_locked_chest", {
+ lists = {"main"},
+ metas = {infotext = STRING,
+ owner = STRING},
+ owned = true,
+})
+wrench:register_node("technic:silver_chest", {
+ lists = {"main"},
+ metas = {infotext = STRING,
+ formspec = STRING},
+})
+wrench:register_node("technic:silver_locked_chest", {
+ lists = {"main"},
+ metas = {infotext = STRING,
+ owner = STRING,
+ formspec = STRING},
+ owned = true,
+})
+wrench:register_node("technic:gold_chest", {
+ lists = {"main"},
+ metas = {infotext = STRING,
+ formspec = STRING},
+})
+wrench:register_node("technic:gold_locked_chest", {
+ lists = {"main"},
+ metas = {infotext = STRING,
+ owner = STRING,
+ formspec = STRING},
+ owned = true,
+})
+wrench:register_node("technic:mithril_chest", {
+ lists = {"main"},
+ metas = {infotext = STRING,
+ formspec = STRING},
+})
+wrench:register_node("technic:mithril_locked_chest", {
+ lists = {"main"},
+ metas = {infotext = STRING,
+ owner = STRING,
+ formspec = STRING},
+ owned = true,
+})
+wrench:register_node("technic:lv_electric_furnace", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:lv_electric_furnace_active", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_electric_furnace", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_electric_furnace_active", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:coal_alloy_furnace", {
+ lists = {"fuel", "src", "dst"},
+ metas = {infotext = STRING,
+ fuel_totaltime = FLOAT,
+ fuel_time = FLOAT,
+ src_totaltime = FLOAT,
+ src_time = FLOAT},
+})
+wrench:register_node("technic:coal_alloy_furnace_active", {
+ lists = {"fuel", "src", "dst"},
+ metas = {infotext = STRING,
+ fuel_totaltime = FLOAT,
+ fuel_time = FLOAT,
+ src_totaltime = FLOAT,
+ src_time = FLOAT},
+})
+wrench:register_node("technic:alloy_furnace", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:alloy_furnace_active", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_alloy_furnace", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_alloy_furnace_active", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:tool_workshop", {
+ lists = {"src", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT},
+})
+wrench:register_node("technic:grinder", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:grinder_active", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_grinder", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_grinder_active", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:extractor", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:extractor_active", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_extractor", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_extractor_active", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:compressor", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:compressor_active", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_compressor", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_compressor_active", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:cnc", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT,
+ cnc_product = STRING},
+})
+wrench:register_node("technic:cnc_active", {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ LV_EU_demand = INT,
+ LV_EU_input = INT,
+ src_time = INT,
+ cnc_product = STRING},
+})
+wrench:register_node("technic:mv_centrifuge", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+wrench:register_node("technic:mv_centrifuge_active", {
+ lists = {"src", "dst", "upgrade1", "upgrade2"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ MV_EU_demand = INT,
+ MV_EU_input = INT,
+ tube_time = INT,
+ src_time = INT},
+})
+
+
+local chest_mark_colors = {
+ '_black',
+ '_blue',
+ '_brown',
+ '_cyan',
+ '_dark_green',
+ '_dark_grey',
+ '_green',
+ '_grey',
+ '_magenta',
+ '_orange',
+ '_pink',
+ '_red',
+ '_violet',
+ '_white',
+ '_yellow',
+ '',
+}
+
+for i = 1, 15 do
+ wrench:register_node("technic:gold_chest"..chest_mark_colors[i], {
+ lists = {"main"},
+ metas = {infotext = STRING,formspec = STRING},
+ })
+ wrench:register_node("technic:gold_locked_chest"..chest_mark_colors[i], {
+ lists = {"main"},
+ metas = {infotext = STRING,owner = STRING,formspec = STRING},
+ owned = true,
+ })
+end
+
+if minetest.get_modpath("technic") then
+ for tier, _ in pairs(technic.machines) do
+ local ltier = tier:lower()
+ for i = 0, 8 do
+ wrench:register_node("technic:"..ltier.."_battery_box"..i, {
+ lists = {"src", "dst"},
+ metas = {infotext = STRING,
+ formspec = STRING,
+ [tier.."_EU_demand"] = INT,
+ [tier.."_EU_supply"] = INT,
+ [tier.."_EU_input"] = INT,
+ internal_EU_charge = INT,
+ last_side_shown = INT},
+ })
+ end
+ end
+end
+
diff --git a/technic/wrench/textures/technic_wrench.png b/technic/wrench/textures/technic_wrench.png
new file mode 100644
index 0000000..471b47e
--- /dev/null
+++ b/technic/wrench/textures/technic_wrench.png
Binary files differ