From cb3b35760b7c6d6b5be943e5922d9940e240675c Mon Sep 17 00:00:00 2001 From: Chris N Date: Sat, 16 Aug 2014 17:23:36 -1000 Subject: [PATCH] Updates moreblocks/ores/trees, skylands, technic Hope all these files go through... :P --- mods/moreblocks/_config.txt | 17 - mods/moreblocks/circular_saw.lua | 2 +- mods/moreblocks/stairsplus.lua | 415 -------- mods/moreblocks/stairsplus/registrations.lua | 3 +- mods/moreblocks/stairsplus_convert.lua | 133 --- .../textures/moreblocks_jungle_wood.png | Bin 362 -> 0 bytes mods/moreblocks/textures/moreblocks_wood.png | Bin 387 -> 0 bytes .../textures/moreblocks_wood_tile_down.png | Bin 522 -> 0 bytes .../textures/moreblocks_wood_tile_flipped.png | Bin 554 -> 0 bytes .../textures/moreblocks_wood_tile_left.png | Bin 507 -> 0 bytes .../textures/moreblocks_wood_tile_right.png | Bin 533 -> 0 bytes mods/moreores/init.lua | 145 ++- mods/moreores/locale/de.txt | 22 + .../textures/moreores_bronze_block.png | Bin 277 -> 142 bytes .../textures/moreores_bronze_ingot.png | Bin 341 -> 214 bytes .../textures/moreores_copper_block.png | Bin 249 -> 128 bytes .../textures/moreores_copper_ingot.png | Bin 362 -> 230 bytes .../textures/moreores_copper_lump.png | Bin 382 -> 225 bytes .../textures/moreores_copper_rail.png | Bin 546 -> 437 bytes .../moreores_copper_rail_crossing.png | Bin 581 -> 389 bytes .../textures/moreores_copper_rail_curved.png | Bin 576 -> 374 bytes .../moreores_copper_rail_t_junction.png | Bin 577 -> 374 bytes .../moreores/textures/moreores_gold_block.png | Bin 277 -> 142 bytes .../moreores/textures/moreores_gold_ingot.png | Bin 358 -> 241 bytes mods/moreores/textures/moreores_gold_lump.png | Bin 364 -> 174 bytes .../textures/moreores_mineral_copper.png | Bin 258 -> 153 bytes .../textures/moreores_mineral_gold.png | Bin 222 -> 153 bytes .../textures/moreores_mineral_mithril.png | Bin 238 -> 142 bytes .../textures/moreores_mineral_silver.png | Bin 259 -> 153 bytes .../textures/moreores_mineral_tin.png | Bin 254 -> 142 bytes .../textures/moreores_mithril_block.png | Bin 614 -> 372 bytes .../textures/moreores_mithril_ingot.png | Bin 346 -> 267 bytes .../textures/moreores_mithril_lump.png | Bin 365 -> 221 bytes .../textures/moreores_silver_block.png | Bin 270 -> 142 bytes .../textures/moreores_silver_ingot.png | Bin 350 -> 181 bytes .../textures/moreores_silver_lump.png | Bin 356 -> 221 bytes mods/moreores/textures/moreores_tin_block.png | Bin 269 -> 142 bytes mods/moreores/textures/moreores_tin_ingot.png | Bin 361 -> 259 bytes mods/moreores/textures/moreores_tin_lump.png | Bin 361 -> 225 bytes .../textures/moreores_tool_bronzeaxe.png | Bin 224 -> 142 bytes .../textures/moreores_tool_bronzepick.png | Bin 286 -> 160 bytes .../textures/moreores_tool_bronzeshovel.png | Bin 253 -> 148 bytes .../textures/moreores_tool_bronzesword.png | Bin 274 -> 172 bytes .../textures/moreores_tool_goldaxe.png | Bin 225 -> 142 bytes .../textures/moreores_tool_goldpick.png | Bin 294 -> 171 bytes .../textures/moreores_tool_goldshovel.png | Bin 256 -> 148 bytes .../textures/moreores_tool_goldsword.png | Bin 275 -> 172 bytes .../textures/moreores_tool_mithrilaxe.png | Bin 211 -> 140 bytes .../textures/moreores_tool_mithrilhoe.png | Bin 337 -> 203 bytes .../textures/moreores_tool_mithrilpick.png | Bin 279 -> 165 bytes .../textures/moreores_tool_mithrilshovel.png | Bin 242 -> 148 bytes .../textures/moreores_tool_mithrilsword.png | Bin 296 -> 172 bytes .../textures/moreores_tool_silveraxe.png | Bin 218 -> 142 bytes .../textures/moreores_tool_silverhoe.png | Bin 337 -> 202 bytes .../textures/moreores_tool_silverpick.png | Bin 290 -> 166 bytes .../textures/moreores_tool_silvershovel.png | Bin 254 -> 148 bytes .../textures/moreores_tool_silversword.png | Bin 299 -> 172 bytes mods/moretrees/depends.txt | 4 +- mods/moretrees/init.lua | 15 +- mods/moretrees/leafdecay.lua | 32 +- mods/moretrees/node_defs.lua | 83 +- mods/pipeworks/autoplace_tubes.lua | 110 +-- mods/pipeworks/common.lua | 144 +++ mods/pipeworks/compat.lua | 158 ++- mods/pipeworks/crafts.lua | 76 +- mods/pipeworks/default_settings.txt | 1 + mods/pipeworks/deployer.lua | 286 ------ mods/pipeworks/devices.lua | 3 +- mods/pipeworks/init.lua | 6 +- mods/pipeworks/item_transport.lua | 731 +++++++------- mods/pipeworks/legacy.lua | 60 ++ mods/pipeworks/luaentity.lua | 334 +++++++ mods/pipeworks/node_breaker.lua | 281 ------ mods/pipeworks/teleport_tube.lua | 103 +- .../textures/homedecor_oil_extract.png | Bin 0 -> 383 bytes .../pipeworks/textures/homedecor_paraffin.png | Bin 0 -> 600 bytes .../textures/homedecor_plastic_base.png | Bin 440 -> 0 bytes .../textures/homedecor_plastic_base_inv.png | Bin 569 -> 0 bytes .../textures/homedecor_plastic_sheeting.png | Bin 169 -> 380 bytes .../textures/pipeworks_dispenser_back.png | Bin 0 -> 2031 bytes .../textures/pipeworks_dispenser_bottom.png | Bin 0 -> 4508 bytes .../pipeworks_dispenser_front_off.png | Bin 0 -> 4722 bytes .../textures/pipeworks_dispenser_front_on.png | Bin 0 -> 4676 bytes .../textures/pipeworks_dispenser_side1.png | Bin 0 -> 4519 bytes .../textures/pipeworks_dispenser_side2.png | Bin 0 -> 4518 bytes .../textures/pipeworks_dispenser_top.png | Bin 0 -> 4501 bytes .../textures/pipeworks_trashcan_bottom.png | Bin 0 -> 186 bytes .../textures/pipeworks_trashcan_side.png | Bin 0 -> 100 bytes mods/pipeworks/trashcan.lua | 49 + mods/pipeworks/tubes.lua | 296 +++--- mods/pipeworks/wielder.lua | 423 ++++++++ mods/plants_lib/depends.txt | 1 - mods/plants_lib/init.lua | 376 +++++-- mods/skylands/abms.lua | 3 +- mods/skylands/init.lua | 7 +- mods/skylands/pools.lua | 3 + .../textures/skylands_cavorite_handle.png | Bin 0 -> 251 bytes .../skylands_cavorite_tool_bronzeaxe.png | Bin 0 -> 308 bytes .../skylands_cavorite_tool_bronzepick.png | Bin 0 -> 376 bytes .../skylands_cavorite_tool_bronzeshovel.png | Bin 0 -> 391 bytes .../skylands_cavorite_tool_bronzesword.png | Bin 0 -> 293 bytes .../skylands_cavorite_tool_diamondaxe.png | Bin 0 -> 316 bytes .../skylands_cavorite_tool_diamondpick.png | Bin 0 -> 380 bytes .../skylands_cavorite_tool_diamondshovel.png | Bin 0 -> 382 bytes .../skylands_cavorite_tool_diamondsword.png | Bin 0 -> 309 bytes .../skylands_cavorite_tool_meseaxe.png | Bin 0 -> 311 bytes .../skylands_cavorite_tool_mesepick.png | Bin 0 -> 315 bytes .../skylands_cavorite_tool_meseshovel.png | Bin 0 -> 375 bytes .../skylands_cavorite_tool_mesesword.png | Bin 0 -> 285 bytes .../skylands_cavorite_tool_steelaxe.png | Bin 0 -> 315 bytes .../skylands_cavorite_tool_steelpick.png | Bin 0 -> 326 bytes .../skylands_cavorite_tool_steelshovel.png | Bin 0 -> 367 bytes .../skylands_cavorite_tool_steelsword.png | Bin 0 -> 274 bytes .../skylands_cavorite_tool_stoneaxe.png | Bin 0 -> 310 bytes .../skylands_cavorite_tool_stonepick.png | Bin 0 -> 399 bytes .../skylands_cavorite_tool_stoneshovel.png | Bin 0 -> 374 bytes .../skylands_cavorite_tool_stonesword.png | Bin 0 -> 363 bytes .../skylands_cavorite_tool_woodaxe.png | Bin 0 -> 312 bytes .../skylands_cavorite_tool_woodpick.png | Bin 0 -> 371 bytes .../skylands_cavorite_tool_woodshovel.png | Bin 0 -> 355 bytes .../skylands_cavorite_tool_woodsword.png | Bin 0 -> 323 bytes mods/skylands/tools.lua | 570 +++++++++++ mods/technic-master/.gitattributes | 22 + mods/technic-master/.gitignore | 167 ++++ mods/technic-master/README.md | 22 + mods/technic-master/concrete/depends.txt | 3 + mods/technic-master/concrete/init.lua | 262 +++++ mods/technic-master/concrete/locale/de.txt | 10 + .../concrete/locale/template.txt | 8 + ...technic_blast_resistant_concrete_block.png | Bin 0 -> 311 bytes .../textures/technic_concrete_block.png | Bin 0 -> 500 bytes .../concrete/textures/technic_rebar.png | Bin 0 -> 813 bytes .../textures/x32/technic_concrete_block.png | Bin 0 -> 2319 bytes .../concrete/textures/x32/technic_rebar.png | Bin 0 -> 813 bytes mods/technic-master/extranodes/depends.txt | 6 + mods/technic-master/extranodes/init.lua | 86 ++ mods/technic-master/extranodes/locale/de.txt | 9 + .../extranodes/locale/template.txt | 7 + mods/technic-master/manual.md | 821 ++++++++++++++++ mods/technic-master/modpack.txt | 1 + mods/technic-master/technic/README.md | 24 + mods/technic-master/technic/config.lua | 17 + mods/technic-master/technic/crafts.lua | 202 ++++ mods/technic-master/technic/depends.txt | 7 + mods/technic-master/technic/helpers.lua | 38 + mods/technic-master/technic/init.lua | 53 + mods/technic-master/technic/items.lua | 225 +++++ mods/technic-master/technic/legacy.lua | 38 + mods/technic-master/technic/locale/de.txt | 199 ++++ mods/technic-master/technic/locale/es.txt | 192 ++++ mods/technic-master/technic/locale/it.txt | 196 ++++ .../technic/locale/template.txt | 205 ++++ .../technic/machines/HV/battery_box.lua | 21 + .../technic/machines/HV/cables.lua | 12 + .../technic/machines/HV/forcefield.lua | 243 +++++ .../technic/machines/HV/generator.lua | 13 + .../technic/machines/HV/init.lua | 18 + .../technic/machines/HV/nuclear_reactor.lua | 715 ++++++++++++++ .../technic/machines/HV/quarry.lua | 184 ++++ .../technic/machines/HV/solar_array.lua | 14 + .../technic/machines/LV/alloy_furnace.lua | 14 + .../technic/machines/LV/battery_box.lua | 19 + .../technic/machines/LV/cables.lua | 14 + .../technic/machines/LV/cnc.lua | 231 +++++ .../technic/machines/LV/cnc_api.lua | 356 +++++++ .../technic/machines/LV/cnc_nodes.lua | 96 ++ .../machines/LV/coal_alloy_furnace.lua | 165 ++++ .../technic/machines/LV/coal_furnace.lua | 5 + .../technic/machines/LV/compressor.lua | 13 + .../technic/machines/LV/electric_furnace.lua | 16 + .../technic/machines/LV/extractor.lua | 13 + .../technic/machines/LV/generator.lua | 18 + .../technic/machines/LV/geothermal.lua | 111 +++ .../technic/machines/LV/grinder.lua | 13 + .../technic/machines/LV/init.lua | 33 + .../technic/machines/LV/music_player.lua | 130 +++ .../technic/machines/LV/solar_array.lua | 18 + .../technic/machines/LV/solar_panel.lua | 67 ++ .../technic/machines/LV/water_mill.lua | 102 ++ .../technic/machines/MV/alloy_furnace.lua | 14 + .../technic/machines/MV/battery_box.lua | 22 + .../technic/machines/MV/cables.lua | 14 + .../technic/machines/MV/centrifuge.lua | 16 + .../technic/machines/MV/compressor.lua | 12 + .../technic/machines/MV/electric_furnace.lua | 18 + .../technic/machines/MV/extractor.lua | 12 + .../technic/machines/MV/generator.lua | 13 + .../technic/machines/MV/grinder.lua | 13 + .../technic/machines/MV/init.lua | 32 + .../technic/machines/MV/lighting.lua | 590 +++++++++++ .../technic/machines/MV/power_radiator.lua | 220 +++++ .../technic/machines/MV/solar_array.lua | 14 + .../technic/machines/MV/tool_workshop.lua | 85 ++ .../technic/machines/MV/wind_mill.lua | 87 ++ mods/technic-master/technic/machines/init.lua | 14 + .../technic/machines/other/anchor.lua | 109 ++ .../technic/machines/other/constructor.lua | 189 ++++ .../technic/machines/other/frames.lua | 928 ++++++++++++++++++ .../technic/machines/other/init.lua | 9 + .../technic/machines/other/injector.lua | 107 ++ .../machines/register/alloy_furnace.lua | 10 + .../machines/register/alloy_recipes.lua | 31 + .../technic/machines/register/battery_box.lua | 282 ++++++ .../technic/machines/register/cables.lua | 173 ++++ .../technic/machines/register/centrifuge.lua | 8 + .../machines/register/centrifuge_recipes.lua | 38 + .../technic/machines/register/common.lua | 154 +++ .../technic/machines/register/compressor.lua | 9 + .../machines/register/compressor_recipes.lua | 24 + .../machines/register/electric_furnace.lua | 9 + .../technic/machines/register/extractor.lua | 9 + .../machines/register/extractor_recipes.lua | 32 + .../technic/machines/register/generator.lua | 168 ++++ .../technic/machines/register/grinder.lua | 9 + .../machines/register/grinder_recipes.lua | 131 +++ .../technic/machines/register/init.lua | 30 + .../machines/register/machine_base.lua | 178 ++++ .../technic/machines/register/recipes.lua | 97 ++ .../technic/machines/register/solar_array.lua | 63 ++ .../technic/machines/supply_converter.lua | 82 ++ .../technic/machines/switching_station.lua | 408 ++++++++ mods/technic-master/technic/register.lua | 59 ++ .../technic/sounds/chainsaw.ogg | Bin 0 -> 38174 bytes .../technic/sounds/item_drop_pickup.1.ogg | Bin 0 -> 9981 bytes .../technic/sounds/item_drop_pickup.2.ogg | Bin 0 -> 10477 bytes .../technic/sounds/item_drop_pickup.3.ogg | Bin 0 -> 9586 bytes .../technic/sounds/item_drop_pickup.4.ogg | Bin 0 -> 9696 bytes .../technic/sounds/mining_drill.ogg | Bin 0 -> 14499 bytes ...technic_hv_nuclear_reactor_siren_clear.ogg | Bin 0 -> 31184 bytes ...c_hv_nuclear_reactor_siren_danger_loop.ogg | Bin 0 -> 13059 bytes .../technic/sounds/technic_laser_mk1.0.ogg | Bin 0 -> 13465 bytes .../technic/sounds/technic_laser_mk1.1.ogg | Bin 0 -> 10281 bytes .../technic/sounds/technic_laser_mk2.0.ogg | Bin 0 -> 16766 bytes .../technic/sounds/technic_laser_mk2.1.ogg | Bin 0 -> 17725 bytes .../technic/sounds/technic_laser_mk2.2.ogg | Bin 0 -> 14627 bytes .../technic/sounds/technic_laser_mk3.1.ogg | Bin 0 -> 12162 bytes .../technic/sounds/technic_laser_mk3.2.ogg | Bin 0 -> 12040 bytes .../technic/sounds/technic_prospector_hit.ogg | Bin 0 -> 4698 bytes .../sounds/technic_prospector_miss.ogg | Bin 0 -> 4481 bytes .../sounds/technic_sonic_screwdriver.ogg | Bin 0 -> 29827 bytes .../technic_hv_nuclear_reactor_core_128.png | Bin 0 -> 26143 bytes .../technic_hv_nuclear_reactor_core_16.png | Bin 0 -> 896 bytes .../technic_hv_nuclear_reactor_core_256.png | Bin 0 -> 84243 bytes .../technic_hv_nuclear_reactor_core_32.png | Bin 0 -> 2545 bytes .../technic_hv_nuclear_reactor_core_512.png | Bin 0 -> 254444 bytes .../technic_hv_nuclear_reactor_core_64.png | Bin 0 -> 8114 bytes .../technic/textures/power_meter.png | Bin 0 -> 463 bytes .../technic/textures/technic_admin_anchor.png | Bin 0 -> 873 bytes .../technic/textures/technic_akalin_dust.png | Bin 0 -> 240 bytes .../technic/textures/technic_alatro_dust.png | Bin 0 -> 241 bytes .../technic/textures/technic_arol_dust.png | Bin 0 -> 227 bytes .../technic/textures/technic_battery.png | Bin 0 -> 247 bytes .../textures/technic_battery_box_side.png | Bin 0 -> 576 bytes .../textures/technic_battery_box_side8.png | Bin 0 -> 639 bytes .../textures/technic_battery_box_side_mv.png | Bin 0 -> 587 bytes .../textures/technic_battery_meter_fg.png | Bin 0 -> 260 bytes .../textures/technic_battery_reload.png | Bin 0 -> 287 bytes .../technic/textures/technic_bronze_dust.png | Bin 0 -> 461 bytes .../textures/technic_bucket_corium.png | Bin 0 -> 256 bytes .../technic/textures/technic_carbon_cloth.png | Bin 0 -> 169 bytes .../technic/textures/technic_carbon_plate.png | Bin 0 -> 162 bytes .../textures/technic_carbon_steel_dust.png | Bin 0 -> 416 bytes .../textures/technic_cast_iron_dust.png | Bin 0 -> 420 bytes .../technic/textures/technic_chainsaw.png | Bin 0 -> 529 bytes .../textures/technic_chernobylite_block.png | Bin 0 -> 666 bytes .../textures/technic_chromium_dust.png | Bin 0 -> 443 bytes .../technic/textures/technic_cnc_bottom.png | Bin 0 -> 2006 bytes .../technic/textures/technic_cnc_cylinder.png | Bin 0 -> 456 bytes .../technic_cnc_cylinder_horizontal.png | Bin 0 -> 463 bytes .../textures/technic_cnc_element_cross.png | Bin 0 -> 415 bytes .../textures/technic_cnc_element_edge.png | Bin 0 -> 409 bytes .../textures/technic_cnc_element_end.png | Bin 0 -> 391 bytes .../textures/technic_cnc_element_straight.png | Bin 0 -> 412 bytes .../textures/technic_cnc_element_t.png | Bin 0 -> 389 bytes .../technic/textures/technic_cnc_front.png | Bin 0 -> 2000 bytes .../textures/technic_cnc_front_active.png | Bin 0 -> 2216 bytes .../technic/textures/technic_cnc_full.png | Bin 0 -> 372 bytes .../technic/textures/technic_cnc_half.png | Bin 0 -> 460 bytes .../technic_cnc_milling_background.png | Bin 0 -> 78748 bytes .../textures/technic_cnc_onecurvededge.png | Bin 0 -> 507 bytes .../technic/textures/technic_cnc_pyramid.png | Bin 0 -> 480 bytes .../technic/textures/technic_cnc_side.png | Bin 0 -> 1922 bytes .../technic/textures/technic_cnc_slope.png | Bin 0 -> 437 bytes .../textures/technic_cnc_slope_edge.png | Bin 0 -> 419 bytes .../technic_cnc_slope_edge_upsdwn.png | Bin 0 -> 486 bytes .../textures/technic_cnc_slope_inner_edge.png | Bin 0 -> 497 bytes .../technic_cnc_slope_inner_edge_upsdwn.png | Bin 0 -> 605 bytes .../textures/technic_cnc_slope_lying.png | Bin 0 -> 548 bytes .../textures/technic_cnc_slope_upsdwn.png | Bin 0 -> 440 bytes .../technic/textures/technic_cnc_sphere.png | Bin 0 -> 532 bytes .../technic/textures/technic_cnc_spike.png | Bin 0 -> 556 bytes .../technic/textures/technic_cnc_stick.png | Bin 0 -> 320 bytes .../technic/textures/technic_cnc_top.png | Bin 0 -> 2137 bytes .../textures/technic_cnc_top_active.png | Bin 0 -> 2214 bytes .../textures/technic_cnc_twocurvededge.png | Bin 0 -> 768 bytes .../technic_coal_alloy_furnace_bottom.png | Bin 0 -> 677 bytes .../technic_coal_alloy_furnace_front.png | Bin 0 -> 681 bytes ...echnic_coal_alloy_furnace_front_active.png | Bin 0 -> 697 bytes .../technic_coal_alloy_furnace_side.png | Bin 0 -> 596 bytes .../technic_coal_alloy_furnace_top.png | Bin 0 -> 596 bytes .../technic/textures/technic_coal_dust.png | Bin 0 -> 433 bytes .../textures/technic_composite_plate.png | Bin 0 -> 165 bytes .../textures/technic_constructor_back.png | Bin 0 -> 638 bytes .../technic_constructor_front_off.png | Bin 0 -> 635 bytes .../textures/technic_constructor_front_on.png | Bin 0 -> 690 bytes .../technic_constructor_mk1_bottom_off.png | Bin 0 -> 638 bytes .../technic_constructor_mk1_bottom_on.png | Bin 0 -> 664 bytes .../technic_constructor_mk1_side1_off.png | Bin 0 -> 671 bytes .../technic_constructor_mk1_side1_on.png | Bin 0 -> 687 bytes .../technic_constructor_mk1_side2_off.png | Bin 0 -> 654 bytes .../technic_constructor_mk1_side2_on.png | Bin 0 -> 671 bytes .../technic_constructor_mk1_top_off.png | Bin 0 -> 626 bytes .../technic_constructor_mk1_top_on.png | Bin 0 -> 644 bytes .../technic_constructor_mk2_bottom_off.png | Bin 0 -> 665 bytes .../technic_constructor_mk2_bottom_on.png | Bin 0 -> 694 bytes .../technic_constructor_mk2_side1_off.png | Bin 0 -> 701 bytes .../technic_constructor_mk2_side1_on.png | Bin 0 -> 719 bytes .../technic_constructor_mk2_side2_off.png | Bin 0 -> 683 bytes .../technic_constructor_mk2_side2_on.png | Bin 0 -> 708 bytes .../technic_constructor_mk2_top_off.png | Bin 0 -> 654 bytes .../technic_constructor_mk2_top_on.png | Bin 0 -> 685 bytes .../technic_constructor_mk3_bottom_off.png | Bin 0 -> 700 bytes .../technic_constructor_mk3_bottom_on.png | Bin 0 -> 721 bytes .../technic_constructor_mk3_side1_off.png | Bin 0 -> 727 bytes .../technic_constructor_mk3_side1_on.png | Bin 0 -> 762 bytes .../technic_constructor_mk3_side2_off.png | Bin 0 -> 715 bytes .../technic_constructor_mk3_side2_on.png | Bin 0 -> 753 bytes .../technic_constructor_mk3_top_off.png | Bin 0 -> 687 bytes .../technic_constructor_mk3_top_on.png | Bin 0 -> 725 bytes .../textures/technic_control_logic_unit.png | Bin 0 -> 652 bytes .../technic/textures/technic_copper_coil.png | Bin 0 -> 2447 bytes .../technic/textures/technic_copper_dust.png | Bin 0 -> 466 bytes .../technic/textures/technic_copper_plate.png | Bin 0 -> 174 bytes .../technic_corium_flowing_animated.png | Bin 0 -> 3278 bytes .../technic_corium_source_animated.png | Bin 0 -> 2954 bytes .../textures/technic_deployer_back.png | Bin 0 -> 757 bytes .../textures/technic_deployer_bottom.png | Bin 0 -> 835 bytes .../textures/technic_deployer_front_off.png | Bin 0 -> 800 bytes .../textures/technic_deployer_front_on.png | Bin 0 -> 719 bytes .../textures/technic_deployer_side.png | Bin 0 -> 908 bytes .../textures/technic_deployer_side1.png | Bin 0 -> 908 bytes .../textures/technic_deployer_side2.png | Bin 0 -> 910 bytes .../technic/textures/technic_deployer_top.png | Bin 0 -> 842 bytes .../textures/technic_diamond_block_blue.png | Bin 0 -> 651 bytes .../textures/technic_diamond_block_green.png | Bin 0 -> 636 bytes .../textures/technic_diamond_block_red.png | Bin 0 -> 651 bytes .../textures/technic_diamond_drill_head.png | Bin 0 -> 978 bytes .../textures/technic_doped_silicon_wafer.png | Bin 0 -> 331 bytes .../textures/technic_fine_copper_wire.png | Bin 0 -> 501 bytes .../textures/technic_fine_gold_wire.png | Bin 0 -> 474 bytes .../textures/technic_fine_silver_wire.png | Bin 0 -> 546 bytes .../technic/textures/technic_flashlight.png | Bin 0 -> 679 bytes .../textures/technic_forcefield_animated.png | Bin 0 -> 3274 bytes .../technic_forcefield_emitter_off.png | Bin 0 -> 204 bytes .../technic_forcefield_emitter_on.png | Bin 0 -> 204 bytes .../technic/textures/technic_frame.png | Bin 0 -> 32199 bytes .../textures/technic_geothermal_side.png | Bin 0 -> 809 bytes .../textures/technic_geothermal_top.png | Bin 0 -> 828 bytes .../technic_geothermal_top_active.png | Bin 0 -> 819 bytes .../technic/textures/technic_gold_dust.png | Bin 0 -> 468 bytes .../technic/textures/technic_graphite.png | Bin 0 -> 140 bytes .../textures/technic_grinder_front.png | Bin 0 -> 777 bytes .../technic/textures/technic_grinder_side.png | Bin 0 -> 692 bytes .../technic/textures/technic_grinder_top.png | Bin 0 -> 465 bytes ...c_homedecor_glowlight_cube_white_sides.png | Bin 0 -> 255 bytes ...cor_glowlight_cube_white_sides_ceiling.png | Bin 0 -> 258 bytes ...hnic_homedecor_glowlight_cube_white_tb.png | Bin 0 -> 261 bytes ..._homedecor_glowlight_cube_yellow_sides.png | Bin 0 -> 350 bytes ...or_glowlight_cube_yellow_sides_ceiling.png | Bin 0 -> 353 bytes ...nic_homedecor_glowlight_cube_yellow_tb.png | Bin 0 -> 352 bytes ..._homedecor_glowlight_thick_white_sides.png | Bin 0 -> 264 bytes ...decor_glowlight_thick_white_wall_sides.png | Bin 0 -> 265 bytes ...homedecor_glowlight_thick_yellow_sides.png | Bin 0 -> 475 bytes ...ecor_glowlight_thick_yellow_wall_sides.png | Bin 0 -> 478 bytes ...c_homedecor_glowlight_thin_white_sides.png | Bin 0 -> 225 bytes ...edecor_glowlight_thin_white_wall_sides.png | Bin 0 -> 232 bytes ..._homedecor_glowlight_thin_yellow_sides.png | Bin 0 -> 335 bytes ...decor_glowlight_thin_yellow_wall_sides.png | Bin 0 -> 355 bytes .../technic_homedecor_glowlight_white_tb.png | Bin 0 -> 330 bytes .../technic_homedecor_glowlight_yellow_tb.png | Bin 0 -> 633 bytes .../technic_hv_battery_box_bottom.png | Bin 0 -> 653 bytes .../textures/technic_hv_battery_box_side.png | Bin 0 -> 777 bytes .../textures/technic_hv_battery_box_top.png | Bin 0 -> 792 bytes .../technic/textures/technic_hv_cable.png | Bin 0 -> 1705 bytes .../textures/technic_hv_cable_wield.png | Bin 0 -> 601 bytes .../technic_hv_down_converter_bottom.png | Bin 0 -> 653 bytes .../technic_hv_down_converter_side.png | Bin 0 -> 609 bytes .../technic_hv_down_converter_top.png | Bin 0 -> 653 bytes .../textures/technic_hv_generator_front.png | Bin 0 -> 450 bytes .../technic_hv_generator_front_active.png | Bin 0 -> 469 bytes .../textures/technic_hv_generator_side.png | Bin 0 -> 357 bytes .../textures/technic_hv_generator_top.png | Bin 0 -> 384 bytes .../textures/technic_hv_grinder_bottom.png | Bin 0 -> 862 bytes .../textures/technic_hv_grinder_front.png | Bin 0 -> 716 bytes .../technic_hv_grinder_front_active.png | Bin 0 -> 733 bytes .../textures/technic_hv_grinder_side.png | Bin 0 -> 753 bytes .../textures/technic_hv_grinder_side_tube.png | Bin 0 -> 791 bytes .../textures/technic_hv_grinder_top.png | Bin 0 -> 616 bytes .../technic_hv_nuclear_reactor_core.png | Bin 0 -> 896 bytes .../technic_hv_solar_array_bottom.png | Bin 0 -> 574 bytes .../textures/technic_hv_solar_array_side.png | Bin 0 -> 709 bytes .../textures/technic_hv_solar_array_top.png | Bin 0 -> 777 bytes .../textures/technic_hv_transformer.png | Bin 0 -> 1801 bytes .../textures/technic_injector_bottom.png | Bin 0 -> 2667 bytes .../textures/technic_injector_side.png | Bin 0 -> 2541 bytes .../technic/textures/technic_injector_top.png | Bin 0 -> 2633 bytes .../technic/textures/technic_kalite_dust.png | Bin 0 -> 191 bytes .../textures/technic_laser_beam_mk1.png | Bin 0 -> 279 bytes .../textures/technic_laser_beam_mk2.png | Bin 0 -> 638 bytes .../textures/technic_laser_beam_mk3.png | Bin 0 -> 547 bytes .../technic/textures/technic_lava_can.png | Bin 0 -> 445 bytes .../technic/textures/technic_light.png | Bin 0 -> 246 bytes .../technic_lv_alloy_furnace_bottom.png | Bin 0 -> 738 bytes .../technic_lv_alloy_furnace_front.png | Bin 0 -> 508 bytes .../technic_lv_alloy_furnace_front_active.png | Bin 0 -> 543 bytes .../technic_lv_alloy_furnace_side.png | Bin 0 -> 313 bytes .../textures/technic_lv_alloy_furnace_top.png | Bin 0 -> 397 bytes .../technic_lv_battery_box_bottom.png | Bin 0 -> 738 bytes .../textures/technic_lv_battery_box_side.png | Bin 0 -> 594 bytes .../textures/technic_lv_battery_box_top.png | Bin 0 -> 337 bytes .../technic/textures/technic_lv_cable.png | Bin 0 -> 504 bytes .../textures/technic_lv_cable_wield.png | Bin 0 -> 655 bytes .../textures/technic_lv_compressor_back.png | Bin 0 -> 2893 bytes .../textures/technic_lv_compressor_bottom.png | Bin 0 -> 2865 bytes .../textures/technic_lv_compressor_front.png | Bin 0 -> 2714 bytes .../technic_lv_compressor_front_active.png | Bin 0 -> 2743 bytes .../textures/technic_lv_compressor_side.png | Bin 0 -> 2893 bytes .../textures/technic_lv_compressor_top.png | Bin 0 -> 2940 bytes .../technic_lv_electric_furnace_bottom.png | Bin 0 -> 423 bytes .../technic_lv_electric_furnace_front.png | Bin 0 -> 443 bytes ...chnic_lv_electric_furnace_front_active.png | Bin 0 -> 448 bytes .../technic_lv_electric_furnace_side.png | Bin 0 -> 399 bytes .../technic_lv_electric_furnace_top.png | Bin 0 -> 393 bytes .../textures/technic_lv_extractor_bottom.png | Bin 0 -> 738 bytes .../textures/technic_lv_extractor_front.png | Bin 0 -> 745 bytes .../technic_lv_extractor_front_active.png | Bin 0 -> 770 bytes .../textures/technic_lv_extractor_side.png | Bin 0 -> 683 bytes .../textures/technic_lv_extractor_top.png | Bin 0 -> 544 bytes .../textures/technic_lv_generator_front.png | Bin 0 -> 430 bytes .../technic_lv_generator_front_active.png | Bin 0 -> 454 bytes .../textures/technic_lv_generator_side.png | Bin 0 -> 341 bytes .../textures/technic_lv_generator_top.png | Bin 0 -> 388 bytes .../textures/technic_lv_grinder_bottom.png | Bin 0 -> 738 bytes .../textures/technic_lv_grinder_front.png | Bin 0 -> 745 bytes .../technic_lv_grinder_front_active.png | Bin 0 -> 770 bytes .../textures/technic_lv_grinder_side.png | Bin 0 -> 683 bytes .../textures/technic_lv_grinder_top.png | Bin 0 -> 544 bytes .../technic_lv_solar_array_bottom.png | Bin 0 -> 579 bytes .../textures/technic_lv_solar_array_side.png | Bin 0 -> 465 bytes .../textures/technic_lv_solar_array_top.png | Bin 0 -> 743 bytes .../textures/technic_lv_transformer.png | Bin 0 -> 1821 bytes .../textures/technic_machine_bottom.png | Bin 0 -> 572 bytes .../textures/technic_machine_casing.png | Bin 0 -> 673 bytes .../technic/textures/technic_mining_drill.png | Bin 0 -> 2099 bytes .../textures/technic_mining_drill_mk2.png | Bin 0 -> 1901 bytes .../textures/technic_mining_drill_mk3.png | Bin 0 -> 1900 bytes .../textures/technic_mining_laser_mk1.png | Bin 0 -> 216 bytes .../textures/technic_mining_laser_mk2.png | Bin 0 -> 244 bytes .../textures/technic_mining_laser_mk3.png | Bin 0 -> 312 bytes .../technic/textures/technic_mithril_dust.png | Bin 0 -> 467 bytes .../textures/technic_mixed_metal_ingot.png | Bin 0 -> 426 bytes .../technic/textures/technic_motor.png | Bin 0 -> 2517 bytes .../textures/technic_music_player_bottom.png | Bin 0 -> 744 bytes .../textures/technic_music_player_side.png | Bin 0 -> 788 bytes .../textures/technic_music_player_top.png | Bin 0 -> 916 bytes .../technic_mv_alloy_furnace_bottom.png | Bin 0 -> 738 bytes .../technic_mv_alloy_furnace_front.png | Bin 0 -> 2670 bytes .../technic_mv_alloy_furnace_front_active.png | Bin 0 -> 2673 bytes .../technic_mv_alloy_furnace_side.png | Bin 0 -> 2503 bytes .../technic_mv_alloy_furnace_side_tube.png | Bin 0 -> 403 bytes .../textures/technic_mv_alloy_furnace_top.png | Bin 0 -> 1929 bytes .../technic_mv_battery_box_bottom.png | Bin 0 -> 738 bytes .../textures/technic_mv_battery_box_side.png | Bin 0 -> 587 bytes .../textures/technic_mv_battery_box_top.png | Bin 0 -> 337 bytes .../technic/textures/technic_mv_cable.png | Bin 0 -> 416 bytes .../textures/technic_mv_cable_wield.png | Bin 0 -> 531 bytes .../textures/technic_mv_centrifuge_bottom.png | Bin 0 -> 674 bytes .../textures/technic_mv_centrifuge_front.png | Bin 0 -> 686 bytes .../technic_mv_centrifuge_front_active.png | Bin 0 -> 686 bytes .../textures/technic_mv_centrifuge_side.png | Bin 0 -> 636 bytes .../textures/technic_mv_centrifuge_top.png | Bin 0 -> 814 bytes .../textures/technic_mv_compressor_back.png | Bin 0 -> 2893 bytes .../textures/technic_mv_compressor_bottom.png | Bin 0 -> 2865 bytes .../textures/technic_mv_compressor_front.png | Bin 0 -> 2714 bytes .../technic_mv_compressor_front_active.png | Bin 0 -> 2743 bytes .../textures/technic_mv_compressor_side.png | Bin 0 -> 2893 bytes .../textures/technic_mv_compressor_top.png | Bin 0 -> 2940 bytes .../technic_mv_down_converter_bottom.png | Bin 0 -> 738 bytes .../technic_mv_down_converter_side.png | Bin 0 -> 670 bytes .../technic_mv_down_converter_top.png | Bin 0 -> 738 bytes .../technic_mv_electric_furnace_bottom.png | Bin 0 -> 427 bytes .../technic_mv_electric_furnace_front.png | Bin 0 -> 535 bytes ...chnic_mv_electric_furnace_front_active.png | Bin 0 -> 541 bytes .../technic_mv_electric_furnace_side.png | Bin 0 -> 421 bytes .../technic_mv_electric_furnace_side_tube.png | Bin 0 -> 2449 bytes .../technic_mv_electric_furnace_top.png | Bin 0 -> 1772 bytes .../textures/technic_mv_extractor_bottom.png | Bin 0 -> 738 bytes .../textures/technic_mv_extractor_front.png | Bin 0 -> 749 bytes .../technic_mv_extractor_front_active.png | Bin 0 -> 778 bytes .../textures/technic_mv_extractor_side.png | Bin 0 -> 726 bytes .../textures/technic_mv_extractor_top.png | Bin 0 -> 542 bytes .../textures/technic_mv_generator_front.png | Bin 0 -> 425 bytes .../technic_mv_generator_front_active.png | Bin 0 -> 440 bytes .../textures/technic_mv_generator_side.png | Bin 0 -> 317 bytes .../textures/technic_mv_generator_top.png | Bin 0 -> 322 bytes .../textures/technic_mv_grinder_bottom.png | Bin 0 -> 738 bytes .../textures/technic_mv_grinder_front.png | Bin 0 -> 749 bytes .../technic_mv_grinder_front_active.png | Bin 0 -> 778 bytes .../textures/technic_mv_grinder_side.png | Bin 0 -> 726 bytes .../textures/technic_mv_grinder_side_tube.png | Bin 0 -> 739 bytes .../textures/technic_mv_grinder_top.png | Bin 0 -> 542 bytes .../technic_mv_solar_array_bottom.png | Bin 0 -> 574 bytes .../textures/technic_mv_solar_array_side.png | Bin 0 -> 628 bytes .../textures/technic_mv_solar_array_top.png | Bin 0 -> 728 bytes .../textures/technic_mv_transformer.png | Bin 0 -> 1748 bytes .../textures/technic_nodebreaker_back.png | Bin 0 -> 632 bytes .../textures/technic_nodebreaker_bottom.png | Bin 0 -> 38757 bytes .../technic_nodebreaker_bottom_off.png | Bin 0 -> 556 bytes .../technic_nodebreaker_bottom_on.png | Bin 0 -> 549 bytes .../technic_nodebreaker_front_off.png | Bin 0 -> 653 bytes .../textures/technic_nodebreaker_front_on.png | Bin 0 -> 659 bytes .../textures/technic_nodebreaker_side.png | Bin 0 -> 38136 bytes .../textures/technic_nodebreaker_side1.png | Bin 0 -> 38291 bytes .../technic_nodebreaker_side1_off.png | Bin 0 -> 616 bytes .../textures/technic_nodebreaker_side1_on.png | Bin 0 -> 610 bytes .../textures/technic_nodebreaker_side2.png | Bin 0 -> 38195 bytes .../technic_nodebreaker_side2_off.png | Bin 0 -> 606 bytes .../textures/technic_nodebreaker_side2_on.png | Bin 0 -> 598 bytes .../textures/technic_nodebreaker_top.png | Bin 0 -> 38904 bytes .../textures/technic_nodebreaker_top_off.png | Bin 0 -> 556 bytes .../textures/technic_nodebreaker_top_on.png | Bin 0 -> 558 bytes .../technic/textures/technic_power_meter.png | Bin 0 -> 209 bytes .../technic/textures/technic_power_meter0.png | Bin 0 -> 103 bytes .../technic/textures/technic_power_meter1.png | Bin 0 -> 193 bytes .../technic/textures/technic_power_meter2.png | Bin 0 -> 232 bytes .../technic/textures/technic_power_meter3.png | Bin 0 -> 255 bytes .../technic/textures/technic_power_meter4.png | Bin 0 -> 268 bytes .../technic/textures/technic_power_meter5.png | Bin 0 -> 275 bytes .../technic/textures/technic_power_meter6.png | Bin 0 -> 281 bytes .../technic/textures/technic_power_meter7.png | Bin 0 -> 298 bytes .../technic/textures/technic_power_meter8.png | Bin 0 -> 314 bytes .../textures/technic_power_meter_bg.png | Bin 0 -> 278 bytes .../textures/technic_power_meter_fg.png | Bin 0 -> 465 bytes .../technic/textures/technic_prospector.png | Bin 0 -> 367 bytes .../technic/textures/technic_raw_latex.png | Bin 0 -> 484 bytes .../technic/textures/technic_rubber.png | Bin 0 -> 587 bytes .../textures/technic_rubber_leaves.png | Bin 0 -> 444 bytes .../textures/technic_rubber_sapling.png | Bin 0 -> 333 bytes .../textures/technic_rubber_tree_empty.png | Bin 0 -> 835 bytes .../textures/technic_rubber_tree_full.png | Bin 0 -> 808 bytes .../technic/textures/technic_screwdriver.png | Bin 0 -> 1001 bytes .../textures/technic_silicon_wafer.png | Bin 0 -> 913 bytes .../technic/textures/technic_silver_dust.png | Bin 0 -> 420 bytes .../textures/technic_solar_panel_bottom.png | Bin 0 -> 579 bytes .../textures/technic_solar_panel_side.png | Bin 0 -> 465 bytes .../textures/technic_solar_panel_top.png | Bin 0 -> 569 bytes .../textures/technic_sonic_screwdriver.png | Bin 0 -> 240 bytes .../textures/technic_stainless_steel_dust.png | Bin 0 -> 445 bytes .../technic_stainless_steel_ingot.png | Bin 0 -> 310 bytes .../technic_supply_converter_bottom.png | Bin 0 -> 738 bytes .../technic_supply_converter_side.png | Bin 0 -> 670 bytes .../textures/technic_supply_converter_top.png | Bin 0 -> 738 bytes .../textures/technic_talinite_dust.png | Bin 0 -> 226 bytes .../technic/textures/technic_tin_dust.png | Bin 0 -> 241 bytes .../technic/textures/technic_tool_mode1.png | Bin 0 -> 361 bytes .../technic/textures/technic_tool_mode2.png | Bin 0 -> 571 bytes .../technic/textures/technic_tool_mode3.png | Bin 0 -> 622 bytes .../technic/textures/technic_tool_mode4.png | Bin 0 -> 455 bytes .../technic/textures/technic_tool_mode5.png | Bin 0 -> 535 bytes .../technic/textures/technic_tool_mode6.png | Bin 0 -> 633 bytes .../technic/textures/technic_tool_mode7.png | Bin 0 -> 481 bytes .../technic/textures/technic_tool_mode8.png | Bin 0 -> 692 bytes .../technic/textures/technic_tool_mode9.png | Bin 0 -> 623 bytes .../technic/textures/technic_tree_tap.png | Bin 0 -> 1045 bytes .../technic/textures/technic_uranium_dust.png | Bin 0 -> 229 bytes .../technic/textures/technic_uranium_fuel.png | Bin 0 -> 158 bytes .../technic/textures/technic_water_can.png | Bin 0 -> 443 bytes .../textures/technic_water_mill_side.png | Bin 0 -> 907 bytes .../textures/technic_water_mill_top.png | Bin 0 -> 828 bytes .../technic_water_mill_top_active.png | Bin 0 -> 819 bytes .../textures/technic_workshop_bottom.png | Bin 0 -> 744 bytes .../textures/technic_workshop_side.png | Bin 0 -> 589 bytes .../technic/textures/technic_workshop_top.png | Bin 0 -> 555 bytes .../textures/technic_wrought_iron_dust.png | Bin 0 -> 448 bytes .../technic/textures/technic_zinc_dust.png | Bin 0 -> 246 bytes .../technicx32/technic_akalin_dust.png | Bin 0 -> 1156 bytes .../technicx32/technic_alatro_dust.png | Bin 0 -> 1134 bytes .../technic_alloy_furnace_front.png | Bin 0 -> 2756 bytes .../technic_alloy_furnace_front_active.png | Bin 0 -> 2757 bytes .../technicx32/technic_alloy_furnace_side.png | Bin 0 -> 2667 bytes .../technicx32/technic_alloy_furnace_top.png | Bin 0 -> 2431 bytes .../textures/technicx32/technic_arol_dust.png | Bin 0 -> 1101 bytes .../textures/technicx32/technic_battery.png | Bin 0 -> 247 bytes .../technicx32/technic_battery_box_bottom.png | Bin 0 -> 2046 bytes .../technicx32/technic_battery_box_side0.png | Bin 0 -> 2313 bytes .../technicx32/technic_battery_box_top.png | Bin 0 -> 2390 bytes .../technicx32/technic_battery_reload.png | Bin 0 -> 8201 bytes .../technicx32/technic_brass_dust.png | Bin 0 -> 1297 bytes .../technicx32/technic_bronze_dust.png | Bin 0 -> 1304 bytes .../technicx32/technic_carbon_steel_dust.png | Bin 0 -> 1228 bytes .../technicx32/technic_cast_iron_dust.png | Bin 0 -> 1225 bytes .../textures/technicx32/technic_chainsaw.png | Bin 0 -> 17656 bytes .../technicx32/technic_chromium_dust.png | Bin 0 -> 1162 bytes .../technic_coal_alloy_furnace_bottom.png | Bin 0 -> 2957 bytes .../technic_coal_alloy_furnace_front.png | Bin 0 -> 2802 bytes ...echnic_coal_alloy_furnace_front_active.png | Bin 0 -> 2953 bytes .../technic_coal_alloy_furnace_side.png | Bin 0 -> 2667 bytes .../technic_coal_alloy_furnace_top.png | Bin 0 -> 2431 bytes .../textures/technicx32/technic_coal_dust.png | Bin 0 -> 1077 bytes .../technicx32/technic_constructor_back.png | Bin 0 -> 2094 bytes .../technic_constructor_front_off.png | Bin 0 -> 2677 bytes .../technic_constructor_front_on.png | Bin 0 -> 2627 bytes .../technic_constructor_mk1_bottom_off.png | Bin 0 -> 2272 bytes .../technic_constructor_mk1_bottom_on.png | Bin 0 -> 2308 bytes .../technic_constructor_mk1_side1_off.png | Bin 0 -> 2327 bytes .../technic_constructor_mk1_side1_on.png | Bin 0 -> 2342 bytes .../technic_constructor_mk1_side2_off.png | Bin 0 -> 2326 bytes .../technic_constructor_mk1_side2_on.png | Bin 0 -> 2338 bytes .../technic_constructor_mk1_top_off.png | Bin 0 -> 2292 bytes .../technic_constructor_mk1_top_on.png | Bin 0 -> 2319 bytes .../technic_constructor_mk2_bottom_off.png | Bin 0 -> 2281 bytes .../technic_constructor_mk2_bottom_on.png | Bin 0 -> 2316 bytes .../technic_constructor_mk2_side1_off.png | Bin 0 -> 2339 bytes .../technic_constructor_mk2_side1_on.png | Bin 0 -> 2355 bytes .../technic_constructor_mk2_side2_off.png | Bin 0 -> 2338 bytes .../technic_constructor_mk2_side2_on.png | Bin 0 -> 2354 bytes .../technic_constructor_mk2_top_off.png | Bin 0 -> 2307 bytes .../technic_constructor_mk2_top_on.png | Bin 0 -> 2329 bytes .../technic_constructor_mk3_bottom_off.png | Bin 0 -> 2286 bytes .../technic_constructor_mk3_bottom_on.png | Bin 0 -> 2318 bytes .../technic_constructor_mk3_side1_off.png | Bin 0 -> 2378 bytes .../technic_constructor_mk3_side1_on.png | Bin 0 -> 2402 bytes .../technic_constructor_mk3_side2_off.png | Bin 0 -> 2313 bytes .../technic_constructor_mk3_side2_on.png | Bin 0 -> 2338 bytes .../technic_constructor_mk3_top_off.png | Bin 0 -> 2313 bytes .../technic_constructor_mk3_top_on.png | Bin 0 -> 2338 bytes .../technicx32/technic_control_logic_unit.png | Bin 0 -> 1494 bytes .../technicx32/technic_copper_coil.png | Bin 0 -> 2447 bytes .../technicx32/technic_copper_dust.png | Bin 0 -> 1252 bytes .../technicx32/technic_deployer_back.png | Bin 0 -> 37128 bytes .../technicx32/technic_deployer_bottom.png | Bin 0 -> 38757 bytes .../technicx32/technic_deployer_front_off.png | Bin 0 -> 29441 bytes .../technicx32/technic_deployer_front_on.png | Bin 0 -> 23351 bytes .../technicx32/technic_deployer_side.png | Bin 0 -> 38136 bytes .../technicx32/technic_deployer_side1.png | Bin 0 -> 38291 bytes .../technicx32/technic_deployer_side2.png | Bin 0 -> 38195 bytes .../technicx32/technic_deployer_top.png | Bin 0 -> 38904 bytes .../technicx32/technic_diamond_block_blue.png | Bin 0 -> 3011 bytes .../technic_diamond_block_green.png | Bin 0 -> 3033 bytes .../technicx32/technic_diamond_block_red.png | Bin 0 -> 2927 bytes .../technicx32/technic_diamond_drill_head.png | Bin 0 -> 978 bytes .../technic_doped_silicon_wafer.png | Bin 0 -> 867 bytes .../technic_electric_furnace_bottom.png | Bin 0 -> 2876 bytes .../technic_electric_furnace_front.png | Bin 0 -> 2912 bytes .../technic_electric_furnace_front_active.png | Bin 0 -> 2912 bytes .../technic_electric_furnace_side.png | Bin 0 -> 2917 bytes .../technic_electric_furnace_top.png | Bin 0 -> 2957 bytes .../technicx32/technic_fine_copper_wire.png | Bin 0 -> 1814 bytes .../technicx32/technic_fine_gold_wire.png | Bin 0 -> 1864 bytes .../technicx32/technic_fine_silver_wire.png | Bin 0 -> 2187 bytes .../technicx32/technic_flashlight.png | Bin 0 -> 1901 bytes .../technicx32/technic_generator_front.png | Bin 0 -> 430 bytes .../technic_generator_front_active.png | Bin 0 -> 454 bytes .../technicx32/technic_generator_side.png | Bin 0 -> 341 bytes .../technicx32/technic_generator_top.png | Bin 0 -> 388 bytes .../technicx32/technic_geothermal_side.png | Bin 0 -> 809 bytes .../technicx32/technic_geothermal_top.png | Bin 0 -> 828 bytes .../technic_geothermal_top_active.png | Bin 0 -> 819 bytes .../textures/technicx32/technic_gold_dust.png | Bin 0 -> 1285 bytes .../technicx32/technic_grinder_front.png | Bin 0 -> 777 bytes .../technicx32/technic_grinder_side.png | Bin 0 -> 692 bytes .../technicx32/technic_grinder_top.png | Bin 0 -> 465 bytes .../technicx32/technic_hv_grinder_bottom.png | Bin 0 -> 2957 bytes .../technicx32/technic_hv_grinder_front.png | Bin 0 -> 2295 bytes .../technic_hv_grinder_front_active.png | Bin 0 -> 2337 bytes .../technicx32/technic_hv_grinder_side.png | Bin 0 -> 2497 bytes .../technic_hv_grinder_side_tube.png | Bin 0 -> 2580 bytes .../technicx32/technic_hv_grinder_top.png | Bin 0 -> 1933 bytes .../technic_hv_nuclear_reactor_core.png | Bin 0 -> 2545 bytes .../technic_hv_solar_array_bottom.png | Bin 0 -> 2019 bytes .../technic_hv_solar_array_side.png | Bin 0 -> 1772 bytes .../technicx32/technic_hv_solar_array_top.png | Bin 0 -> 2855 bytes .../technicx32/technic_hv_transformer.png | Bin 0 -> 1789 bytes .../technicx32/technic_injector_bottom.png | Bin 0 -> 2667 bytes .../technicx32/technic_injector_side.png | Bin 0 -> 2541 bytes .../technicx32/technic_injector_top.png | Bin 0 -> 2633 bytes .../technicx32/technic_kalite_dust.png | Bin 0 -> 809 bytes .../technicx32/technic_laser_beam.png | Bin 0 -> 119 bytes .../textures/technicx32/technic_lava_can.png | Bin 0 -> 1045 bytes .../textures/technicx32/technic_light.png | Bin 0 -> 246 bytes .../technicx32/technic_lv_grinder_bottom.png | Bin 0 -> 2957 bytes .../technicx32/technic_lv_grinder_front.png | Bin 0 -> 2389 bytes .../technic_lv_grinder_front_active.png | Bin 0 -> 2416 bytes .../technicx32/technic_lv_grinder_side.png | Bin 0 -> 2687 bytes .../technicx32/technic_lv_grinder_top.png | Bin 0 -> 2439 bytes .../technic_lv_solar_array_bottom.png | Bin 0 -> 2019 bytes .../technic_lv_solar_array_side.png | Bin 0 -> 1772 bytes .../technicx32/technic_lv_solar_array_top.png | Bin 0 -> 2728 bytes .../technicx32/technic_lv_transformer.png | Bin 0 -> 1809 bytes .../technicx32/technic_machine_bottom.png | Bin 0 -> 2876 bytes .../technicx32/technic_mining_drill.png | Bin 0 -> 2099 bytes .../technicx32/technic_mining_laser_mk1.png | Bin 0 -> 358 bytes .../technicx32/technic_mithril_dust.png | Bin 0 -> 1289 bytes .../textures/technicx32/technic_motor.png | Bin 0 -> 2517 bytes .../technic_music_player_bottom.png | Bin 0 -> 744 bytes .../technicx32/technic_music_player_side.png | Bin 0 -> 788 bytes .../technicx32/technic_music_player_top.png | Bin 0 -> 916 bytes .../technic_mv_alloy_furnace_bottom.png | Bin 0 -> 2957 bytes .../technic_mv_alloy_furnace_front.png | Bin 0 -> 2670 bytes .../technic_mv_alloy_furnace_front_active.png | Bin 0 -> 2673 bytes .../technic_mv_alloy_furnace_side.png | Bin 0 -> 2503 bytes .../technic_mv_alloy_furnace_side_tube.png | Bin 0 -> 2559 bytes .../technic_mv_alloy_furnace_top.png | Bin 0 -> 1929 bytes .../technic_mv_battery_box_bottom.png | Bin 0 -> 2019 bytes .../technic_mv_battery_box_side0.png | Bin 0 -> 2309 bytes .../technicx32/technic_mv_battery_box_top.png | Bin 0 -> 2390 bytes .../technicx32/technic_mv_cable_wield.png | Bin 0 -> 2996 bytes .../technic_mv_electric_furnace_bottom.png | Bin 0 -> 2876 bytes .../technic_mv_electric_furnace_front.png | Bin 0 -> 2599 bytes ...chnic_mv_electric_furnace_front_active.png | Bin 0 -> 2601 bytes .../technic_mv_electric_furnace_side.png | Bin 0 -> 2414 bytes .../technic_mv_electric_furnace_side_tube.png | Bin 0 -> 2449 bytes .../technic_mv_electric_furnace_top.png | Bin 0 -> 1772 bytes .../technicx32/technic_mv_grinder_bottom.png | Bin 0 -> 2957 bytes .../technicx32/technic_mv_grinder_front.png | Bin 0 -> 2328 bytes .../technic_mv_grinder_front_active.png | Bin 0 -> 2361 bytes .../technicx32/technic_mv_grinder_side.png | Bin 0 -> 2515 bytes .../technic_mv_grinder_side_tube.png | Bin 0 -> 2613 bytes .../technicx32/technic_mv_grinder_top.png | Bin 0 -> 1981 bytes .../technic_mv_solar_array_bottom.png | Bin 0 -> 2019 bytes .../technic_mv_solar_array_side.png | Bin 0 -> 1772 bytes .../technicx32/technic_mv_solar_array_top.png | Bin 0 -> 2784 bytes .../technicx32/technic_mv_transformer.png | Bin 0 -> 1748 bytes .../technicx32/technic_nodebreaker_back.png | Bin 0 -> 2803 bytes .../technicx32/technic_nodebreaker_bottom.png | Bin 0 -> 2900 bytes .../technic_nodebreaker_bottom_off.png | Bin 0 -> 3066 bytes .../technic_nodebreaker_bottom_on.png | Bin 0 -> 3070 bytes .../technic_nodebreaker_front_off.png | Bin 0 -> 2788 bytes .../technic_nodebreaker_front_on.png | Bin 0 -> 2856 bytes .../technicx32/technic_nodebreaker_side.png | Bin 0 -> 2900 bytes .../technicx32/technic_nodebreaker_side1.png | Bin 0 -> 2894 bytes .../technic_nodebreaker_side1_off.png | Bin 0 -> 3071 bytes .../technic_nodebreaker_side1_on.png | Bin 0 -> 3073 bytes .../technicx32/technic_nodebreaker_side2.png | Bin 0 -> 2886 bytes .../technic_nodebreaker_side2_off.png | Bin 0 -> 3062 bytes .../technic_nodebreaker_side2_on.png | Bin 0 -> 3069 bytes .../technicx32/technic_nodebreaker_top.png | Bin 0 -> 2908 bytes .../technic_nodebreaker_top_off.png | Bin 0 -> 3053 bytes .../technicx32/technic_nodebreaker_top_on.png | Bin 0 -> 3055 bytes .../technicx32/technic_power_meter.png | Bin 0 -> 209 bytes .../technicx32/technic_power_meter1.png | Bin 0 -> 271 bytes .../technicx32/technic_power_meter2.png | Bin 0 -> 349 bytes .../technicx32/technic_power_meter3.png | Bin 0 -> 395 bytes .../technicx32/technic_power_meter4.png | Bin 0 -> 434 bytes .../technicx32/technic_power_meter5.png | Bin 0 -> 452 bytes .../technicx32/technic_power_meter6.png | Bin 0 -> 509 bytes .../technicx32/technic_power_meter7.png | Bin 0 -> 576 bytes .../technicx32/technic_power_meter8.png | Bin 0 -> 655 bytes .../technicx32/technic_power_meter_bg.png | Bin 0 -> 278 bytes .../technicx32/technic_power_meter_fg.png | Bin 0 -> 465 bytes .../textures/technicx32/technic_raw_latex.png | Bin 0 -> 1625 bytes .../textures/technicx32/technic_rubber.png | Bin 0 -> 587 bytes .../technicx32/technic_rubber_sapling.png | Bin 0 -> 333 bytes .../technicx32/technic_rubber_tree_empty.png | Bin 0 -> 835 bytes .../technicx32/technic_rubber_tree_full.png | Bin 0 -> 808 bytes .../technicx32/technic_screwdriver.png | Bin 0 -> 1001 bytes .../technicx32/technic_silicon_wafer.png | Bin 0 -> 913 bytes .../technicx32/technic_silver_dust.png | Bin 0 -> 1295 bytes .../technicx32/technic_solar_panel_bottom.png | Bin 0 -> 2046 bytes .../technicx32/technic_solar_panel_side.png | Bin 0 -> 465 bytes .../technicx32/technic_solar_panel_top.png | Bin 0 -> 569 bytes .../technicx32/technic_sonic_screwdriver.png | Bin 0 -> 2064 bytes .../technic_stainless_steel_dust.png | Bin 0 -> 1145 bytes .../technicx32/technic_talinite_dust.png | Bin 0 -> 1088 bytes .../textures/technicx32/technic_tin_dust.png | Bin 0 -> 1261 bytes .../textures/technicx32/technic_tree_tap.png | Bin 0 -> 1045 bytes .../technicx32/technic_uranium_dust.png | Bin 0 -> 1112 bytes .../textures/technicx32/technic_water_can.png | Bin 0 -> 1041 bytes .../technicx32/technic_water_mill_side.png | Bin 0 -> 907 bytes .../technicx32/technic_water_mill_top.png | Bin 0 -> 828 bytes .../technic_water_mill_top_active.png | Bin 0 -> 819 bytes .../technicx32/technic_workshop_bottom.png | Bin 0 -> 744 bytes .../technicx32/technic_workshop_side.png | Bin 0 -> 589 bytes .../technicx32/technic_workshop_top.png | Bin 0 -> 555 bytes .../technicx32/technic_wrought_iron_dust.png | Bin 0 -> 1202 bytes .../textures/technicx32/technic_zinc_dust.png | Bin 0 -> 1150 bytes mods/technic-master/technic/tools/cans.lua | 114 +++ .../technic-master/technic/tools/chainsaw.lua | 315 ++++++ .../technic/tools/flashlight.lua | 121 +++ mods/technic-master/technic/tools/init.lua | 22 + .../technic/tools/mining_drill.lua | 413 ++++++++ .../technic/tools/mining_lasers.lua | 190 ++++ .../technic/tools/prospector.lua | 126 +++ .../technic/tools/sonic_screwdriver.lua | 73 ++ .../technic-master/technic/tools/tree_tap.lua | 74 ++ mods/technic-master/technic_chests/README.md | 21 + mods/technic-master/technic_chests/common.lua | 71 ++ .../technic_chests/copper_chest.lua | 46 + .../technic-master/technic_chests/depends.txt | 3 + .../technic_chests/gold_chest.lua | 47 + mods/technic-master/technic_chests/init.lua | 18 + .../technic_chests/iron_chest.lua | 53 + .../technic_chests/locale/de.txt | 41 + .../technic_chests/locale/template.txt | 39 + .../technic_chests/mithril_chest.lua | 46 + .../technic_chests/register.lua | 287 ++++++ .../technic_chests/silver_chest.lua | 46 + .../textures/technic_checkmark_icon.png | Bin 0 -> 233 bytes .../textures/technic_chest_overlay_black.png | Bin 0 -> 248 bytes .../textures/technic_chest_overlay_blue.png | Bin 0 -> 257 bytes .../textures/technic_chest_overlay_brown.png | Bin 0 -> 288 bytes .../textures/technic_chest_overlay_cyan.png | Bin 0 -> 259 bytes .../technic_chest_overlay_dark_green.png | Bin 0 -> 269 bytes .../technic_chest_overlay_dark_grey.png | Bin 0 -> 292 bytes .../textures/technic_chest_overlay_green.png | Bin 0 -> 278 bytes .../textures/technic_chest_overlay_grey.png | Bin 0 -> 299 bytes .../technic_chest_overlay_magenta.png | Bin 0 -> 302 bytes .../textures/technic_chest_overlay_orange.png | Bin 0 -> 302 bytes .../textures/technic_chest_overlay_pink.png | Bin 0 -> 304 bytes .../textures/technic_chest_overlay_red.png | Bin 0 -> 262 bytes .../textures/technic_chest_overlay_violet.png | Bin 0 -> 287 bytes .../textures/technic_chest_overlay_white.png | Bin 0 -> 253 bytes .../textures/technic_chest_overlay_yellow.png | Bin 0 -> 274 bytes .../textures/technic_colorbutton0.png | Bin 0 -> 147 bytes .../textures/technic_colorbutton1.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton10.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton11.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton12.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton13.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton14.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton15.png | Bin 0 -> 3562 bytes .../textures/technic_colorbutton2.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton3.png | Bin 0 -> 140 bytes .../textures/technic_colorbutton4.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton5.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton6.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton7.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton8.png | Bin 0 -> 148 bytes .../textures/technic_colorbutton9.png | Bin 0 -> 148 bytes .../textures/technic_copper_chest_front.png | Bin 0 -> 607 bytes .../technic_copper_chest_inventory.png | Bin 0 -> 7661 bytes .../technic_copper_chest_lock_overlay.png | Bin 0 -> 160 bytes .../textures/technic_copper_chest_side.png | Bin 0 -> 570 bytes .../textures/technic_copper_chest_top.png | Bin 0 -> 557 bytes .../textures/technic_gold_chest_front.png | Bin 0 -> 687 bytes .../textures/technic_gold_chest_inventory.png | Bin 0 -> 9893 bytes .../technic_gold_chest_lock_overlay.png | Bin 0 -> 204 bytes .../textures/technic_gold_chest_side.png | Bin 0 -> 743 bytes .../textures/technic_gold_chest_top.png | Bin 0 -> 729 bytes .../textures/technic_iron_chest_front.png | Bin 0 -> 750 bytes .../textures/technic_iron_chest_inventory.png | Bin 0 -> 7037 bytes .../technic_iron_chest_lock_overlay.png | Bin 0 -> 153 bytes .../textures/technic_iron_chest_side.png | Bin 0 -> 746 bytes .../textures/technic_iron_chest_top.png | Bin 0 -> 860 bytes .../textures/technic_mithril_chest_front.png | Bin 0 -> 770 bytes .../technic_mithril_chest_inventory.png | Bin 0 -> 9893 bytes .../technic_mithril_chest_lock_overlay.png | Bin 0 -> 155 bytes .../textures/technic_mithril_chest_side.png | Bin 0 -> 756 bytes .../textures/technic_mithril_chest_top.png | Bin 0 -> 775 bytes .../textures/technic_pencil_icon.png | Bin 0 -> 294 bytes .../textures/technic_silver_chest_front.png | Bin 0 -> 851 bytes .../technic_silver_chest_inventory.png | Bin 0 -> 9163 bytes .../technic_silver_chest_lock_overlay.png | Bin 0 -> 192 bytes .../textures/technic_silver_chest_side.png | Bin 0 -> 810 bytes .../textures/technic_silver_chest_top.png | Bin 0 -> 798 bytes .../technic_wooden_chest_inventory.png | Bin 0 -> 5496 bytes .../x32/technic_copper_chest_front.png | Bin 0 -> 2614 bytes .../x32/technic_copper_chest_side.png | Bin 0 -> 2568 bytes .../textures/x32/technic_copper_chest_top.png | Bin 0 -> 2521 bytes .../textures/x32/technic_gold_chest_front.png | Bin 0 -> 2653 bytes .../textures/x32/technic_gold_chest_side.png | Bin 0 -> 2617 bytes .../textures/x32/technic_gold_chest_top.png | Bin 0 -> 2558 bytes .../textures/x32/technic_iron_chest_front.png | Bin 0 -> 2515 bytes .../textures/x32/technic_iron_chest_side.png | Bin 0 -> 2478 bytes .../textures/x32/technic_iron_chest_top.png | Bin 0 -> 2432 bytes .../x32/technic_mithril_chest_front.png | Bin 0 -> 2656 bytes .../x32/technic_mithril_chest_side.png | Bin 0 -> 2616 bytes .../x32/technic_mithril_chest_top.png | Bin 0 -> 2558 bytes .../x32/technic_silver_chest_front.png | Bin 0 -> 2241 bytes .../x32/technic_silver_chest_side.png | Bin 0 -> 2146 bytes .../textures/x32/technic_silver_chest_top.png | Bin 0 -> 2226 bytes .../technic_chests/wooden_chest.lua | 51 + .../technic_worldgen/config.lua | 15 + .../technic_worldgen/crafts.lua | 179 ++++ .../technic_worldgen/depends.txt | 3 + mods/technic-master/technic_worldgen/init.lua | 29 + .../technic_worldgen/locale/de.txt | 39 + .../technic_worldgen/locale/template.txt | 37 + mods/technic-master/technic_worldgen/mg.lua | 75 ++ .../technic-master/technic_worldgen/nodes.lua | 163 +++ .../technic_worldgen/oregen.lua | 63 ++ .../technic_worldgen/rubber.lua | 95 ++ .../textures/technic_brass_block.png | Bin 0 -> 649 bytes .../textures/technic_brass_dust.png | Bin 0 -> 464 bytes .../textures/technic_brass_ingot.png | Bin 0 -> 377 bytes .../textures/technic_carbon_steel_block.png | Bin 0 -> 606 bytes .../textures/technic_carbon_steel_ingot.png | Bin 0 -> 354 bytes .../textures/technic_cast_iron_block.png | Bin 0 -> 606 bytes .../textures/technic_cast_iron_ingot.png | Bin 0 -> 353 bytes .../textures/technic_chromium_block.png | Bin 0 -> 611 bytes .../textures/technic_chromium_ingot.png | Bin 0 -> 337 bytes .../textures/technic_chromium_lump.png | Bin 0 -> 313 bytes .../textures/technic_granite.png | Bin 0 -> 947 bytes .../textures/technic_marble.png | Bin 0 -> 807 bytes .../textures/technic_marble_bricks.png | Bin 0 -> 959 bytes .../textures/technic_mineral_chromium.png | Bin 0 -> 887 bytes .../textures/technic_mineral_uranium.png | Bin 0 -> 912 bytes .../textures/technic_mineral_zinc.png | Bin 0 -> 891 bytes .../technic_stainless_steel_block.png | Bin 0 -> 589 bytes .../textures/technic_uranium_block.png | Bin 0 -> 649 bytes .../textures/technic_uranium_ingot.png | Bin 0 -> 300 bytes .../textures/technic_uranium_lump.png | Bin 0 -> 352 bytes .../textures/technic_wrought_iron_block.png | Bin 0 -> 572 bytes .../textures/technic_wrought_iron_ingot.png | Bin 0 -> 334 bytes .../textures/technic_zinc_block.png | Bin 0 -> 681 bytes .../textures/technic_zinc_ingot.png | Bin 0 -> 341 bytes .../textures/technic_zinc_lump.png | Bin 0 -> 308 bytes .../textures/x32/technic_brass_ingot.png | Bin 0 -> 456 bytes .../textures/x32/technic_chromium_ingot.png | Bin 0 -> 242 bytes .../textures/x32/technic_chromium_lump.png | Bin 0 -> 213 bytes .../textures/x32/technic_concrete_block.png | Bin 0 -> 2319 bytes .../textures/x32/technic_granite.png | Bin 0 -> 947 bytes .../textures/x32/technic_marble.png | Bin 0 -> 807 bytes .../textures/x32/technic_marble_bricks.png | Bin 0 -> 959 bytes .../textures/x32/technic_mineral_chromium.png | Bin 0 -> 887 bytes .../textures/x32/technic_mineral_uranium.png | Bin 0 -> 912 bytes .../textures/x32/technic_mineral_zinc.png | Bin 0 -> 891 bytes .../textures/x32/technic_rebar.png | Bin 0 -> 813 bytes .../x32/technic_stainless_steel_ingot.png | Bin 0 -> 230 bytes .../textures/x32/technic_uranium.png | Bin 0 -> 213 bytes .../textures/x32/technic_zinc_ingot.png | Bin 0 -> 242 bytes .../textures/x32/technic_zinc_lump.png | Bin 0 -> 214 bytes mods/technic-master/wrench/depends.txt | 6 + mods/technic-master/wrench/init.lua | 172 ++++ mods/technic-master/wrench/locale/de.txt | 7 + .../technic-master/wrench/locale/template.txt | 5 + mods/technic-master/wrench/support.lua | 71 ++ mods/technic-master/wrench/technic.lua | 286 ++++++ .../wrench/textures/technic_wrench.png | Bin 0 -> 249 bytes 939 files changed, 16186 insertions(+), 2164 deletions(-) delete mode 100644 mods/moreblocks/_config.txt delete mode 100644 mods/moreblocks/stairsplus.lua delete mode 100644 mods/moreblocks/stairsplus_convert.lua delete mode 100644 mods/moreblocks/textures/moreblocks_jungle_wood.png delete mode 100644 mods/moreblocks/textures/moreblocks_wood.png delete mode 100644 mods/moreblocks/textures/moreblocks_wood_tile_down.png delete mode 100644 mods/moreblocks/textures/moreblocks_wood_tile_flipped.png delete mode 100644 mods/moreblocks/textures/moreblocks_wood_tile_left.png delete mode 100644 mods/moreblocks/textures/moreblocks_wood_tile_right.png create mode 100644 mods/moreores/locale/de.txt create mode 100644 mods/pipeworks/common.lua delete mode 100644 mods/pipeworks/deployer.lua create mode 100644 mods/pipeworks/legacy.lua create mode 100644 mods/pipeworks/luaentity.lua delete mode 100644 mods/pipeworks/node_breaker.lua create mode 100644 mods/pipeworks/textures/homedecor_oil_extract.png create mode 100644 mods/pipeworks/textures/homedecor_paraffin.png delete mode 100644 mods/pipeworks/textures/homedecor_plastic_base.png delete mode 100644 mods/pipeworks/textures/homedecor_plastic_base_inv.png create mode 100644 mods/pipeworks/textures/pipeworks_dispenser_back.png create mode 100644 mods/pipeworks/textures/pipeworks_dispenser_bottom.png create mode 100644 mods/pipeworks/textures/pipeworks_dispenser_front_off.png create mode 100644 mods/pipeworks/textures/pipeworks_dispenser_front_on.png create mode 100644 mods/pipeworks/textures/pipeworks_dispenser_side1.png create mode 100644 mods/pipeworks/textures/pipeworks_dispenser_side2.png create mode 100644 mods/pipeworks/textures/pipeworks_dispenser_top.png create mode 100644 mods/pipeworks/textures/pipeworks_trashcan_bottom.png create mode 100644 mods/pipeworks/textures/pipeworks_trashcan_side.png create mode 100644 mods/pipeworks/trashcan.lua create mode 100644 mods/pipeworks/wielder.lua create mode 100644 mods/skylands/textures/skylands_cavorite_handle.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_bronzeaxe.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_bronzepick.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_bronzeshovel.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_bronzesword.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_diamondaxe.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_diamondpick.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_diamondshovel.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_diamondsword.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_meseaxe.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_mesepick.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_meseshovel.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_mesesword.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_steelaxe.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_steelpick.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_steelshovel.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_steelsword.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_stoneaxe.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_stonepick.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_stoneshovel.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_stonesword.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_woodaxe.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_woodpick.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_woodshovel.png create mode 100644 mods/skylands/textures/skylands_cavorite_tool_woodsword.png create mode 100644 mods/skylands/tools.lua create mode 100644 mods/technic-master/.gitattributes create mode 100644 mods/technic-master/.gitignore create mode 100644 mods/technic-master/README.md create mode 100644 mods/technic-master/concrete/depends.txt create mode 100644 mods/technic-master/concrete/init.lua create mode 100644 mods/technic-master/concrete/locale/de.txt create mode 100644 mods/technic-master/concrete/locale/template.txt create mode 100644 mods/technic-master/concrete/textures/technic_blast_resistant_concrete_block.png create mode 100644 mods/technic-master/concrete/textures/technic_concrete_block.png create mode 100644 mods/technic-master/concrete/textures/technic_rebar.png create mode 100644 mods/technic-master/concrete/textures/x32/technic_concrete_block.png create mode 100644 mods/technic-master/concrete/textures/x32/technic_rebar.png create mode 100644 mods/technic-master/extranodes/depends.txt create mode 100644 mods/technic-master/extranodes/init.lua create mode 100644 mods/technic-master/extranodes/locale/de.txt create mode 100644 mods/technic-master/extranodes/locale/template.txt create mode 100644 mods/technic-master/manual.md create mode 100644 mods/technic-master/modpack.txt create mode 100644 mods/technic-master/technic/README.md create mode 100644 mods/technic-master/technic/config.lua create mode 100644 mods/technic-master/technic/crafts.lua create mode 100644 mods/technic-master/technic/depends.txt create mode 100644 mods/technic-master/technic/helpers.lua create mode 100644 mods/technic-master/technic/init.lua create mode 100644 mods/technic-master/technic/items.lua create mode 100644 mods/technic-master/technic/legacy.lua create mode 100644 mods/technic-master/technic/locale/de.txt create mode 100644 mods/technic-master/technic/locale/es.txt create mode 100644 mods/technic-master/technic/locale/it.txt create mode 100644 mods/technic-master/technic/locale/template.txt create mode 100644 mods/technic-master/technic/machines/HV/battery_box.lua create mode 100644 mods/technic-master/technic/machines/HV/cables.lua create mode 100644 mods/technic-master/technic/machines/HV/forcefield.lua create mode 100644 mods/technic-master/technic/machines/HV/generator.lua create mode 100644 mods/technic-master/technic/machines/HV/init.lua create mode 100644 mods/technic-master/technic/machines/HV/nuclear_reactor.lua create mode 100644 mods/technic-master/technic/machines/HV/quarry.lua create mode 100644 mods/technic-master/technic/machines/HV/solar_array.lua create mode 100644 mods/technic-master/technic/machines/LV/alloy_furnace.lua create mode 100644 mods/technic-master/technic/machines/LV/battery_box.lua create mode 100644 mods/technic-master/technic/machines/LV/cables.lua create mode 100644 mods/technic-master/technic/machines/LV/cnc.lua create mode 100644 mods/technic-master/technic/machines/LV/cnc_api.lua create mode 100644 mods/technic-master/technic/machines/LV/cnc_nodes.lua create mode 100644 mods/technic-master/technic/machines/LV/coal_alloy_furnace.lua create mode 100644 mods/technic-master/technic/machines/LV/coal_furnace.lua create mode 100644 mods/technic-master/technic/machines/LV/compressor.lua create mode 100644 mods/technic-master/technic/machines/LV/electric_furnace.lua create mode 100644 mods/technic-master/technic/machines/LV/extractor.lua create mode 100644 mods/technic-master/technic/machines/LV/generator.lua create mode 100644 mods/technic-master/technic/machines/LV/geothermal.lua create mode 100644 mods/technic-master/technic/machines/LV/grinder.lua create mode 100644 mods/technic-master/technic/machines/LV/init.lua create mode 100644 mods/technic-master/technic/machines/LV/music_player.lua create mode 100644 mods/technic-master/technic/machines/LV/solar_array.lua create mode 100644 mods/technic-master/technic/machines/LV/solar_panel.lua create mode 100644 mods/technic-master/technic/machines/LV/water_mill.lua create mode 100644 mods/technic-master/technic/machines/MV/alloy_furnace.lua create mode 100644 mods/technic-master/technic/machines/MV/battery_box.lua create mode 100644 mods/technic-master/technic/machines/MV/cables.lua create mode 100644 mods/technic-master/technic/machines/MV/centrifuge.lua create mode 100644 mods/technic-master/technic/machines/MV/compressor.lua create mode 100644 mods/technic-master/technic/machines/MV/electric_furnace.lua create mode 100644 mods/technic-master/technic/machines/MV/extractor.lua create mode 100644 mods/technic-master/technic/machines/MV/generator.lua create mode 100644 mods/technic-master/technic/machines/MV/grinder.lua create mode 100644 mods/technic-master/technic/machines/MV/init.lua create mode 100644 mods/technic-master/technic/machines/MV/lighting.lua create mode 100644 mods/technic-master/technic/machines/MV/power_radiator.lua create mode 100644 mods/technic-master/technic/machines/MV/solar_array.lua create mode 100644 mods/technic-master/technic/machines/MV/tool_workshop.lua create mode 100644 mods/technic-master/technic/machines/MV/wind_mill.lua create mode 100644 mods/technic-master/technic/machines/init.lua create mode 100644 mods/technic-master/technic/machines/other/anchor.lua create mode 100644 mods/technic-master/technic/machines/other/constructor.lua create mode 100644 mods/technic-master/technic/machines/other/frames.lua create mode 100644 mods/technic-master/technic/machines/other/init.lua create mode 100644 mods/technic-master/technic/machines/other/injector.lua create mode 100644 mods/technic-master/technic/machines/register/alloy_furnace.lua create mode 100644 mods/technic-master/technic/machines/register/alloy_recipes.lua create mode 100644 mods/technic-master/technic/machines/register/battery_box.lua create mode 100644 mods/technic-master/technic/machines/register/cables.lua create mode 100644 mods/technic-master/technic/machines/register/centrifuge.lua create mode 100644 mods/technic-master/technic/machines/register/centrifuge_recipes.lua create mode 100644 mods/technic-master/technic/machines/register/common.lua create mode 100644 mods/technic-master/technic/machines/register/compressor.lua create mode 100644 mods/technic-master/technic/machines/register/compressor_recipes.lua create mode 100644 mods/technic-master/technic/machines/register/electric_furnace.lua create mode 100644 mods/technic-master/technic/machines/register/extractor.lua create mode 100644 mods/technic-master/technic/machines/register/extractor_recipes.lua create mode 100644 mods/technic-master/technic/machines/register/generator.lua create mode 100644 mods/technic-master/technic/machines/register/grinder.lua create mode 100644 mods/technic-master/technic/machines/register/grinder_recipes.lua create mode 100644 mods/technic-master/technic/machines/register/init.lua create mode 100644 mods/technic-master/technic/machines/register/machine_base.lua create mode 100644 mods/technic-master/technic/machines/register/recipes.lua create mode 100644 mods/technic-master/technic/machines/register/solar_array.lua create mode 100644 mods/technic-master/technic/machines/supply_converter.lua create mode 100644 mods/technic-master/technic/machines/switching_station.lua create mode 100644 mods/technic-master/technic/register.lua create mode 100644 mods/technic-master/technic/sounds/chainsaw.ogg create mode 100644 mods/technic-master/technic/sounds/item_drop_pickup.1.ogg create mode 100644 mods/technic-master/technic/sounds/item_drop_pickup.2.ogg create mode 100644 mods/technic-master/technic/sounds/item_drop_pickup.3.ogg create mode 100644 mods/technic-master/technic/sounds/item_drop_pickup.4.ogg create mode 100644 mods/technic-master/technic/sounds/mining_drill.ogg create mode 100644 mods/technic-master/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg create mode 100644 mods/technic-master/technic/sounds/technic_hv_nuclear_reactor_siren_danger_loop.ogg create mode 100644 mods/technic-master/technic/sounds/technic_laser_mk1.0.ogg create mode 100644 mods/technic-master/technic/sounds/technic_laser_mk1.1.ogg create mode 100644 mods/technic-master/technic/sounds/technic_laser_mk2.0.ogg create mode 100644 mods/technic-master/technic/sounds/technic_laser_mk2.1.ogg create mode 100644 mods/technic-master/technic/sounds/technic_laser_mk2.2.ogg create mode 100644 mods/technic-master/technic/sounds/technic_laser_mk3.1.ogg create mode 100644 mods/technic-master/technic/sounds/technic_laser_mk3.2.ogg create mode 100644 mods/technic-master/technic/sounds/technic_prospector_hit.ogg create mode 100644 mods/technic-master/technic/sounds/technic_prospector_miss.ogg create mode 100644 mods/technic-master/technic/sounds/technic_sonic_screwdriver.ogg create mode 100644 mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png create mode 100644 mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_16.png create mode 100644 mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_256.png create mode 100644 mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_32.png create mode 100644 mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png create mode 100644 mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png create mode 100644 mods/technic-master/technic/textures/power_meter.png create mode 100644 mods/technic-master/technic/textures/technic_admin_anchor.png create mode 100644 mods/technic-master/technic/textures/technic_akalin_dust.png create mode 100644 mods/technic-master/technic/textures/technic_alatro_dust.png create mode 100644 mods/technic-master/technic/textures/technic_arol_dust.png create mode 100644 mods/technic-master/technic/textures/technic_battery.png create mode 100644 mods/technic-master/technic/textures/technic_battery_box_side.png create mode 100644 mods/technic-master/technic/textures/technic_battery_box_side8.png create mode 100644 mods/technic-master/technic/textures/technic_battery_box_side_mv.png create mode 100644 mods/technic-master/technic/textures/technic_battery_meter_fg.png create mode 100644 mods/technic-master/technic/textures/technic_battery_reload.png create mode 100644 mods/technic-master/technic/textures/technic_bronze_dust.png create mode 100644 mods/technic-master/technic/textures/technic_bucket_corium.png create mode 100644 mods/technic-master/technic/textures/technic_carbon_cloth.png create mode 100644 mods/technic-master/technic/textures/technic_carbon_plate.png create mode 100644 mods/technic-master/technic/textures/technic_carbon_steel_dust.png create mode 100644 mods/technic-master/technic/textures/technic_cast_iron_dust.png create mode 100644 mods/technic-master/technic/textures/technic_chainsaw.png create mode 100644 mods/technic-master/technic/textures/technic_chernobylite_block.png create mode 100644 mods/technic-master/technic/textures/technic_chromium_dust.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_cylinder.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_cylinder_horizontal.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_element_cross.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_element_edge.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_element_end.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_element_straight.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_element_t.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_front.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_full.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_half.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_milling_background.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_onecurvededge.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_pyramid.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_side.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_slope.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_slope_edge.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_slope_edge_upsdwn.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_slope_inner_edge.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_slope_lying.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_slope_upsdwn.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_sphere.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_spike.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_stick.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_top.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_top_active.png create mode 100644 mods/technic-master/technic/textures/technic_cnc_twocurvededge.png create mode 100644 mods/technic-master/technic/textures/technic_coal_alloy_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_coal_alloy_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technic_coal_alloy_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_coal_alloy_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technic_coal_alloy_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technic_coal_dust.png create mode 100644 mods/technic-master/technic/textures/technic_composite_plate.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_back.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_front_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_front_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk1_bottom_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk1_bottom_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk1_side1_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk1_side1_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk1_side2_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk1_side2_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk1_top_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk1_top_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk2_bottom_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk2_bottom_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk2_side1_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk2_side1_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk2_side2_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk2_side2_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk2_top_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk2_top_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk3_bottom_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk3_bottom_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk3_side1_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk3_side1_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk3_side2_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk3_side2_on.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk3_top_off.png create mode 100644 mods/technic-master/technic/textures/technic_constructor_mk3_top_on.png create mode 100644 mods/technic-master/technic/textures/technic_control_logic_unit.png create mode 100644 mods/technic-master/technic/textures/technic_copper_coil.png create mode 100644 mods/technic-master/technic/textures/technic_copper_dust.png create mode 100644 mods/technic-master/technic/textures/technic_copper_plate.png create mode 100644 mods/technic-master/technic/textures/technic_corium_flowing_animated.png create mode 100644 mods/technic-master/technic/textures/technic_corium_source_animated.png create mode 100644 mods/technic-master/technic/textures/technic_deployer_back.png create mode 100644 mods/technic-master/technic/textures/technic_deployer_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_deployer_front_off.png create mode 100644 mods/technic-master/technic/textures/technic_deployer_front_on.png create mode 100644 mods/technic-master/technic/textures/technic_deployer_side.png create mode 100644 mods/technic-master/technic/textures/technic_deployer_side1.png create mode 100644 mods/technic-master/technic/textures/technic_deployer_side2.png create mode 100644 mods/technic-master/technic/textures/technic_deployer_top.png create mode 100644 mods/technic-master/technic/textures/technic_diamond_block_blue.png create mode 100644 mods/technic-master/technic/textures/technic_diamond_block_green.png create mode 100644 mods/technic-master/technic/textures/technic_diamond_block_red.png create mode 100644 mods/technic-master/technic/textures/technic_diamond_drill_head.png create mode 100644 mods/technic-master/technic/textures/technic_doped_silicon_wafer.png create mode 100644 mods/technic-master/technic/textures/technic_fine_copper_wire.png create mode 100644 mods/technic-master/technic/textures/technic_fine_gold_wire.png create mode 100644 mods/technic-master/technic/textures/technic_fine_silver_wire.png create mode 100644 mods/technic-master/technic/textures/technic_flashlight.png create mode 100644 mods/technic-master/technic/textures/technic_forcefield_animated.png create mode 100644 mods/technic-master/technic/textures/technic_forcefield_emitter_off.png create mode 100644 mods/technic-master/technic/textures/technic_forcefield_emitter_on.png create mode 100644 mods/technic-master/technic/textures/technic_frame.png create mode 100644 mods/technic-master/technic/textures/technic_geothermal_side.png create mode 100644 mods/technic-master/technic/textures/technic_geothermal_top.png create mode 100644 mods/technic-master/technic/textures/technic_geothermal_top_active.png create mode 100644 mods/technic-master/technic/textures/technic_gold_dust.png create mode 100644 mods/technic-master/technic/textures/technic_graphite.png create mode 100644 mods/technic-master/technic/textures/technic_grinder_front.png create mode 100644 mods/technic-master/technic/textures/technic_grinder_side.png create mode 100644 mods/technic-master/technic/textures/technic_grinder_top.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_cube_white_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_cube_white_sides_ceiling.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_cube_white_tb.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_cube_yellow_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_cube_yellow_sides_ceiling.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_cube_yellow_tb.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_thick_white_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_thick_white_wall_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_thick_yellow_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_thick_yellow_wall_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_thin_white_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_thin_white_wall_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_thin_yellow_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_thin_yellow_wall_sides.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_white_tb.png create mode 100644 mods/technic-master/technic/textures/technic_homedecor_glowlight_yellow_tb.png create mode 100644 mods/technic-master/technic/textures/technic_hv_battery_box_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_hv_battery_box_side.png create mode 100644 mods/technic-master/technic/textures/technic_hv_battery_box_top.png create mode 100644 mods/technic-master/technic/textures/technic_hv_cable.png create mode 100644 mods/technic-master/technic/textures/technic_hv_cable_wield.png create mode 100644 mods/technic-master/technic/textures/technic_hv_down_converter_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_hv_down_converter_side.png create mode 100644 mods/technic-master/technic/textures/technic_hv_down_converter_top.png create mode 100644 mods/technic-master/technic/textures/technic_hv_generator_front.png create mode 100644 mods/technic-master/technic/textures/technic_hv_generator_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_hv_generator_side.png create mode 100644 mods/technic-master/technic/textures/technic_hv_generator_top.png create mode 100644 mods/technic-master/technic/textures/technic_hv_grinder_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_hv_grinder_front.png create mode 100644 mods/technic-master/technic/textures/technic_hv_grinder_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_hv_grinder_side.png create mode 100644 mods/technic-master/technic/textures/technic_hv_grinder_side_tube.png create mode 100644 mods/technic-master/technic/textures/technic_hv_grinder_top.png create mode 100644 mods/technic-master/technic/textures/technic_hv_nuclear_reactor_core.png create mode 100644 mods/technic-master/technic/textures/technic_hv_solar_array_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_hv_solar_array_side.png create mode 100644 mods/technic-master/technic/textures/technic_hv_solar_array_top.png create mode 100644 mods/technic-master/technic/textures/technic_hv_transformer.png create mode 100644 mods/technic-master/technic/textures/technic_injector_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_injector_side.png create mode 100644 mods/technic-master/technic/textures/technic_injector_top.png create mode 100644 mods/technic-master/technic/textures/technic_kalite_dust.png create mode 100644 mods/technic-master/technic/textures/technic_laser_beam_mk1.png create mode 100644 mods/technic-master/technic/textures/technic_laser_beam_mk2.png create mode 100644 mods/technic-master/technic/textures/technic_laser_beam_mk3.png create mode 100644 mods/technic-master/technic/textures/technic_lava_can.png create mode 100644 mods/technic-master/technic/textures/technic_light.png create mode 100644 mods/technic-master/technic/textures/technic_lv_alloy_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_lv_alloy_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technic_lv_alloy_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_lv_alloy_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technic_lv_alloy_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technic_lv_battery_box_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_lv_battery_box_side.png create mode 100644 mods/technic-master/technic/textures/technic_lv_battery_box_top.png create mode 100644 mods/technic-master/technic/textures/technic_lv_cable.png create mode 100644 mods/technic-master/technic/textures/technic_lv_cable_wield.png create mode 100644 mods/technic-master/technic/textures/technic_lv_compressor_back.png create mode 100644 mods/technic-master/technic/textures/technic_lv_compressor_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_lv_compressor_front.png create mode 100644 mods/technic-master/technic/textures/technic_lv_compressor_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_lv_compressor_side.png create mode 100644 mods/technic-master/technic/textures/technic_lv_compressor_top.png create mode 100644 mods/technic-master/technic/textures/technic_lv_electric_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_lv_electric_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technic_lv_electric_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_lv_electric_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technic_lv_electric_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technic_lv_extractor_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_lv_extractor_front.png create mode 100644 mods/technic-master/technic/textures/technic_lv_extractor_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_lv_extractor_side.png create mode 100644 mods/technic-master/technic/textures/technic_lv_extractor_top.png create mode 100644 mods/technic-master/technic/textures/technic_lv_generator_front.png create mode 100644 mods/technic-master/technic/textures/technic_lv_generator_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_lv_generator_side.png create mode 100644 mods/technic-master/technic/textures/technic_lv_generator_top.png create mode 100644 mods/technic-master/technic/textures/technic_lv_grinder_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_lv_grinder_front.png create mode 100644 mods/technic-master/technic/textures/technic_lv_grinder_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_lv_grinder_side.png create mode 100644 mods/technic-master/technic/textures/technic_lv_grinder_top.png create mode 100644 mods/technic-master/technic/textures/technic_lv_solar_array_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_lv_solar_array_side.png create mode 100644 mods/technic-master/technic/textures/technic_lv_solar_array_top.png create mode 100644 mods/technic-master/technic/textures/technic_lv_transformer.png create mode 100644 mods/technic-master/technic/textures/technic_machine_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_machine_casing.png create mode 100644 mods/technic-master/technic/textures/technic_mining_drill.png create mode 100644 mods/technic-master/technic/textures/technic_mining_drill_mk2.png create mode 100644 mods/technic-master/technic/textures/technic_mining_drill_mk3.png create mode 100644 mods/technic-master/technic/textures/technic_mining_laser_mk1.png create mode 100644 mods/technic-master/technic/textures/technic_mining_laser_mk2.png create mode 100644 mods/technic-master/technic/textures/technic_mining_laser_mk3.png create mode 100644 mods/technic-master/technic/textures/technic_mithril_dust.png create mode 100644 mods/technic-master/technic/textures/technic_mixed_metal_ingot.png create mode 100644 mods/technic-master/technic/textures/technic_motor.png create mode 100644 mods/technic-master/technic/textures/technic_music_player_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_music_player_side.png create mode 100644 mods/technic-master/technic/textures/technic_music_player_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_alloy_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_alloy_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technic_mv_alloy_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_mv_alloy_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_alloy_furnace_side_tube.png create mode 100644 mods/technic-master/technic/textures/technic_mv_alloy_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_battery_box_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_battery_box_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_battery_box_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_cable.png create mode 100644 mods/technic-master/technic/textures/technic_mv_cable_wield.png create mode 100644 mods/technic-master/technic/textures/technic_mv_centrifuge_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_centrifuge_front.png create mode 100644 mods/technic-master/technic/textures/technic_mv_centrifuge_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_mv_centrifuge_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_centrifuge_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_compressor_back.png create mode 100644 mods/technic-master/technic/textures/technic_mv_compressor_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_compressor_front.png create mode 100644 mods/technic-master/technic/textures/technic_mv_compressor_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_mv_compressor_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_compressor_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_down_converter_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_down_converter_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_down_converter_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_electric_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_electric_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technic_mv_electric_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_mv_electric_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_electric_furnace_side_tube.png create mode 100644 mods/technic-master/technic/textures/technic_mv_electric_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_extractor_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_extractor_front.png create mode 100644 mods/technic-master/technic/textures/technic_mv_extractor_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_mv_extractor_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_extractor_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_generator_front.png create mode 100644 mods/technic-master/technic/textures/technic_mv_generator_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_mv_generator_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_generator_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_grinder_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_grinder_front.png create mode 100644 mods/technic-master/technic/textures/technic_mv_grinder_front_active.png create mode 100644 mods/technic-master/technic/textures/technic_mv_grinder_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_grinder_side_tube.png create mode 100644 mods/technic-master/technic/textures/technic_mv_grinder_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_solar_array_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_mv_solar_array_side.png create mode 100644 mods/technic-master/technic/textures/technic_mv_solar_array_top.png create mode 100644 mods/technic-master/technic/textures/technic_mv_transformer.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_back.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_bottom_off.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_bottom_on.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_front_off.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_front_on.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_side.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_side1.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_side1_off.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_side1_on.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_side2.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_side2_off.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_side2_on.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_top.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_top_off.png create mode 100644 mods/technic-master/technic/textures/technic_nodebreaker_top_on.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter0.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter1.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter2.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter3.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter4.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter5.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter6.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter7.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter8.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter_bg.png create mode 100644 mods/technic-master/technic/textures/technic_power_meter_fg.png create mode 100644 mods/technic-master/technic/textures/technic_prospector.png create mode 100644 mods/technic-master/technic/textures/technic_raw_latex.png create mode 100644 mods/technic-master/technic/textures/technic_rubber.png create mode 100644 mods/technic-master/technic/textures/technic_rubber_leaves.png create mode 100644 mods/technic-master/technic/textures/technic_rubber_sapling.png create mode 100644 mods/technic-master/technic/textures/technic_rubber_tree_empty.png create mode 100644 mods/technic-master/technic/textures/technic_rubber_tree_full.png create mode 100644 mods/technic-master/technic/textures/technic_screwdriver.png create mode 100644 mods/technic-master/technic/textures/technic_silicon_wafer.png create mode 100644 mods/technic-master/technic/textures/technic_silver_dust.png create mode 100644 mods/technic-master/technic/textures/technic_solar_panel_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_solar_panel_side.png create mode 100644 mods/technic-master/technic/textures/technic_solar_panel_top.png create mode 100644 mods/technic-master/technic/textures/technic_sonic_screwdriver.png create mode 100644 mods/technic-master/technic/textures/technic_stainless_steel_dust.png create mode 100644 mods/technic-master/technic/textures/technic_stainless_steel_ingot.png create mode 100644 mods/technic-master/technic/textures/technic_supply_converter_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_supply_converter_side.png create mode 100644 mods/technic-master/technic/textures/technic_supply_converter_top.png create mode 100644 mods/technic-master/technic/textures/technic_talinite_dust.png create mode 100644 mods/technic-master/technic/textures/technic_tin_dust.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode1.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode2.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode3.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode4.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode5.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode6.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode7.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode8.png create mode 100644 mods/technic-master/technic/textures/technic_tool_mode9.png create mode 100644 mods/technic-master/technic/textures/technic_tree_tap.png create mode 100644 mods/technic-master/technic/textures/technic_uranium_dust.png create mode 100644 mods/technic-master/technic/textures/technic_uranium_fuel.png create mode 100644 mods/technic-master/technic/textures/technic_water_can.png create mode 100644 mods/technic-master/technic/textures/technic_water_mill_side.png create mode 100644 mods/technic-master/technic/textures/technic_water_mill_top.png create mode 100644 mods/technic-master/technic/textures/technic_water_mill_top_active.png create mode 100644 mods/technic-master/technic/textures/technic_workshop_bottom.png create mode 100644 mods/technic-master/technic/textures/technic_workshop_side.png create mode 100644 mods/technic-master/technic/textures/technic_workshop_top.png create mode 100644 mods/technic-master/technic/textures/technic_wrought_iron_dust.png create mode 100644 mods/technic-master/technic/textures/technic_zinc_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_akalin_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_alatro_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_alloy_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_alloy_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_alloy_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_alloy_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_arol_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_battery.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_battery_box_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_battery_box_side0.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_battery_box_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_battery_reload.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_brass_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_bronze_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_carbon_steel_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_cast_iron_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_chainsaw.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_chromium_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_coal_alloy_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_coal_alloy_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_coal_alloy_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_coal_alloy_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_coal_alloy_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_coal_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_back.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_front_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_front_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk1_bottom_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk1_bottom_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk1_side1_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk1_side1_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk1_side2_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk1_side2_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk1_top_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk1_top_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk2_bottom_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk2_bottom_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk2_side1_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk2_side1_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk2_side2_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk2_side2_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk2_top_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk2_top_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk3_bottom_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk3_bottom_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk3_side1_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk3_side1_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk3_side2_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk3_side2_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk3_top_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_constructor_mk3_top_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_control_logic_unit.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_copper_coil.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_copper_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_deployer_back.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_deployer_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_deployer_front_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_deployer_front_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_deployer_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_deployer_side1.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_deployer_side2.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_deployer_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_diamond_block_blue.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_diamond_block_green.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_diamond_block_red.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_diamond_drill_head.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_doped_silicon_wafer.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_electric_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_electric_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_electric_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_electric_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_electric_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_fine_copper_wire.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_fine_gold_wire.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_fine_silver_wire.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_flashlight.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_generator_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_generator_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_generator_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_generator_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_geothermal_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_geothermal_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_geothermal_top_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_gold_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_grinder_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_grinder_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_grinder_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_grinder_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_grinder_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_grinder_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_grinder_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_grinder_side_tube.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_grinder_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_nuclear_reactor_core.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_solar_array_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_solar_array_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_solar_array_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_hv_transformer.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_injector_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_injector_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_injector_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_kalite_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_laser_beam.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lava_can.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_light.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_grinder_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_grinder_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_grinder_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_grinder_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_grinder_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_solar_array_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_solar_array_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_solar_array_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_lv_transformer.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_machine_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mining_drill.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mining_laser_mk1.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mithril_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_motor.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_music_player_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_music_player_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_music_player_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_alloy_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_alloy_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_alloy_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_alloy_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_alloy_furnace_side_tube.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_alloy_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_battery_box_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_battery_box_side0.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_battery_box_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_cable_wield.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_electric_furnace_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_electric_furnace_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_electric_furnace_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_electric_furnace_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_electric_furnace_side_tube.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_electric_furnace_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_grinder_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_grinder_front.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_grinder_front_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_grinder_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_grinder_side_tube.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_grinder_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_solar_array_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_solar_array_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_solar_array_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_mv_transformer.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_back.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_bottom_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_bottom_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_front_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_front_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_side1.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_side1_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_side1_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_side2.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_side2_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_side2_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_top_off.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_nodebreaker_top_on.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter1.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter2.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter3.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter4.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter5.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter6.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter7.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter8.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter_bg.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_power_meter_fg.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_raw_latex.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_rubber.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_rubber_sapling.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_rubber_tree_empty.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_rubber_tree_full.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_screwdriver.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_silicon_wafer.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_silver_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_solar_panel_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_solar_panel_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_solar_panel_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_sonic_screwdriver.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_stainless_steel_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_talinite_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_tin_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_tree_tap.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_uranium_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_water_can.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_water_mill_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_water_mill_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_water_mill_top_active.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_workshop_bottom.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_workshop_side.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_workshop_top.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_wrought_iron_dust.png create mode 100644 mods/technic-master/technic/textures/technicx32/technic_zinc_dust.png create mode 100644 mods/technic-master/technic/tools/cans.lua create mode 100644 mods/technic-master/technic/tools/chainsaw.lua create mode 100644 mods/technic-master/technic/tools/flashlight.lua create mode 100644 mods/technic-master/technic/tools/init.lua create mode 100644 mods/technic-master/technic/tools/mining_drill.lua create mode 100644 mods/technic-master/technic/tools/mining_lasers.lua create mode 100644 mods/technic-master/technic/tools/prospector.lua create mode 100644 mods/technic-master/technic/tools/sonic_screwdriver.lua create mode 100644 mods/technic-master/technic/tools/tree_tap.lua create mode 100644 mods/technic-master/technic_chests/README.md create mode 100644 mods/technic-master/technic_chests/common.lua create mode 100644 mods/technic-master/technic_chests/copper_chest.lua create mode 100644 mods/technic-master/technic_chests/depends.txt create mode 100644 mods/technic-master/technic_chests/gold_chest.lua create mode 100644 mods/technic-master/technic_chests/init.lua create mode 100644 mods/technic-master/technic_chests/iron_chest.lua create mode 100644 mods/technic-master/technic_chests/locale/de.txt create mode 100644 mods/technic-master/technic_chests/locale/template.txt create mode 100644 mods/technic-master/technic_chests/mithril_chest.lua create mode 100644 mods/technic-master/technic_chests/register.lua create mode 100644 mods/technic-master/technic_chests/silver_chest.lua create mode 100644 mods/technic-master/technic_chests/textures/technic_checkmark_icon.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_black.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_blue.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_brown.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_cyan.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_dark_green.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_dark_grey.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_green.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_grey.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_magenta.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_orange.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_pink.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_red.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_violet.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_white.png create mode 100644 mods/technic-master/technic_chests/textures/technic_chest_overlay_yellow.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton0.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton1.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton10.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton11.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton12.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton13.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton14.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton15.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton2.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton3.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton4.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton5.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton6.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton7.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton8.png create mode 100644 mods/technic-master/technic_chests/textures/technic_colorbutton9.png create mode 100644 mods/technic-master/technic_chests/textures/technic_copper_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/technic_copper_chest_inventory.png create mode 100644 mods/technic-master/technic_chests/textures/technic_copper_chest_lock_overlay.png create mode 100644 mods/technic-master/technic_chests/textures/technic_copper_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/technic_copper_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/technic_gold_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/technic_gold_chest_inventory.png create mode 100644 mods/technic-master/technic_chests/textures/technic_gold_chest_lock_overlay.png create mode 100644 mods/technic-master/technic_chests/textures/technic_gold_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/technic_gold_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/technic_iron_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/technic_iron_chest_inventory.png create mode 100644 mods/technic-master/technic_chests/textures/technic_iron_chest_lock_overlay.png create mode 100644 mods/technic-master/technic_chests/textures/technic_iron_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/technic_iron_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/technic_mithril_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/technic_mithril_chest_inventory.png create mode 100644 mods/technic-master/technic_chests/textures/technic_mithril_chest_lock_overlay.png create mode 100644 mods/technic-master/technic_chests/textures/technic_mithril_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/technic_mithril_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/technic_pencil_icon.png create mode 100644 mods/technic-master/technic_chests/textures/technic_silver_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/technic_silver_chest_inventory.png create mode 100644 mods/technic-master/technic_chests/textures/technic_silver_chest_lock_overlay.png create mode 100644 mods/technic-master/technic_chests/textures/technic_silver_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/technic_silver_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/technic_wooden_chest_inventory.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_copper_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_copper_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_copper_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_gold_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_gold_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_gold_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_iron_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_iron_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_iron_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_mithril_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_mithril_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_mithril_chest_top.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_silver_chest_front.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_silver_chest_side.png create mode 100644 mods/technic-master/technic_chests/textures/x32/technic_silver_chest_top.png create mode 100644 mods/technic-master/technic_chests/wooden_chest.lua create mode 100644 mods/technic-master/technic_worldgen/config.lua create mode 100644 mods/technic-master/technic_worldgen/crafts.lua create mode 100644 mods/technic-master/technic_worldgen/depends.txt create mode 100644 mods/technic-master/technic_worldgen/init.lua create mode 100644 mods/technic-master/technic_worldgen/locale/de.txt create mode 100644 mods/technic-master/technic_worldgen/locale/template.txt create mode 100644 mods/technic-master/technic_worldgen/mg.lua create mode 100644 mods/technic-master/technic_worldgen/nodes.lua create mode 100644 mods/technic-master/technic_worldgen/oregen.lua create mode 100644 mods/technic-master/technic_worldgen/rubber.lua create mode 100644 mods/technic-master/technic_worldgen/textures/technic_brass_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_brass_dust.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_brass_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_carbon_steel_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_carbon_steel_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_cast_iron_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_cast_iron_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_chromium_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_chromium_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_chromium_lump.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_granite.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_marble.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_marble_bricks.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_mineral_chromium.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_mineral_uranium.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_mineral_zinc.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_stainless_steel_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_uranium_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_uranium_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_uranium_lump.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_wrought_iron_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_wrought_iron_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_zinc_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_zinc_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/technic_zinc_lump.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_brass_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_chromium_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_chromium_lump.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_concrete_block.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_granite.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_marble.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_marble_bricks.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_mineral_chromium.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_mineral_uranium.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_mineral_zinc.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_rebar.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_stainless_steel_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_uranium.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_zinc_ingot.png create mode 100644 mods/technic-master/technic_worldgen/textures/x32/technic_zinc_lump.png create mode 100644 mods/technic-master/wrench/depends.txt create mode 100644 mods/technic-master/wrench/init.lua create mode 100644 mods/technic-master/wrench/locale/de.txt create mode 100644 mods/technic-master/wrench/locale/template.txt create mode 100644 mods/technic-master/wrench/support.lua create mode 100644 mods/technic-master/wrench/technic.lua create mode 100644 mods/technic-master/wrench/textures/technic_wrench.png diff --git a/mods/moreblocks/_config.txt b/mods/moreblocks/_config.txt deleted file mode 100644 index a7e6fcd..0000000 --- a/mods/moreblocks/_config.txt +++ /dev/null @@ -1,17 +0,0 @@ ------------------------------------------------------------------------------- ------------------------------- CONFIGURATION --------------------------------- ------------------------------------------------------------------------------- - ------------------------------------------------------------------------------- --------- Change settings by changing the values after the "=". --------------- ------------------------------------------------------------------------------- - - --- Whether to direct wood based on player yaw when placing the block (true or false) -wood_facedir = true - --- Allow stair/slab crafting without a circular saw or not (true or false) -allow_stair_slab_crafting = true - --- Show stairs/slabs/panels/microblocks in creative inventory (true or false) -show_stairsplus_creative_inv = false diff --git a/mods/moreblocks/circular_saw.lua b/mods/moreblocks/circular_saw.lua index c8dc2ad..b220359 100644 --- a/mods/moreblocks/circular_saw.lua +++ b/mods/moreblocks/circular_saw.lua @@ -122,7 +122,7 @@ function circular_saw:update_inventory(pos, amount) end local node_name = stack:get_name() - local name_parts = circular_saw.known_nodes[node_name] + local name_parts = circular_saw.known_nodes[node_name] or "" local modname = name_parts[1] local material = name_parts[2] diff --git a/mods/moreblocks/stairsplus.lua b/mods/moreblocks/stairsplus.lua deleted file mode 100644 index 3f85902..0000000 --- a/mods/moreblocks/stairsplus.lua +++ /dev/null @@ -1,415 +0,0 @@ -dofile(minetest.get_modpath("moreblocks").."/_config.txt") - --- Nodes will be called :{stair,slab,panel,micro}_ - -if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then - stairsplus_expect_infinite_stacks = false -else - stairsplus_expect_infinite_stacks = true -end - --- These vales are in order: facedir in degrees = 90, 0, 270, 180, 90 - -local dirs1 = { 21, 20, 23, 22, 21 } -local dirs2 = { 15, 8, 17, 6, 15 } -local dirs3 = { 14, 11, 16, 5, 14 } - -stairsplus_can_it_stack = function(itemstack, placer, pointed_thing) - return false ---[[ - if pointed_thing.type ~= "node" then - return itemstack - end - - -- If it's being placed on an another similar one, replace it with - -- a full block - local slabpos = nil - local slabnode = nil - local p1 = pointed_thing.above - p1 = {x = p1.x, y = p1.y - 1, z = p1.z} - local n1 = minetest.env:get_node(p1) - if n1.name == modname .. ":slab_" .. subname then - slabpos = p1 - slabnode = n1 - end - if slabpos then - -- Remove the slab at slabpos - minetest.env:remove_node(slabpos) - -- Make a fake stack of a single item and try to place it - local fakestack = ItemStack(recipeitem) - pointed_thing.above = slabpos - fakestack = minetest.item_place(fakestack, placer, pointed_thing) - -- If the item was taken from the fake stack, decrement original - if not fakestack or fakestack:is_empty() then - itemstack:take_item(1) - -- Else put old node back - else - minetest.env:set_node(slabpos, slabnode) - end - return itemstack - end - - if n1.name == modname .. ":slab_" .. subname .. "_quarter" then - slabpos = p1 - slabnode = n1 - end - if slabpos then - -- Remove the slab at slabpos - minetest.env:remove_node(slabpos) - -- Make a fake stack of a single item and try to place it - local fakestack = ItemStack(modname .. ":slab_" .. subname .. "_three_quarter") - pointed_thing.above = slabpos - fakestack = minetest.item_place(fakestack, placer, pointed_thing) - -- If the item was taken from the fake stack, decrement original - if not fakestack or fakestack:is_empty() then - itemstack:take_item(1) - -- Else put old node back - else - minetest.env:set_node(slabpos, slabnode) - end - return itemstack - end - - -- Otherwise place regularly - return minetest.item_place(itemstack, placer, pointed_thing) - -]]-- - -end - -local function get_nodedef_field(nodename, fieldname) - if not minetest.registered_nodes[nodename] then - return nil - end - return minetest.registered_nodes[nodename][fieldname] -end - ---[[ - -function(itemstack, placer, pointed_thing) - local keys=placer:get_player_control() - stairsplus_rotate_and_place(itemstack, placer, pointed_thing, keys["sneak"]) - return itemstack - end - -]]-- - -function stairsplus_rotate_and_place(itemstack, placer, pointed_thing) - if not moreblocks.node_is_owned(pointed_thing.under, placer) then - local keys=placer:get_player_control() - minetest.rotate_and_place(itemstack, placer, pointed_thing, - stairsplus_expect_infinite_stacks, {force_wall = keys.sneak}) - end - return itemstack -end - -function register_stair_slab_panel_micro(modname, subname, recipeitem, groups, images, description, drop, light) - if show_stairsplus_creative_inv then - groups.not_in_creative_inventory = 0 - else - groups.not_in_creative_inventory = 1 - end - register_stair(modname, subname, recipeitem, groups, images, description, drop, light) - register_slab( modname, subname, recipeitem, groups, images, description, drop, light) - register_panel(modname, subname, recipeitem, groups, images, description, drop, light) - register_micro(modname, subname, recipeitem, groups, images, description, drop, light) - register_6dfacedir_conversion(modname, subname) -end - --- Default stairs/slabs/panels/microblocks. - -register_stair_slab_panel_micro("moreblocks", "wood", "default:wood", - {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3}, - {"default_wood.png"}, - "Wooden", - "wood", - 0) - -register_stair_slab_panel_micro("moreblocks", "stone", "default:stone", - {cracky=3}, - {"default_stone.png"}, - "Stone", - "cobble", - 0) - -register_stair_slab_panel_micro("moreblocks", "cobble", "default:cobble", - {cracky=3}, - {"default_cobble.png"}, - "Cobblestone", - "cobble", - 0) - -register_stair_slab_panel_micro("moreblocks", "mossycobble", "default:mossycobble", - {cracky=3}, - {"default_mossycobble.png"}, - "Mossy Cobblestone", - "mossycobble", - 0) - -register_stair_slab_panel_micro("moreblocks", "brick", "default:brick", - {cracky=3}, - {"default_brick.png"}, - "Brick", - "brick", - 0) - -register_stair_slab_panel_micro("moreblocks", "sandstone", "default:sandstone", - {crumbly=2, cracky=2}, - {"default_sandstone.png"}, - "Sandstone", - "sandstone", - 0) - -register_stair_slab_panel_micro("moreblocks", "steelblock", "default:steelblock", - {cracky=1, level=2}, - {"default_steel_block.png"}, - "Steel Block", - "steelblock", - 0) - -register_stair_slab_panel_micro("moreblocks", "goldblock", "default:goldblock", - {cracky=1}, - {"default_gold_block.png"}, - "Gold Block", - "goldblock", - 0) - -register_stair_slab_panel_micro("moreblocks", "copperblock", "default:copperblock", - {cracky=1, level=2}, - {"default_copper_block.png"}, - "Copper Block", - "copperblock", - 0) - -register_stair_slab_panel_micro("moreblocks", "bronzeblock", "default:bronzeblock", - {cracky=1, level=2}, - {"default_bronze_block.png"}, - "Bronze Block", - "bronzeblock", - 0) - -register_stair_slab_panel_micro("moreblocks", "diamondblock", "default:diamondblock", - {cracky=1, level=3}, - {"default_diamond_block.png"}, - "Diamond Block", - "diamondblock", - 0) - -register_stair_slab_panel_micro("moreblocks", "desert_stone", "default:desert_stone", - {cracky=3}, - {"default_desert_stone.png"}, - "Desert Stone", - "desert_stone", - 0) - -register_stair_slab_panel_micro("moreblocks", "glass", "default:glass", - {snappy=2, cracky=3, oddly_breakable_by_hand=3}, - {"moreblocks_glass_stairsplus.png"}, - "Glass", - "glass", - 0) - -register_stair_slab_panel_micro("moreblocks", "tree", "default:tree", - {tree=1, snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2}, - {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, - "Tree", - "tree", - 0) - -register_stair_slab_panel_micro("moreblocks", "jungletree", "default:jungletree", - {tree=1, snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2}, - {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, - "Jungle Tree", - "jungletree", - 0) - -register_stair_slab_panel_micro("moreblocks", "obsidian", "default:obsidian", - {cracky=1, level=2}, - {"default_obsidian.png"}, - "Obsidian", - "obsidian", - 0) - -register_stair_slab_panel_micro("moreblocks", "obsidian_glass", "default:obsidian_glass", - {cracky=3, oddly_breakable_by_hand=3}, - {"moreblocks_obsidian_glass_stairsplus.png"}, - "Obsidian Glass", - "obsidian_glass", - 0) - -register_stair_slab_panel_micro("moreblocks", "stonebrick", "default:stonebrick", - {cracky=3}, - {"default_stone_brick.png"}, - "Stone Bricks", - "stonebrick", - 0) - -register_stair_slab_panel_micro("moreblocks", "desert_stonebrick", "default:desert_stonebrick", - {cracky=3}, - {"default_desert_stone_brick.png"}, - "Desert Stone Bricks", - "desert_stonebrick", - 0) - -register_stair_slab_panel_micro("moreblocks", "sandstonebrick", "default:sandstonebrick", - {cracky=3}, - {"default_sandstone_brick.png"}, - "Sandstone Bricks", - "sandstonebrick", - 0) - --- More Blocks stairs/slabs/panels/microblocks - -register_stair_slab_panel_micro("moreblocks", "invisible", "air", - {unbreakable=1, not_in_creative_inventory=1}, - {"invisible.png"}, - "Invisible", - "invisible", - 0) - -register_stair_slab_panel_micro("moreblocks", "circle_stone_bricks", "moreblocks:circle_stone_bricks", - {cracky=3}, - {"moreblocks_circle_stone_bricks.png"}, - "Circle Stone Bricks", - "circle_stone_bricks", - 0) - -register_stair_slab_panel_micro("moreblocks", "coal_stone_bricks", "moreblocks:coal_stone_bricks", - {cracky=3}, - {"moreblocks_coal_stone_bricks.png"}, - "Coal Stone Bricks", - "Coal_stone_bricks", - 0) - -register_stair_slab_panel_micro("moreblocks", "iron_stone_bricks", "moreblocks:iron_stone_bricks", - {cracky=3}, - {"moreblocks_iron_stone_bricks.png"}, - "Iron Stone Bricks", - "iron_stone_bricks", - 0) - -register_stair_slab_panel_micro("moreblocks", "stone_tile", "moreblocks:stone_tile", - {cracky=3}, - {"moreblocks_stone_tile.png"}, - "Stonesquare", - "stone_tile", - 0) - -register_stair_slab_panel_micro("moreblocks", "split_stone_tile", "moreblocks:split_stone_tile", - {cracky=3}, - {"moreblocks_split_stone_tile_top.png", "moreblocks_split_stone_tile.png"}, - "Split Stonesquare", - "split_stone_tile", - 0) - -register_stair_slab_panel_micro("moreblocks", "jungle_wood", "default:junglewood", -- Compatibility - {snappy=1, choppy=2, oddly_breakable_by_hand=2,flammable=3}, - {"default_junglewood.png"}, - "Jungle Wood", - "jungle_wood", - 0) - -register_stair_slab_panel_micro("moreblocks", "junglewood", "default:junglewood", - {snappy=1, choppy=2, oddly_breakable_by_hand=2,flammable=3}, - {"default_junglewood.png"}, - "Jungle Wood", - "jungle_wood", - 0) - -register_stair_slab_panel_micro("moreblocks", "plankstone", "moreblocks:plankstone", - {cracky=3}, - {"moreblocks_plankstone.png", "moreblocks_plankstone.png", "moreblocks_plankstone.png", - "moreblocks_plankstone.png", "moreblocks_plankstone.png^[transformR90", "moreblocks_plankstone.png^[transformR90"}, - "Plankstone", - "plankstone", - 0) - -register_stair_slab_panel_micro("moreblocks", "coal_checker", "moreblocks:coal_checker", - {cracky=3}, - {"moreblocks_coal_checker.png", "moreblocks_coal_checker.png", "moreblocks_coal_checker.png", - "moreblocks_coal_checker.png", "moreblocks_coal_checker.png^[transformR90", "moreblocks_coal_checker.png^[transformR90"}, - "Coal Checker", - "coal_checker", - 0) - -register_stair_slab_panel_micro("moreblocks", "iron_checker", "moreblocks:iron_checker", - {cracky=3}, - {"moreblocks_iron_checker.png", "moreblocks_iron_checker.png", "moreblocks_iron_checker.png", - "moreblocks_iron_checker.png", "moreblocks_iron_checker.png^[transformR90", "moreblocks_iron_checker.png^[transformR90"}, - "Iron Checker", - "iron_checker", - 0) - -register_stair_slab_panel_micro("moreblocks", "cactus_checker", "moreblocks:cactus_checker", - {cracky=3}, - {"moreblocks_cactus_checker.png", "moreblocks_cactus_checker.png", "moreblocks_cactus_checker.png", - "moreblocks_cactus_checker.png", "moreblocks_cactus_checker.png^[transformR90", "moreblocks_cactus_checker.png^[transformR90"}, - "Cactus Checker", - "cactus_checker", - 0) - -register_stair_slab_panel_micro("moreblocks", "coal_stone", "moreblocks:coal_stone", - {cracky=3}, - {"moreblocks_coal_stone.png"}, - "Coal Stone", - "coal_stone", - 0) - -register_stair_slab_panel_micro("moreblocks", "iron_stone", "moreblocks:iron_stone", - {cracky=3}, - {"moreblocks_iron_stone.png"}, - "Iron Stone", - "iron_stone", - 0) - -register_stair_slab_panel_micro("moreblocks", "glow_glass", "moreblocks:glow_glass", - {snappy=2,cracky=3,oddly_breakable_by_hand=3}, - {"moreblocks_glow_glass_stairsplus.png"}, - "Glow Glass", - "glow_glass", - 11) - -register_stair_slab_panel_micro("moreblocks", "super_glow_glass", "moreblocks:super_glow_glass", - {snappy=2, cracky=3, oddly_breakable_by_hand=3}, - {"moreblocks_super_glow_glass_stairsplus.png"}, - "Super Glow Glass", - "super_glow_glass", - 15) - -register_stair_slab_panel_micro("moreblocks", "coal_glass", "moreblocks:coal_glass", - {snappy=2, cracky=3, oddly_breakable_by_hand=3}, - {"moreblocks_coal_glass_stairsplus.png"}, - "Coal Glass", - "coal_glass", - 0) - -register_stair_slab_panel_micro("moreblocks", "iron_glass", "moreblocks:iron_glass", - {snappy=2, cracky=3, oddly_breakable_by_hand=3}, - {"moreblocks_iron_glass_stairsplus.png"}, - "Iron Glass", - "iron_glass", - 0) - -register_stair_slab_panel_micro("moreblocks", "wood_tile", "moreblocks:wood_tile", - {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3}, - {"moreblocks_wood_tile.png", "moreblocks_wood_tile.png", "moreblocks_wood_tile.png", - "moreblocks_wood_tile.png", "moreblocks_wood_tile.png^[transformR90", "moreblocks_wood_tile.png^[transformR90"}, - "Wooden Tile", - "wood_tile", - 0) - -register_stair_slab_panel_micro("moreblocks", "wood_tile_center", "moreblocks:wood_tile_center", - {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3}, - {"moreblocks_wood_tile_center.png", "moreblocks_wood_tile_center.png", "moreblocks_wood_tile_center.png", - "moreblocks_wood_tile_center.png", "moreblocks_wood_tile_center.png^[transformR90", "moreblocks_wood_tile_center.png^[transformR90"}, - "Centered Wooden Tile", - "wood_tile_center", - 0) - -register_stair_slab_panel_micro("moreblocks", "wood_tile_full", "moreblocks:wood_tile_full", - {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3}, - {"moreblocks_wood_tile_full.png", "moreblocks_wood_tile_full.png", "moreblocks_wood_tile_full.png", - "moreblocks_wood_tile_full.png", "moreblocks_wood_tile_full.png^[transformR90", "moreblocks_wood_tile_full.png^[transformR90"}, - "Full Wooden Tile", - "wood_tile_full", - 0) diff --git a/mods/moreblocks/stairsplus/registrations.lua b/mods/moreblocks/stairsplus/registrations.lua index 8ba7573..cc22d33 100644 --- a/mods/moreblocks/stairsplus/registrations.lua +++ b/mods/moreblocks/stairsplus/registrations.lua @@ -10,7 +10,7 @@ local default_nodes = { -- Default stairs/slabs/panels/microblocks: "bronzeblock", "diamondblock", "desert_stone", - "desert_cobble", +-- "desert_cobble", "glass", "tree", "wood", @@ -46,3 +46,4 @@ for _, name in pairs(default_nodes) do sunlight_propagates = true, }) end + diff --git a/mods/moreblocks/stairsplus_convert.lua b/mods/moreblocks/stairsplus_convert.lua deleted file mode 100644 index 7d6b94b..0000000 --- a/mods/moreblocks/stairsplus_convert.lua +++ /dev/null @@ -1,133 +0,0 @@ --- Function to convert all stairs/slabs/etc nodes from --- inverted, wall, etc to regular + 6d facedir - -local dirs1 = { 21, 20, 23, 22, 21 } -local dirs2 = { 15, 8, 17, 6, 15 } -local dirs3 = { 14, 11, 16, 5, 14 } - -function register_6dfacedir_conversion(modname, material) - --print("Register stairsplus 6d facedir conversion") - --print('ABM for '..modname..' "'..material..'"') - - local objects_list1 = { - modname..":slab_" .. material .. "_inverted", - modname..":slab_" .. material .. "_quarter_inverted", - modname..":slab_" .. material .. "_three_quarter_inverted", - modname..":stair_" .. material .. "_inverted", - modname..":stair_" .. material .. "_wall", - modname..":stair_" .. material .. "_wall_half", - modname..":stair_" .. material .. "_wall_half_inverted", - modname..":stair_" .. material .. "_half_inverted", - modname..":stair_" .. material .. "_right_half_inverted", - modname..":panel_" .. material .. "_vertical", - modname..":panel_" .. material .. "_top", - } - - local objects_list2 = { - modname..":slab_" .. material .. "_wall", - modname..":slab_" .. material .. "_quarter_wall", - modname..":slab_" .. material .. "_three_quarter_wall", - modname..":stair_" .. material .. "_inner_inverted", - modname..":stair_" .. material .. "_outer_inverted", - modname..":micro_" .. material .. "_top" - } - - for j in ipairs(objects_list1) do - local flip_upside_down = false - local flip_to_wall = false - - local object = objects_list1[j] - local dest_object = objects_list1[j] - - if string.find(dest_object, "_inverted") then - flip_upside_down = true - dest_object = string.gsub(dest_object, "_inverted", "") - end - - if string.find(dest_object, "_top") then - flip_upside_down = true - dest_object = string.gsub(dest_object, "_top", "") - end - - if string.find(dest_object, "_wall") then - flip_to_wall = true - dest_object = string.gsub(dest_object, "_wall", "") - end - - if string.find(dest_object, "_vertical") then - flip_to_wall = true - dest_object = string.gsub(dest_object, "_vertical", "") - end - - if string.find(dest_object, "_half") and not string.find(dest_object, "_right_half") then - dest_object = string.gsub(dest_object, "_half", "_right_half") - elseif string.find(dest_object, "_right_half") then - dest_object = string.gsub(dest_object, "_right_half", "_half") - end - - --print(" +---> convert "..object) - --print(" | to "..dest_object) - - minetest.register_abm({ - nodenames = { object }, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local fdir = node.param2 or 0 - - if flip_upside_down and not flip_to_wall then - nfdir = dirs1[fdir+2] - elseif flip_to_wall and not flip_upside_down then - nfdir = dirs2[fdir+1] - elseif flip_to_wall and flip_upside_down then - nfdir = dirs3[fdir+2] - end - minetest.env:add_node(pos, {name = dest_object, param2 = nfdir}) - end - }) - end - - for j in ipairs(objects_list2) do - local flip_upside_down = false - local flip_to_wall = false - - local object = objects_list2[j] - local dest_object = objects_list2[j] - - if string.find(dest_object, "_inverted") then - flip_upside_down = true - dest_object = string.gsub(dest_object, "_inverted", "") - end - - if string.find(dest_object, "_top") then - flip_upside_down = true - dest_object = string.gsub(dest_object, "_top", "") - end - - if string.find(dest_object, "_wall") then - flip_to_wall = true - dest_object = string.gsub(dest_object, "_wall", "") - end - - --print(" +---> convert "..object) - --print(" | to "..dest_object) - - minetest.register_abm({ - nodenames = { object }, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local fdir = node.param2 - local nfdir = 20 - - if flip_upside_down and not flip_to_wall then - nfdir = dirs1[fdir+1] - elseif flip_to_wall and not flip_upside_down then - nfdir = dirs2[fdir+2] - - end - minetest.env:add_node(pos, {name = dest_object, param2 = nfdir}) - end - }) - end -end diff --git a/mods/moreblocks/textures/moreblocks_jungle_wood.png b/mods/moreblocks/textures/moreblocks_jungle_wood.png deleted file mode 100644 index ebc64858d592ef7a88f3a7725cdfd24ea590ee0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 362 zcmV-w0hRuVP)Px#32;bRa{vGi!vFvd!vV){sAK>D00(qQO+^RX1sV?tDaJr5X8-^I{7FPXR4C7N zQo(8hK@5FcqX!Q~krm2<%R&V~aK(eaQ1I$^3jK~Ey$OX{=Cl;Lh_Z({%+Tr~n1&O;C}KB~Rm8OcDX;_quFEFN=xRR2x8Z2DHk?*7<&~D_wEx>}i5( zBvV#G&Em(v2NoKXt0BXsLvfOnEGr1%&_{6&ZnO30|_z*Ff>8EDPVddq?jc zV$pGHPc5&#`sUp1esklKze@Y0&(;5DkXxZ{)?6Q4&eK9$| z_Tt}z9=npJ{t<4n3A(Jg&~KB8&;cjropvcZO4dYsp4_xZfUounSHMFz<~i#a`(0ms z+g$yB<*7Gu6HI6AuwNN5H8N!Nnn{bgQk(M%E^B6+ob9sNm9Wfgu2s#pn$|rHM{M6~ e+?mZ@z$o;%?DXGEPj_GlF?hQAxvXigP)VGd000McNliru-2xgBB`D{z@Q?ri0hdWc zK~y-)b(1k}+dvRS-;zsFq#|{J1qcoh6@hKog;V4N0aCbglOj!;oF=7DkTO*Omxga) zKyecpFl@j`fD~G5SCmLj3W<@HqJFhAJM;PZXI6baI~F#u$O`}>9eQzvDqle#yy|#~ zqv61dzhD34PnKd`~R#yeK?f5F-@lKGFHDk9^kAYNxR-}REAagUC>PpcTW?q@pZqqlVEEK->!Zw zFIKULP>KMGyeRo{_Qo5h9*rNpuO$)e?{zRXr<-cBMMx9{OrGaF{4vz)_04z!teyXD zgp!bUOJlPfQ8`JhAyA+cxA#+Ex+XXo_Pp6&{1_3(nzS7u#T-pF2XskIMF-si8WA`cJ_oEI0005WNkl$DO^eh(5PdzVo=zv5 z@iaK>y21$JDy!f{ym%1i=E0-j$=~On@GgP}MdqM8u(*&}aa__f-RY#0@{rjOS>LG& z-m9-y;@zuLT%!&R07(%5Q$+v-0DzfWWC|B$nJ%5RzNAW$-?bvj)KO zeE0NZHtaAa7Hw@ESO_3!MYHL_#+3BstmwAASbiVI&#grb=QB4$hY}B-T;7*W$gjzSc}E;2SkyQ zQOgVwFN)`We0mfc7Uy|CaEg6 zetEvbKiH?FW4ZogyCjVzgvd8L=gSvQj&TFd8ggYlKb)9dh3gY0ieeSdXA}Gf6Y`;1 zZ!8$|!&?BXuNk7fyy{FG%2s*dtRY2Fq6k8)e{XkXNMZ@DN0IEPtGxL5_2SLqVegW7 s{qk{W+U|=1#7Y7veVAtA=FbE83x$*D#cVg`RR91007*qoM6N<$g2w>(?*IS* diff --git a/mods/moreblocks/textures/moreblocks_wood_tile_left.png b/mods/moreblocks/textures/moreblocks_wood_tile_left.png deleted file mode 100644 index b84166f241a5ddcaab6d7c0684f85d0cb333957d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmVVGd000McNliru-2xgBB`yxpRiyv`0fDxu zfA#&2FXzVq{P;Pc4RQVLb3?&+I@`FES<^`lAnOU4HJz7WXDhk5yf_O0q6&l%C_?}Q zeo=D%VYHz{r^Dy9)C%6d8DOkum`Yp`p;V9A-#HJDhMU{TMga@IRw94@ag;IReBEZTNnn{YgxEft&` x?srVGd000McNliru-2xgBB{OZ;IeY*B0isDn zK~y-)jgvob6G0Hgf9u=3^PaIggrx{1QaLCTY2XVWQKU;lktS`vNhCfA4Fxqwhzim1 zFCYqALRhkhgv2fE`f}$R3j3_PvlH>US%!;bJLu6^jU^2%snyCF=O`p0tgrqmY2xw|ZDt&`&g39uS5d(m$8{xUlF4`#X4N zF-gDCMrGKm_rEC#=tdfs6^JS@v4)NUrRY=z-q|(LWR_x*{+cw7HHir^k&r|hO2PS@ zEGy8JY1_?%NDHdWaUMh|V5wku^9H}{9DP2Xu79eJtU@=6NsL(;xH7U7tew+~HTvT? z1=1@wO(~7@9y%cc$l{WuYd{KoHb>vz9c;*d{`wmSqagrqKmWvK0X|zPQz7#_1Hg0* z>g@EP0F5>P?hXh15A<~g)|aYHIGLq*XO~mhwxaFA$t>mFr|J5zs`0D#IbVnNsRR52 XDTBPxM>>G>00000NkvXXu0mjfsNLwf diff --git a/mods/moreores/init.lua b/mods/moreores/init.lua index 32fb5ef..7585d7d 100644 --- a/mods/moreores/init.lua +++ b/mods/moreores/init.lua @@ -9,7 +9,7 @@ if (minetest.get_modpath("intllib")) then end moreores_modpath = minetest.get_modpath("moreores") -dofile(moreores_modpath.."/_config.txt") +dofile(moreores_modpath .. "/_config.txt") --[[ **** @@ -35,58 +35,47 @@ local function hoe_on_use(itemstack, user, pointed_thing, uses) end local under = minetest.get_node(pt.under) - local p = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} - local above = minetest.get_node(p) + local pos = {x = pt.under.x, y = pt.under.y + 1, z = pt.under.z} + local above = minetest.get_node(pos) - -- return if any of the nodes is not registered - if not minetest.registered_nodes[under.name] then - return - end - if not minetest.registered_nodes[above.name] then - return - end + -- Return if any of the nodes is not registered: + if not minetest.registered_nodes[under.name] then return end + if not minetest.registered_nodes[above.name] then return end - -- check if the node above the pointed thing is air - if above.name ~= "air" then - return - end + -- Check if the node above the pointed thing is air: + if above.name ~= "air" then return end - -- check if pointing at dirt - if minetest.get_item_group(under.name, "soil") ~= 1 then - return - end + -- Check if pointing at dirt: + if minetest.get_item_group(under.name, "soil") ~= 1 then return end - -- turn the node into soil, wear out item and play sound - minetest.set_node(pt.under, {name="farming:soil"}) - minetest.sound_play("default_dig_crumbly", { - pos = pt.under, - gain = 0.5, - }) - itemstack:add_wear(65535/(uses-1)) + -- Turn the node into soil, wear out item and play sound: + minetest.set_node(pt.under, {name ="farming:soil"}) + minetest.sound_play("default_dig_crumbly", {pos = pt.under, gain = 0.5}) + itemstack:add_wear(65535 / (uses - 1)) return itemstack end local function get_recipe(c, name) if name == "sword" then - return {{c},{c},{"default:stick"}} + return {{c}, {c}, {"group:stick"}} end if name == "shovel" then - return {{c},{"default:stick"},{"default:stick"}} + return {{c}, {"group:stick"}, {"group:stick"}} end if name == "axe" then - return {{c,c},{c,"default:stick"},{"","default:stick"}} + return {{c, c}, {c, "group:stick"}, {"", "group:stick"}} end if name == "pick" then - return {{c,c,c},{"","default:stick",""},{"","default:stick",""}} + return {{c, c, c}, {"", "group:stick", ""}, {"", "group:stick", ""}} end if name == "hoe" then - return {{c,c},{"","default:stick"},{"","default:stick"}} + return {{c, c}, {"", "group:stick"}, {"", "group:stick"}} end if name == "block" then - return {{c,c,c},{c,c,c},{c,c,c}} + return {{c, c, c}, {c, c, c}, {c, c, c}} end if name == "lockedchest" then - return {{"default:wood","default:wood","default:wood"},{"default:wood",c,"default:wood"},{"default:wood","default:wood","default:wood"}} + return {{"group:wood", "group:wood", "group:wood"}, {"group:wood", c, "group:wood"}, {"group:wood", "group:wood", "group:wood"}} end end @@ -104,7 +93,7 @@ local function add_ore(modname, description, mineral_name, oredef) minetest.register_node(modname .. ":mineral_"..mineral_name, { description = S("%s Ore"):format(S(description)), tiles = {"default_stone.png^"..modname.."_mineral_"..mineral_name..".png"}, - groups = {cracky=3}, + groups = {cracky = 3}, sounds = default_stone_sounds, drop = lumpitem }) @@ -115,7 +104,7 @@ local function add_ore(modname, description, mineral_name, oredef) minetest.register_node(blockitem, { description = S("%s Block"):format(S(description)), tiles = { img_base .. "_block.png" }, - groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2}, + groups = {snappy = 1,bendy = 2, cracky = 1,melty = 2,level= 2}, sounds = default_stone_sounds }) minetest.register_alias(mineral_name.."_block", blockitem) @@ -158,20 +147,20 @@ local function add_ore(modname, description, mineral_name, oredef) if oredef.makes.chest then minetest.register_craft( { - output = "default:chest_locked 1", + output = "default:chest_locked", recipe = { - { ingot }, - { "default:chest" } + {ingot}, + {"default:chest"} } }) minetest.register_craft( { - output = "default:chest_locked 1", + output = "default:chest_locked", recipe = get_recipe(ingot, "lockedchest") }) end oredef.oredef.ore_type = "scatter" - oredef.oredef.ore = modname..":mineral_"..mineral_name + oredef.oredef.ore = modname .. ":mineral_" .. mineral_name oredef.oredef.wherein = "default:stone" minetest.register_ore(oredef.oredef) @@ -181,25 +170,32 @@ local function add_ore(modname, description, mineral_name, oredef) description = "", inventory_image = toolimg_base .. toolname .. ".png", tool_capabilities = { - max_drop_level=3, - groupcaps=tooldef + max_drop_level = 3, + groupcaps = tooldef } } - + if toolname == "sword" then - tdef.full_punch_interval = oredef.punchint + tdef.tool_capabilities.full_punch_interval = oredef.full_punch_interval + tdef.tool_capabilities.damage_groups = oredef.damage_groups tdef.description = S("%s Sword"):format(S(description)) end - + if toolname == "pick" then + tdef.tool_capabilities.full_punch_interval = oredef.full_punch_interval + tdef.tool_capabilities.damage_groups = oredef.damage_groups tdef.description = S("%s Pickaxe"):format(S(description)) end - + if toolname == "axe" then + tdef.tool_capabilities.full_punch_interval = oredef.full_punch_interval + tdef.tool_capabilities.damage_groups = oredef.damage_groups tdef.description = S("%s Axe"):format(S(description)) end if toolname == "shovel" then + tdef.full_punch_interval = oredef.full_punch_interval + tdef.tool_capabilities.damage_groups = oredef.damage_groups tdef.description = S("%s Shovel"):format(S(description)) end @@ -224,14 +220,13 @@ local function add_ore(modname, description, mineral_name, oredef) end end --- Add everything (compact(ish)!) - +-- Add everything: local modname = "moreores" local oredefs = { silver = { desc = "Silver", - makes = {ore=true, block=true, lump=true, ingot=true, chest=true}, + makes = {ore = true, block = true, lump = true, ingot = true, chest = true}, oredef = {clust_scarcity = moreores_silver_chunk_size * moreores_silver_chunk_size * moreores_silver_chunk_size, clust_num_ores = moreores_silver_ore_per_chunk, clust_size = moreores_silver_chunk_size, @@ -240,29 +235,30 @@ local oredefs = { }, tools = { pick = { - cracky={times={[1]=2.60, [2]=1.00, [3]=0.60}, uses=100, maxlevel=1} + cracky = {times = {[1] = 2.60, [2] = 1.00, [3] = 0.60}, uses = 100, maxlevel= 1} }, hoe = { uses = 300 }, shovel = { - crumbly={times={[1]=1.10, [2]=0.40, [3]=0.25}, uses=100, maxlevel=1} + crumbly = {times = {[1] = 1.10, [2] = 0.40, [3] = 0.25}, uses = 100, maxlevel= 1} }, axe = { - choppy={times={[1]=2.50, [2]=0.80, [3]=0.50}, uses=100, maxlevel=1}, - fleshy={times={[2]=1.10, [3]=0.60}, uses=100, maxlevel=1} + choppy = {times = {[1] = 2.50, [2] = 0.80, [3] = 0.50}, uses = 100, maxlevel= 1}, + fleshy = {times = {[2] = 1.10, [3] = 0.60}, uses = 100, maxlevel= 1} }, sword = { - fleshy={times={[2]=0.70, [3]=0.30}, uses=100, maxlevel=1}, - snappy={times={[2]=0.70, [3]=0.30}, uses=100, maxlevel=1}, - choppy={times={[3]=0.80}, uses=100, maxlevel=0} + fleshy = {times = {[2] = 0.70, [3] = 0.30}, uses = 100, maxlevel= 1}, + snappy = {times = {[2] = 0.70, [3] = 0.30}, uses = 100, maxlevel= 1}, + choppy = {times = {[3] = 0.80}, uses = 100, maxlevel= 0} } }, - punchint = 1.0 + full_punch_interval = 1.0, + damage_groups = {fleshy = 6}, }, tin = { desc = "Tin", - makes = {ore=true, block=true, lump=true, ingot=true, chest=false}, + makes = {ore = true, block = true, lump = true, ingot = true, chest = false}, oredef = {clust_scarcity = moreores_tin_chunk_size * moreores_tin_chunk_size * moreores_tin_chunk_size, clust_num_ores = moreores_tin_ore_per_chunk, clust_size = moreores_tin_chunk_size, @@ -273,7 +269,7 @@ local oredefs = { }, mithril = { desc = "Mithril", - makes = {ore=true, block=true, lump=true, ingot=true, chest=false}, + makes = {ore = true, block = true, lump = true, ingot = true, chest = false}, oredef = {clust_scarcity = moreores_mithril_chunk_size * moreores_mithril_chunk_size * moreores_mithril_chunk_size, clust_num_ores = moreores_mithril_ore_per_chunk, clust_size = moreores_mithril_chunk_size, @@ -282,25 +278,26 @@ local oredefs = { }, tools = { pick = { - cracky={times={[1]=2.25, [2]=0.55, [3]=0.35}, uses=200, maxlevel=1} + cracky = {times = {[1] = 2.25, [2] = 0.55, [3] = 0.35}, uses = 200, maxlevel= 1} }, hoe = { uses = 1000 }, shovel = { - crumbly={times={[1]=0.70, [2]=0.35, [3]=0.20}, uses=200, maxlevel=1} + crumbly = {times = {[1] = 0.70, [2] = 0.35, [3] = 0.20}, uses = 200, maxlevel= 1} }, axe = { - choppy={times={[1]=1.75, [2]=0.45, [3]=0.45}, uses=200, maxlevel=1}, - fleshy={times={[2]=0.95, [3]=0.30}, uses=200, maxlevel=1} + choppy = {times = {[1] = 1.75, [2] = 0.45, [3] = 0.45}, uses = 200, maxlevel= 1}, + fleshy = {times = {[2] = 0.95, [3] = 0.30}, uses = 200, maxlevel= 1} }, sword = { - fleshy={times={[2]=0.65, [3]=0.25}, uses=200, maxlevel=1}, - snappy={times={[2]=0.70, [3]=0.25}, uses=200, maxlevel=1}, - choppy={times={[3]=0.65}, uses=200, maxlevel=0} + fleshy = {times = {[2] = 0.65, [3] = 0.25}, uses = 200, maxlevel= 1}, + snappy = {times = {[2] = 0.70, [3] = 0.25}, uses = 200, maxlevel= 1}, + choppy = {times = {[3] = 0.65}, uses = 200, maxlevel= 0} } }, - punchint = 0.45 + full_punch_interval = 0.45, + damage_groups = {fleshy = 9}, } } @@ -314,13 +311,12 @@ minetest.register_craft({ output = "moreores:copper_rail 16", recipe = { {"default:copper_ingot", "", "default:copper_ingot"}, - {"default:copper_ingot", "default:stick", "default:copper_ingot"}, + {"default:copper_ingot", "group:stick", "default:copper_ingot"}, {"default:copper_ingot", "", "default:copper_ingot"} } }) --- Bronze has some special cases, because it is made from copper and tin - +-- Bronze has some special cases, because it is made from copper and tin: minetest.register_craft( { type = "shapeless", output = "default:bronze_ingot 3", @@ -331,8 +327,7 @@ minetest.register_craft( { } }) --- Unique node - +-- Unique node: minetest.register_node("moreores:copper_rail", { description = S("Copper Rail"), drawtype = "raillike", @@ -346,7 +341,7 @@ minetest.register_node("moreores:copper_rail", { type = "fixed", fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, - groups = {bendy=2,snappy=1,dig_immediate=2,rail=1,connect_to_raillike=1}, + groups = {bendy = 2,snappy = 1,dig_immediate = 2,rail= 1, connect_to_raillike = 1}, mesecons = { effector = { action_on = function(pos, node) @@ -360,9 +355,11 @@ minetest.register_node("moreores:copper_rail", { }, }) --- mg suppport +-- mg support: if minetest.get_modpath("mg") then dofile(moreores_modpath.."/mg.lua") end -print(S("[moreores] loaded.")) +if minetest.setting_getbool("log_mods") then + print(S("[moreores] loaded.")) +end diff --git a/mods/moreores/locale/de.txt b/mods/moreores/locale/de.txt new file mode 100644 index 0000000..2eb6075 --- /dev/null +++ b/mods/moreores/locale/de.txt @@ -0,0 +1,22 @@ +# Translation by Xanthin + +[moreores] loaded. = [moreores] geladen. + +%s Ore = %serz +%s Lump = %sklumpen +%s Ingot = %sbarren +%s Block = %sblock +%s Pickaxe = %sspitzhacke +%s Shovel = %sschaufel +%s Axe = %saxt +%s Sword = %sschwert +%s Hoe = %shacke + +Copper = Kupfer +Tin = Zinn +Bronze = Bronze +Silver = Silber +Gold = Gold +Mithril = Mithril + +Copper Rail = Kupferschiene diff --git a/mods/moreores/textures/moreores_bronze_block.png b/mods/moreores/textures/moreores_bronze_block.png index de6a34a2903f8e083b9b6f8dcef810eadd8ba5fb..3f714dfc8df2307f01b1aea36631fd8897f6c38d 100644 GIT binary patch delta 125 zcmbQr)WjFJy`3zGn}b(lf5H@j6jRO>_%)r2R1cVuTYVlg{o{7k1}QXTN2V zWcXG8I@jSdg>%2V++zQ-X7&Edrt^N*8m3;BcJn*G=xS0`ctCEbT!U8sR-khkJYD@< J);T3K0RU`0YA65z diff --git a/mods/moreores/textures/moreores_bronze_ingot.png b/mods/moreores/textures/moreores_bronze_ingot.png index a7a73828b261789998e480f8f3bc684f2700fdbc..99b3f02afccb15a9a387a28cff7645b4ca76d264 100644 GIT binary patch delta 197 zcmcc0bd7O>WIZzj1A~Sxe=v|T3-AeX1=7aG#(CxplROz__%JLBW>^uzuql$^Kmx;! z9EN|b-2Xa-|2H!I@0b5SLE--t&HvMM|Ie`$^R4_0)X7v5aVWdgYw=x4V{!7CiUb xB@)RXxw69aqxemR<9+3492;gVsjNH0tRTa@;L!h^n?REpJYD@<);T3K0RXz6OWXhe delta 325 zcmV-L0lNOy0o4MK8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh2N4`6oLZGB0002uNklYU6oDQt**L^(Mr XtFLERw>u&W00000NkvXXu0mjf!l8?a diff --git a/mods/moreores/textures/moreores_copper_block.png b/mods/moreores/textures/moreores_copper_block.png index c8cdeea50a12c0b5775a1bb28080b187b23cffba..9a164af84f33b7a05a8dfd52ebfd2094912d96e7 100644 GIT binary patch delta 111 zcmey#*uXeJB7>2cfq_BQHdhHqu?6^qxL({l?Z)vXw;sD?07XnaT^vI=qLY98pTE#? z!b10n3lC3R$k-tzDJ3Z>Wg#i0A{nJ-RN|8|W6h}z2c|z{Q1`g`|35?IeZJ}T1@3o& P1~7QK`njxgN@xNAT2LrJ delta 233 zcmZo*{K+^$qMn0|fq_B(^Z!I3#g^pl?!xdN1Q+aGJ{c&&S>O>_%)r2R1cVuU-v~8H_@lk)< zjYOp-0BpnjF84M70004WQchC`A#0-g{6$>P|CUpw-vxr zG|omG$Sfkx#YjO7vUSWAr=S9qa`wLAJ_v!*Je*i>s2a$le|ojIdh)+)#25nkW4Ye2 P00000NkvXXu0mjfu*F^i delta 346 zcmV-g0j2)t0qO#f8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh2N51HEx&SX0002@NklE=OvDFp(#$Bk1Cs2-4n$jP$#66VK&cb~n9K}R{Z&Mc*ljgsqo#y{Pj`py?XVm_ti8Nj s5is!=0?}_l8km`Gt0}K8>XQA)H+ZpuUu9!K%>V!Z07*qoM6N<$f^|fb?EnA( diff --git a/mods/moreores/textures/moreores_copper_lump.png b/mods/moreores/textures/moreores_copper_lump.png index de03dcdff91846bf927eab72255dd385f012876a..45702a9c09285868e2c0103863f266ee40425346 100644 GIT binary patch delta 208 zcmV;>05AXk0^tFW8Gi!+001a04^sdD06b7kR7C&)09iyXT}LoxPBnsKLx*QZk#0(x zc2J^wQ>A@WsDM|hgIlYFT&#v)t%qQk_;K)U>4g6_=OnR4&o9FB6Q;^5qZSv0KU6(u*nOB#sZG|C(ru;0000< KMNUMnLSTaRnNv;x delta 366 zcmV-!0g?XU0saDz8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh2N56|x51#t0003CNklS*g+E`;BH;G?(6n6-k&M~gKXHC#aCLfM06agS$Pxg`JY~Cg;Vd<%#aZ-1tLlm&%IiQZ#mo+0y$)ozF5y$$o7>&~Yq!w{`Co*w|v{ptXn zhOilf(c=JFX=h9J{D7*I00^lV#e)06>tciGBcF;_e1udsQAmX-%El|WO^-FX?r}Dq zq94AY^yKF&9PO;zC56L;TvirSdcx(+owM{G>~5_Yz>4eCdGSA~Pkk_aY_C{n4*&oF M07*qoM6N<$f_f~XXaE2J diff --git a/mods/moreores/textures/moreores_copper_rail.png b/mods/moreores/textures/moreores_copper_rail.png index 0a0b56fc4ea976cbe9e802cc87cf74b0e5976780..73963f629f9bf6ff7a8ef6ac3febbb3240d9f6c2 100644 GIT binary patch delta 422 zcmZ3)vXyy)WIZzj1A~Sxe=v}`9pDq<3Z!EkB~sj_Q#_ZFQbUYVW3*CRvUYuEs!n&h?u0D;iP`#-a}A~fQJ%rHd>}HM zQD`)?$Y>T26&uYiHl9;rG^fOPZi(^yQXn!}SZ1=Q+;nlJ>5>Z5C6#7NtIU>Ho3E%f zUs+?my3S&KqveKX%grrTTiUF)wOem*x4F1x%IfDuAwd5zmIV0)GdMiEk;cGK&(PuN z;usL9_jn;oMVbOTGpuK7EM@xw&+eB~FWe-jbMJBJ{2~UG zqdO$KwsgC7efs}(M)&u{mv_%ytC-5D(IxMu8@v9PP~54)^ KpUXO@geCxCxT4hn delta 532 zcmV+v0_**?1EK_w8Gi-<001BJ|6u?C00DDSM?wIu&K&6g000JJOGiWi{{a60|De66 zlK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1se<^AafSBmH+?&qDe$SR5;7c zlRr-sK^Vq=Gds7(a#5o|ETpiZGm3|QBHCA0 zZ%cDCSxy0bd_0srJbQ4>76L_wlB5=VU(#r5w6W~$B~&Xe_j=-nz58TAD1i5$%iQmC zMp)gYy4U7>A%BOI(AE}{f|PKspnx0zOKaOlM?2{Xl7Ex}cr$r3Yn&Y~TCGzq^#piA z5Y`jU28y_42;aKSNHJyi@|ju*4Wchh%l6dRJZVQ0U^<%`1cd{T8Gi!+001a04^sdD0H{z*R7C&)0BA`TY)cnyOBirX7;#E4aZVX= zPZ@Gg7;;Y{OnQ=0iax$B9GJl(MGn{iWoO3gsbu^xJ zGoN)dp?5W+cr>GUHKchpq`g+(X5n{&3qI90004W zQchC{(LH7+*#I&e zCIDpgQYbyLKyH%BVUn;PvP$6y!`N*+Wy|D!j$W(8bOi!g!%OSM{-I)OJIiPSwOvkI zK0&Z{!CjW@quX>5hNdkrmid0%8T98(Q`c3x8>n8g%HOfS>mZ{w1Mid5I!y2dbu<%u T2x6Sk00000NkvXXu0mjfS2dG# delta 567 zcmV-70?7S^1H}Z88Gi-<001BJ|6u?C00DDSM?wIu&K&6g000JJOGiWi{{a60|De66 zlK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1se<^E9As)9smFV#Ysd#R5;6} zlHW^HaTvxw-|Z}$42&)^E9j;xAzG=Ue<8aGFS?9~z#s}VB!3-35D1}TbuofKBueeq zSS#qi7?CAKlhW+$d=*0@Vr*xgy$#qr!h?pf@UW z>6GCDe$dUnLoyrhG0?TM2W2)M^A%T(Y7eI-xp?XFKOHnPYA3dLG>sWtIdecJZ*&>q z(esDp@o?>==6?(Qbp+QJi>fl<8FFH!WPGlwv(Ix4zvUCA@9_`aQm69{yIox9o5KV+$V^S=8 z1c2$09?=^m!l57~*W=#R6Y_1b#yuE3CH={_DgcmQbd2K1g#t^pka+1BZhR|)T^DKBRrYP- zP+x~6`Y?|h;lXnqlD>6%`zAKeL`EynW>03dN@lgMqd%nH)ozZE5f}gf002ovPDHLk FV1hw<{aye7 diff --git a/mods/moreores/textures/moreores_copper_rail_curved.png b/mods/moreores/textures/moreores_copper_rail_curved.png index 3bd46820063d281a4def405d832cdbb2a8fe145f..6cfc8c2dc2c1e5f698f08e32fdd1f2de3c9e6722 100644 GIT binary patch delta 358 zcmX@W@{MVNWIZzj1A~Sxe=v|*8sHP+3Zyfe`Ql&Ohu`WinE=H|6R=GJ|y(K}tB~iOQ zNux7Gvo~F{H&bsyw*JIy{Yg1MWH2?~pngW7(X1k)*~P|lN{r{07|$;?nO|nSu-tS} zxyhmm(N@i^brx$HEH18@(p9zH6zEdMk|4ie28U-i(tw`Kgx3@ir%4;Q&~>bbb|p8NMd6Qtn4RcVHVE87?{CbKxq<|%G?+^@DKzK*F! zdd3|l6Y>28-xy4`EjP}&%gp=x`S~~J9GKhHx!a`u^rbhL*KXhUV8PGmeTNEar!SCH v%f7E4FSFFOxp(T>`NvDrJJ}?7Urw&q)#A}(m;F!(w2Hyg)z4*}Q$iB}xb=cw delta 562 zcmV-20?qyQ0>A{28Gi-<001BJ|6u?C00DDSM?wIu&K&6g000JJOGiWi{{a60|De66 zlK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1se<^1vnC7(EtDez)3_wR5;7M zlHW^HVHn3huUls)#=s_;v~)rtg@mE@1L{u*LMUitsKbjuNPifmLa-Z!)Qc?IRje_D z=)ysP;QtVk=uO=vN)W*^n>#!0Y-djwhuQt5;%$qH>pUd+y z)+erj%}hd^&e=Va?QcJMKHl2^`Mz&avMYxtaP;imj{2G{kjww#)x&-{h^;7>r+TV_XllJin%X1M&>7W`fpnVgLXD07*qoM6N<$g0`Ii AiU0rr diff --git a/mods/moreores/textures/moreores_copper_rail_t_junction.png b/mods/moreores/textures/moreores_copper_rail_t_junction.png index c8ecd9161a95d21ba30f51a8bd4fd9394b714ecc..57759193a2798bebe1899827ad4e43f53668b652 100644 GIT binary patch delta 358 zcmX@e@{MVNWIZzj1A~Sxe=v}mAK(+>3Z&CLr8B%_GQDMTd}MNbWpaIG^894;fyiIB zAV99r%b*ZQ2Fex%$`uF6mjug~2FsO&$XA2{kwRsdLUp7{ZKPsdjA~tsT79%qbG&*> zf_iVdW`CC6#BBXZIR=w+4W{H8Ov^W%o^Mz`qrh-Rq0#JO<2fb9b4!fpl^D-2HJM*# zys+GKNrmb18uJx3=Bw+>*VI|8X|TAsX3D<}J)41UWGo5t3ubV5b|VeQY4vn*43P*A zJr^o;h(W~pVz>8#9l>{EH~ruG@#3^YzimEG;!F^n&r`5{+w!Mb8|URek({u(sc>KP zyQ@a=n|!4z#)A{cY+9WuR+tc zulwQ{m@MVQc)0pM%PuLYGK{Wz_tc7$VXA}O2gWy!0y`ms#Ng@b=d#Wzp$Pzu C`-xZp delta 563 zcmV-30?hsP0>K238Gi-<001BJ|6u?C00DDSM?wIu&K&6g000JJOGiWi{{a60|De66 zlK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1se<^6jGu>BLDya!AV3xR5;6( zlD%tFVHm}KZ|+MHqYf%|5p+-lm74fjL8pw}1eZX;7=nX37=IBLC6j}eY7~ofh#`wO zG+IIM4{&o3je|m+ZmX!!YFm19Khk?2hnj2J-nRCP=Y5{TInR6GFPe>EDfMTBbx`Wh zNV72<&S`*WxB5b2ll{nqkup_8;bTqKwQTd|FSq*xpY`ck3T96@aFwD4rUew z#?5KArZm&D9)DXlX>8Xgl{9d?fR^i%Qab_2W-rprBC0z=y;i02`h$wH-mzV;RhRI3 zz06UI`9hKOxhrZ_ft$H~a$wIkdXJwE7dy_DA39RN^Sp3*wMZSrqR4^V4eGTjJ9=yy ziblSxp{{t*ME=6e+ewlJ@njER?ETsF~>;h zs6+~s2llU-^UkQLtd@t>vRAxm0LO7d;`GTRncfo;NWg``ccGJeFHCjq>~4Vs-QT&Q zi7N4n%}Imb^KH(gcVW9e$%H}f_S+>r$QO#yJ-9zM5sE61whwWw7%lh7jJ3e0&p!D= zk^0lSR4m3O)tXg)^y=$BF@+d01#Ac4(B2+kl0Sbs!?4&|DklH{002ovPDHLkV1nTe B19kua diff --git a/mods/moreores/textures/moreores_gold_block.png b/mods/moreores/textures/moreores_gold_block.png index 84dec2855f442b1db4b95cac8341521b9bdbd657..2f54afd17dccbfb27354d121009b418f68792609 100644 GIT binary patch delta 125 zcmbQr)WQP{G7LZeEt!7;t5ItX}r(2jS c^I=@wuZ`THkEX=30nK9YboFyt=akR{03!A(AOHXW delta 261 zcmeBUoXRvoqMn0|fq_B(^Z!I3#g^pl?!xdN1Q+aGJ{c&&S>O>_%)r2R1cVuapoh8(}+=^DbS zvpA(1e2uFZj3+*d&s(X`W*?s~WX5n)49MQIE=kF3Undvy6NkssxDGuyeB*>(%0bab zCvr-fCme3*me0002D!Z6vpxY1(s%k zfS8z=MQn0GVGz?u+~gjBhu{&WCqM&_Fg3FTk_sGT%v6xpz<+3#w!8Nr8elE753n73 z&-Xhy=fdAF*KW&d`XE{FDlcgC1^_WZ+*~Mg-FQ{GfNQr!M{aUT!ODbGI+$)g2kF3J zvE0ylbX6%m^*H4e(t*QZ>`|*ICbI~D5`Yd@yuE+WyuYMq-JC!s^yrVA1GL@>_VQN2 zG+tr&e3iKJ9#1ln$6)LMP^-k-PG%7=LtiD1*y~p1u6}UL zjO=Wf<{iuU@CPJJF-!w8Ca4((uxTV(^UwnTWFggWF0(D801E&B07*qoM6N<$f?th1 AvH$=8 delta 337 zcmV-X0j~b80qg>hB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^RY0S6Hv2h_*R9smFU`AI}UR5;7sl08ntKoEsLFDbxAkwBtIO~VnO=Q!Mf zo(hft9VelHE)5hkQ6vY9O#HLE^4~6nl?CEhR!W#|X5agsw0|@3=gaGRczZmxh+Ry% zU~=~CZ3PG)PAq^Y_Aqq}fYt@a=ZlVB^qG@niOfQzDv+wcSh&AFw1WU=R)%G22;Uph z%#db=$ek**vBwtrG{nK&sXxwIz%io~C6#Ac`9R z#`^-PtxJ^Jl1k=g;}%AnhAVNJw|$(n{q&`xtOwS3cXi-C>2=ni^mlSu!_95(4c@`! j#n=MQyh>d+|C9OxQ!{|)ahDH200000NkvXXu0mjfQKXeO diff --git a/mods/moreores/textures/moreores_mineral_copper.png b/mods/moreores/textures/moreores_mineral_copper.png index 43cdb115efd6910670df65bccc00b038ff7d125c..bc3d9c16cb6234d092741ea7ce312603e1b63c40 100644 GIT binary patch delta 137 zcmZo-n#njpqMn7Bfq~)e-A6${ia)?7#1%--E_7O2>9(~!XnR+<;Dg63Kq1DGAirP+ zhi5m^fE)`?7sn8enaK$b49+Z*BN@E3H*hqiut;oR*r4R>=%}dbDsbA9(>E%hp;0nz l%LJh=K@Bz|ZlxOx=YBKYEC1$D4>W_p)78&qofA_+695~5DgXcg delta 242 zcmbQq*u*qJqMn0|fq_B(^Z!I3#g^pl?!xdN1Q+aGJ{c&&S>O>_%)r1c48n{Iv*t(u z1=&kHeO=k_GKvZ_2~V&VwFC- z`?{f#fq_BJd#?ZgpZv^b1A?|I|7v@9c(QqTdQNoB-}|dU$?^xowhaefv6dV-+9(xr zzwS?CwdmpXw|5`wY?Bpi8G^CbdghrHO-2;Kvt2?ov+4?nowZ-1pX ktxH%)dF9K7S1Uys7Knux1b&|abQ%MLr>mdKI;Vst0CAFHF#rGn diff --git a/mods/moreores/textures/moreores_mineral_gold.png b/mods/moreores/textures/moreores_mineral_gold.png index e110b437d9f207d17e9e332d0fc3e60efc5a0edb..c8aede3dc5824e942d25761ebbc986ba28607947 100644 GIT binary patch delta 137 zcmcb|IFoULL_G^L0|Ud`yN`l^6n}tEh%1nOw~yib{f0lM82&zO__CS*FHnfFB*-tA z!Qt7BG$6;q)5S4_V`g%K1A{BeWKRY!=?xrBDJ&8j7&a)mIyxpMI}4n?Dd8Ix(9p=4 mwq=81m!Jll5vS4(hO?)b?uFMl?FX8{;OXk;vd)Pqp$P!D5H2bJ delta 206 zcmbQqc#m;{L_G%^0|SHn=l_X7iY>|8-G$*l2rk&Wd@@jkv%n*=n1O*?7=#%aX3dcR z3bL1Y`ns~;WfT==60MBbzylP@_H=O!u{fQau)yp`-TsIFch~a#XK!D4|GoL2|HWJj zKfVv{aE#z>zUfr@{IZRX#6;Eo_wx^|n%K|oKK1`g?iR5krx)oCd@JmiOFWpdukNrY zH&Ew;5>911=fuP&8MgWR9(=G4-Rn4g!=hOW8Mbn!8cdoOXa%&F!PC{xWt~$(697hj BPb2^U diff --git a/mods/moreores/textures/moreores_mineral_mithril.png b/mods/moreores/textures/moreores_mineral_mithril.png index dcc3822b9a455690bfcdde81bb3755cf3c3c8b41..126daeae8427fc578ecefd538f65fcf551b92f5b 100644 GIT binary patch delta 125 zcmaFI*vB|QqKt`|fq@}uuJ|V)#Tnoe;tHf0v|AW-J0G)ezXW76mIV0)GdMiEkp|=# zd%8G=a6~63Ff=n5Xfhq?@nz&$!^cx_;KhLhQnO538xuu+T&_4Wcx*~@6m=9ecIshZ Yxb4WAwOso`KTtb^r>mdKI;Vst0C^fDvH$=8 delta 222 zcmeBUe8)IJqMn0|fq_B(^Z!I3#aJBV?!>U}oXkrghb_t5-G$*l2rk&Wd@@jkv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns~;VPa!5kY29)^C?g$&(p;*#Nu>v!UC%cc|XrDxcg~- zUYn87l@mu!9Vpl-v&e7zXZyqZ?+ff)ZQ2vQf=%Hz!&I3T2JeW3?@U$+Nv=n#njpqMn7Bfq~)e-A6${ia)?7#1%-d+rNFs@%@L+pFDN-e9b@69Y7(*k|4ie z28U-i(tsQbPZ!4!j+w~`4h+sLlOq|tv^Q`xrLahBVA!DK?C7Yd>MC&BlhZdUprKJR mZOa6qEO>_%)r1c48n{Iv*t(u z1=&kHeO=k_GKvZ_32+*@Gy{buc)B=-Se#BySYT#R^6$z2(%;+vFQ2_or^Tf1_s8CY z=Pt~d*x1d;YqvNkk>#CV@Z%-FoVOh8)-m} zv8Rh;2uE~s0z)%{fhNU}oXkrghb_t5-G$*l2rk&Wd@@jkv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns~;=HV3L<#OX;=>iJXdAc};Se#BySYURe{QHIfwdMSO zm(O0<(_&JzVS{nR$=Sw61_lN))fJ!q_ov(2OG*I2oGEW50(l&^F{)YqVA!_dz$@00 z0|yWF9dhSm=h-h;T_JQ-A%fu&k3mwgU6sz8-PJGb*Ud;gBA#&L(1YXi=U?ef>k<}H gUiq@&)k;x@s&B4_AIp?>0iD9&>FVdQ&MBb@0Nh?z!vFvP diff --git a/mods/moreores/textures/moreores_mithril_block.png b/mods/moreores/textures/moreores_mithril_block.png index 295af91d87f5edd2e29949162578a7d3e618810a..1b3398f64463017599aeecdeb7a1f29ab645516a 100644 GIT binary patch delta 356 zcmV-q0h|8j1oQ%s8Gi!+001a04^sdD0CiAIR7D~pVDtRj_dNDDMGBS@cGLbVgk~B1vG&GepHI_9s zm^L<Iifi^q&hmKIy$F2JE}Z9tA9K^tvx-iQ6n2y0002G zNkl7 zCy25jKaTChjHjo&t5}S}uB4LceNXk#=g;4Beg!}z?ls0$t$)W_6LVuW0Q`T|H17Z? zkz8GU%XzDMGLBC%Ubtjlr}M5lyU$7V7L3lIqyq3>~_BagmC6wnH2zY3m}A3 zvmvF;c6$S$)}%46-0OP%)xGBY62jR;2$<@ENC277ujljYocCrUr?erGDY0qZ=e!r0 z)%sWUWFjFFcYp8uJE9Q6l2sSu_-s}Hn2kh4Br#s}{jJD+Dg%JIQSE9?T1wxxABYHG zA_?J?h=$>@>plUf^#~Yq)3)njcwiQ7niI3pY*g(^c_9iDM&I9xM6(jYDPR*ek!mS} z$gI}mFg&#F+TDo=ScFhhdYr;bIRLD>$oZ84q;&6|V}HCzX;aDzz<`;JZM*LKJAg~+ zMP{mD`2X(|Dfbie);&|ZQS?2)3oR$O;k1mlG5ZQ=d$-I335|exQL%MIS}W-dSWsC9 z%%m4khB-}l+y+uA)5Qmd8(zhVaDRHXmwNKQtSb5glqnWF5dZ)H07*qoM6N<$f;k&! A4gdfE delta 330 zcmeBXy2Ug>vYw5BfkFQB|3o0gmgMd3!tfsi7wla=87RV8;1OBOz`!jG!i)^F=12eq z*-JcqUD@w4vJ1+y_eefd0t!9%ba4!^IQ?{@A=e=X0oVIdfh-44ozsZmxOedJja$zd z?j5+M%~8dr%X0IO7e@rkM3%r9LC;4~8Ap!PtFT{)KXFNBzc>hUAQh}m%Omvo%dY^Hv6-$zgA;g_RmS>mq<$EPD7yN_20Ap apI~0;)5vI1vi&a5(+r-jelF{r5}E)r3WY%c diff --git a/mods/moreores/textures/moreores_mithril_lump.png b/mods/moreores/textures/moreores_mithril_lump.png index 9b527b4312c52fcbbe255cd247092113f7ed90a1..3aa7255ae3520bb5f03dea9db12785ecab193289 100644 GIT binary patch delta 204 zcmV;-05kvX0^I?S8Gi!+001a04^sdD069=hR7C&)03RP+ARu8QBWf)zhc7RUF)@}l zHljE>?$L`1<%Ov6-E##vd&U|`CPQRH&~0004WQchC9X|LXRxf=km%SHXz&&{sZ>guJcYMP;l zaGz1^l;X$;2ebH2!Y|~^evp^o5MdZki6|mY2Z-H6fK6U_lLCC%-VGuE0000Fju+Ddk-$Y z#3^7peTsSBLn+H_b}jy7FqxDQpeXui?EtXWP?k61tifKawMK{xhzVP*UYO7C4m7>4 z3AEODzrnc%YnM3J;#^CfUojp(#P3{roL*Im5Ij;AyKa$i?|+6J7%25l2p@?oWr6n_ z075WWyQHq4PgWaPTLF+|141wSLTBQO3l~z`&3+SNs!@;tcQ!aow_g+r>+l?%cimTwvO6prC`Ni(?3fEbl=_ z-Ub5^)`PXaJHweuH`zNf$OyCupIfoSxQ6>uQ$D{{Q;!0hvw)mRYc=cIfav)$J>9}w cnGfUYer@CqeKaMO4QLjFr>mdKI;Vst0GHJ(VE_OC delta 254 zcmeBU>|>fBQP07~z`!8?`F|piVoUONcVYMsf(!O8p9~b?EbxddW?X?_wfUrh zg6t)pzOL+dnM6bwWbRn2nk zt(W|>#XlyAs+>uYnDlV#I{Oz9i&q``{ku@Ke7QhkrQNrf4#sR(%_B@YN7z5CQ@FoE zQ|QsMQ%;TB=c+mS{*u)E)}YUs_25pzp3Cb6npedM--vGc5h7ak{OzX$v(%2b?mHUx z@J7*{W0n)YGTJ^qbv~!BJT9JV;|kejmG6F?t8Z@zZThZy$_D6822WQ%mvv4FO#n&W BYa9Ro diff --git a/mods/moreores/textures/moreores_silver_ingot.png b/mods/moreores/textures/moreores_silver_ingot.png index d07fdaad8dedbc339a6189a5d6572fcb7905d371..1357a71480f33e07d6c5c8b43940a43d9a2f09ce 100644 GIT binary patch delta 164 zcmcb|w3Ts!WIY2ASj||l7f3Oc1o;IsFqBO`YXRitdAc};NQ5URD9Ev}E-aM4-^uOt zXkX>`R~LJ`1411g&E@v|`0y>V{Ov;pgYQ3XYM0CHee=$)rsA;40*?#5x88jYKX~Wp z`b#k|oL^^`;v0Pa P8puJOu6{1-oD!M<5cNZW delta 334 zcmV-U0kQtI0p0?T8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh2N549w|B1pw6ox;63DM|L zbI1kK0|m0=23dTPEWJnx1h0t#g*ZzIXfei{n%LL^gF2L|)PHq+fc78Xd*AnX68!y~ zv&`$$$v^6gF|ckL0J^RNU^9X|LXRxf=km%SHXz&&{sZ>guJcYMP;l zaGz1^l;X$;2ebH2!Y|~^evp^o5MdZki6|mY2Z-H6fK6U_lLCC%-VGuE0000?j1-fL*QaUt49wAF#p^&MN*D=9l5U7@MB-x5O$<%FK(|@u3m*aHz|M#Oi`144n z3a`gw$g&KrHMh%U@+*Ot!yy0&A!yqc0Ambyt5q^95Xnj@(ljN6Fx1M^iHFT*#JTy- zfl>e1 zM_t#HWjQU-G))Zvd7k5(8{VCB7-QxgM8xJ8<0h)A!h8So79O|T;gh74BPZT_p7;A? m_73jX>kzF+BJhR$Pw)SLTBQO3l~z`&3+SNs!@;tcQ!ah<%m&zo#9NSo9rDKWCU7-&#hQuT*G~-DWBh}sYij$SwK#uwVHKpK=gc>o^D~T c%!hGxzczA*KAIBC1~iMo)78&qol`;+0D*riDF6Tf delta 253 zcmeBU>}8rDQP07~z`!8?`F|piVoUONcVYMsf(!O8p9~b?EbxddW?X?_wfUrh zg6t)pzOL+dnM6dG#Y^N~2Lgp=dAc};Se#xOWGHmlfMfBT{|h=BPyYY!a{bI)qmonX z5w}-bW)(Q;`6MVua@fy1{b`}}#WOwkZii)+y<7Dq>iS->28--hs~B|-$XA3L$fb0# z%vi<4wd%1Cr_oFIB{l3dUK1MKn}43#!!%*$T;U(#EEXY0uhvet`LK*r;8pxP(QPvy z+sSwC;g5;DUhzD8->2WZvR>rQyu8_9^M&86d<#SUE@r(r2XrQbr>mdKI;Vst0E1#^ A;s5{u diff --git a/mods/moreores/textures/moreores_tin_ingot.png b/mods/moreores/textures/moreores_tin_ingot.png index b56279f35379c81618ccd04d4dbf683e5fbe5f2d..4481928de03e18754442ac979465f2565002eefc 100644 GIT binary patch delta 242 zcmV=+G%(=^WeloFA4yvssh0CJe~#v(JELfWsYh3r{=ouO_8XB_2DMbL2KTV zgqP7sIQ6Z+V3X*eHM1z901+bzt%Tky{5daZa rip#|czLKO7Y|S_f>?*xR3k*XQPFI90+~`00000NkvXXu0mjfADogN diff --git a/mods/moreores/textures/moreores_tin_lump.png b/mods/moreores/textures/moreores_tin_lump.png index 0d815aa5e89a98adc224c836f498332164c9f2d2..5114985ab72106f2bb9940be15238f384690dec5 100644 GIT binary patch delta 208 zcmV;>05AXP0^tFW8Gi!+001a04^sdD06b7kR7C&)08n3FQ(|ITX=!bMfN_L`c#DgG zlaq#*mx!5}i=3Q}pP!GQppl}YlcS@YtE-}~uc)=Pthu?dyu4S#`FsEX00DGTPE!Ct z=GbNc002`-L_t&-)18db4uBvC01;6lQ?dU4Uz07Ty?W#2Zb<;ZF88B9S8cVH)vuCs z4l^VX?lX#>k_;K)U>4g6_=OnR4&o9FB6Q;^5qZSv0KU6(u*nOB#sZG|C(ru;0000< KMNUMnLSTYq8(B&K delta 345 zcmV-f0jB=p0qFve8Gi-<001BJ|6u?C00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-sh2N53{?;nc$0002?NklBrpW!C+tDcbmBGVmr;#x|wH09I#$UT=O_p{lF=4$8! zZ@V4F7}~DmT}qTvD5WThg1g1SANOYc^s26L&LM;#T;mwB7j|OsvfW}2hqxC)V66o} zTZ@#EaHge9iaF*<16PV@6pvJJ&Q=oy7 Y!RRn^v*_lVyg*$Hp00i_>zopr0MUIT^#A|> delta 208 zcmeBUe84zCqMn0|fq_B(^Z!I3#aJBV?!>U}oXkrghb_t5-G$*l2rk&Wd@@jkv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns~;=HV1#)jxVM>L^es!PCVt#Nu>vg2a~xp35)Q*L?D6 zG5P=NgT#8po)(kC46_?_ntguSx-H^ONbpQZ*b#oRE6Lc*`9qcC%D?81zq;>#_@{gN zyNPlg8@FlwpF73ke|~S;5C3gxn-=AV7~7f#b1`h*X}*5-J=6U_%NRUe{an^LB{Ts5 DB#cmW diff --git a/mods/moreores/textures/moreores_tool_bronzepick.png b/mods/moreores/textures/moreores_tool_bronzepick.png index 71aa983c71f2dae5c8fa5bd382d0a403cda07b36..e9d3ca727e2d2f3e0cabb947399438a3a95bd46c 100644 GIT binary patch delta 144 zcmbQow19DfL_G^L0|Ud`yN`l^6n}tEh%1nGQsRuYRe9Me^nQ{?;a1^#pb%q8kY6x^ z!?PP{K#skqi(?3fEbBo>UIs%Bh7E0!2bh*8aB@5_{6A|Q>w#*9zhW0QH^?2h&K(jj tP{}63JJCesoKR=6W`Qdcmja{xbxzi{RQ|waK%+PrJYD@<);T3K0RRMnD<=Q| delta 271 zcmZ3$IFD(9L_G%^0|SHn=l_X7im^Dz-HBn{IhmJ04qKA9y9>jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w&BH0guGjE@<04RKo~Mgrh{fsTgarZyha}#sXZ~@Y zCU9o=L61p{1|K$szOZKo0_pV%+uh&iG~)j9W%n2gE|yedGiJFd>T@JZ zP3p+4Re#EZ9{usxNK3evpmaU$%K?>BX)!OGQ_hOq>|xZnbmqVTpf@?gmq=_~Bn)&a O1Ba)ppUXO@geCyl6K0P9 diff --git a/mods/moreores/textures/moreores_tool_bronzeshovel.png b/mods/moreores/textures/moreores_tool_bronzeshovel.png index 8e71203fd41794b0813dc9af1a75a9adb07a0323..cdc738424f75ac9d897f2062dcc3c3cef5df2f2b 100644 GIT binary patch delta 131 zcmey%IE8V7L=6iw0|Ud`yN`l^lu&?Ah%1nGQsRuYRaxN2@S>jM{bcQDD|f5}iZYf2 z`2{mLJiCzwC9%B=jb@M9gAp_1vqllOoMV_e>7&x3KiaHr{I+$u3 fP0&5SAk4r}yO%{+uA$l#sF%Uh)z4*}Q$iB}BiSZN delta 237 zcmbQj_?K~lL_G%^0|SHn=l_X7im^Dz-HBn{IhmJ04qKA9y9>jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w&BH0gY49XR!UiZ*>*?YcVsSb-VS#{w(CUIl`NQ=R z)``MS^2!@$+45LQ+;E*DS+{TJ=>tHJrf~5`^Tb9V=#)8oqG17}!E>eTH1R;SdkqoM zQ~#fs1yamXyk1DQjA!FEt^aeUSo}9OFfiCNf6d?dOEjFW`4~xDwMj7ni3Kc~+1SX) Y5XWV{z~4tM2j~(8Pgg&ebxsLQ0J^kPZU6uP diff --git a/mods/moreores/textures/moreores_tool_bronzesword.png b/mods/moreores/textures/moreores_tool_bronzesword.png index 366b648aaf9792f946613bbbca739d546a7533fe..aa6adc3cbc918a517f1c737b40b9acaa0a5d0616 100644 GIT binary patch delta 156 zcmbQlw1#nlL_G^L0|Ud`yN`l^lw5#Mh%1oR6k&Bz;*7ObiC1AL@YA@I&+ww2hTH8O0}BuF!CLPsK!C91CJO) z6EYiDPH0$_z>(E>Va+Ki0YOD(v5s3VD@t|vGQKg3GECmjz4KN~{%4>;44$rjF6*2U FngC||GROb` delta 258 zcmZ3(IEiV3L_G%^0|SHn=l_X7im^Dz-HBn{IhmJ04qKA9y9>jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w&BH0gq4Tn=)Cedv$v!U6$1}gB@g6Sb7{N%h zuO(gN}|GG_Pm9r!zBqX^0nEbQWEIbtJH0@bLwCE+?iz11w*~i3I zurR+5vO8SwD|qey5;dcWpm%pq9VqyFHs6h{ikabvRpp)9K=x}u=P`J?`njxgN@xNA Dl$mCl diff --git a/mods/moreores/textures/moreores_tool_goldaxe.png b/mods/moreores/textures/moreores_tool_goldaxe.png index 41d4896e6e4da5c98be18387aca3572e00dd0d86..0290f3f68b865ece1a1b302e51c5c65c62107588 100644 GIT binary patch delta 125 zcmaFJ*vB|QqKt)^fq~)e-A6${N+`f5#1%+8DRIWys%)9a@^rV*#|xfkIVLv(MHx$i z{DK)Ap4~_Ta>(7B@_Sv delta 209 zcmeBUe8@OKqMn0|fq_B(^Z!I3#aJBV?!>U}oXkrghb_t5-G$*l2rk&Wd@@jkv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns~;=HcWJ6ty{2)B+Sr^mK6yu{fQaAo1nFW7hNke>|DV zk@@e_FO@iF3C_$mM!CRZwz}rGJucD*4tO0n@S$Y8K-bwDJO^L1W?nDvdA`23=`+9l z9p5U2W4BiQDGz$|XMd{F>H1BklSOM6&w9CXW)K6zQC^Gs^<9TP18rmQboFyt=akR{ E097neT>t<8 diff --git a/mods/moreores/textures/moreores_tool_goldpick.png b/mods/moreores/textures/moreores_tool_goldpick.png index 1a65e8e2561b5200be5ae5134ba0be1fbfaa2ab9..129e449ab5ca337229bda36ade512fed2028c040 100644 GIT binary patch delta 155 zcmZ3+w3=~(L_G^L0|Ud`yN`l^lxToYh%1nGQsRuYRe63u{^ddC&zAx|UkcK=l{p6} z!B`UH7tG-B>_!@pjA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w&BMtdX#R4MaRN|inWu|mh{fsTgarZyha~3fv;K9T z_TXytagRxi1|L2x_*BmZ1bU9Oi+B!e)_?rdU~|XS#_5;^uhI*jkY*mqimzq{lTsYk ztUU!%*tYK3{RrMfCA9_f>}t8v>nqFUT>CmFy!D@NmwKc8z4hWHhn<&5aQ`^(&~th2 z6pR1K+`>-^5|vVnPik^cKl@@`LuGSk%Ay| Vf$iF}B7kmY@O1TaS?83{1OOL|XO;i} diff --git a/mods/moreores/textures/moreores_tool_goldshovel.png b/mods/moreores/textures/moreores_tool_goldshovel.png index fc72a1e24a411968a1e587ef12c1e29efaec1d47..1d07af8897e1479b77ce05d3ce3e20f4a1f6f165 100644 GIT binary patch delta 131 zcmZo*n!-3iqK1W;fq~)e-A6${N+`f5#1%+8DRIWys?4fpc)DBY%hj;y7v2N{MHx$i z{DK)Ap4~_Tatu6O978ywlM@^mkFg2Nx_OoLkO60-QAA9PBG1$b3>?lAMV*W}9Za>2 fCg>hu5N2Sg-OC~@*HCQ=)XU)M>gTe~DWM4f8XqQI delta 240 zcmbQj*uXSFqMn0|fq_B(^Z!I3#aJBV?!>U}oXkrghb_t5-G$*l2rk&Wd@@jkv%n*= zn1O-s2naJy)#j513bL1Y`ns~;=HcWJ(zSm(^CnQJ!PCVt#Nu>v!U6#Uq16Rpribe# ztk+Jhs4Y0_U(Wsaf05~%|CjGN{h$9%tSM9am`hJuKD#1You+tO|M_ndp0lP%OG-#c z{8$MD*1E2EH$5buw+-ruBdB6pR1H1_lN-JEgwOUvj|tnvaphRhtwO hkXXQynT?H%4DWy270On|Y62a@;OXk;vd$@?2>`GDSfKy_ diff --git a/mods/moreores/textures/moreores_tool_goldsword.png b/mods/moreores/textures/moreores_tool_goldsword.png index db26f474a8afa0c2251ed19e9c2e300ae611de80..e94ec054344551c1cc6c8e31e1198e8118357771 100644 GIT binary patch delta 156 zcmbQtw1#nlL_G^L0|Ud`yN`l^lw5#Mh%1oR6k&Bz;*7ObiSuA6@Y6WCnDgmw;V)Oi ze%&ijy7I^osDiO1$S;_|;n|HeAjihj#W93qW^#f9s~(@gtW>Kh4vZ7RnFXJ1tD8uCa+&gc@jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w&BMtd%-1sU<}0AkWKS2z5R22v2@3=aCaqFD*Zk1F zXKx03=dZ^$694}13jgr`W!}U82F)`(F51+jM=>6Ly}R4 zDf9f`hySOqZul=^86Dj6_5bwMiBB@q5)u+LK3x9se#sHea?Z$E$+@8(<}Sf4qU$81 z7YOm}ncQvpKf7zgKXucI8xKeXPp?bg@vrU68COFFh8=mW{r5Mw`2yX?;OXk;vd$@? F2>>_xZ1(^F diff --git a/mods/moreores/textures/moreores_tool_mithrilaxe.png b/mods/moreores/textures/moreores_tool_mithrilaxe.png index 68ba36e734704f8af08a7186ac39dc0353ab3702..f243a2909c82cc6138f3239e7093af29db5caade 100644 GIT binary patch delta 9 Qcmcc2*uywMWny*)01>AHdH?_b delta 78 zcmeBSyv#U3#f7mr$lZxy-8q?;3=9lxN#5=*4F5rJ!QSPQfg+p*9+AZi417mGm~pB$ bpEOXAy~NYkmHiGA8=I8Wen-~miHg|(ta}y@ diff --git a/mods/moreores/textures/moreores_tool_mithrilhoe.png b/mods/moreores/textures/moreores_tool_mithrilhoe.png index 6977042591452d556f1d3aab48bfaf28de2909dd..9d226f7dc16459ed3bc2cf8bf72fbebc5fdd52df 100644 GIT binary patch delta 187 zcmcb}beeI3L_G^L0|Ud`yN`l^lvaRGh%1oZuwlc=lP6!leyuFZsik#LPw%3E!9_zU z4ksl}SJ!KPri!t)Dw%G&B?p%&0ade<1o;I6X@<>{(`ErFA5Ry@5RT~NgoftO)d^=l zgmN!9vtf;`!L@sw0%Gp&%q@kNJQ;mH`y_<4aTu5wXgIP+NVF_q;_+bIboFyt=akR{0I9V*6951J delta 322 zcmV-I0logq0nq}G7=H)`0000V^Z#K0000JJOGiWi{{a60|De66lK=n!32;bRa{vGi z!~g&e!~vBn4jTXf00(qQO+^RY2@nYe5B5nBCjbBd-bqA3R5;6}QauX7Fc^KQtu!Fm zr3f9XQx@p~L@0Ff44%#lbT0_vlu2;tq;9oH7qe&2)dJ6dKR3C1?UwmksAXykxi7Z|!dthR?2jrGYO&*x;npOU7z z;&QnI00xvI4yn*;&_)!vFQVP~MzpuQoJ~X=QZe?a;GBbV4y_TSxF`y&Pc=DKH7Uyy z08mwxezJP6wmY!CC99llVVtbCkYm`o$zNMUfh*MK>Oz{PX0eE;j%G delta 264 zcmZ3=IGt&NL_G%^0|SHn=l_X7im^Dz-HBn{IhmJ04qKA9y9>jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w!^FlW&3-f{;xJHXx~Gd{h{fsTgarZyha%g8|1CZ- z=X|2dSq6yv`R(|Je7RQ~$qjxBRL^8{uovha3n4gGokz<~oBe$)zu zInU_eT(R7LzLLd$`-LYA1vmYDd3ia{?{~H7DLaB%O^?m!xWvP3;5;Gbpv#uDB*!&t zPt~idp8L;|%=U^`ZBworx6h-TV^i%suK7$n`=UYVEDsM4L&i^Exy3V1T?4w2!PC{x KWt~$3V-o;eR%h@4 diff --git a/mods/moreores/textures/moreores_tool_mithrilshovel.png b/mods/moreores/textures/moreores_tool_mithrilshovel.png index 66916da213db2eda64e5e9ee8720d48df47aef5f..18a7de09b6f1df2b3758a3aa42386fbd028d7472 100644 GIT binary patch delta 131 zcmeywIE8V7L=6iw0|Ud`yN`l^lu&?Ah%1n0kPc?hZe%c==A^_KYpb&8)3yshLB^6G zzhDN3XE)M-90N}m#}JO_9pC(!L;3A eg6;tZVFm_|XDmmAwV$YfjQ4c)b6Mw<&;$Tbr6kb+ delta 226 zcmbQj_=$0XL_G%^0|SHn=l_X7im^Dz-HBn{IhmJ04qKA9y9>jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w!^FlWBR+lAy#%08k*AAeh{fsTgarZyLTiJpe%R0X zTcWF+$>zcSKV9HLazcV|YQm4NQc7i8=S5F!1cFYTvmOl_7!95)Wv2lr*<{an^LB{Ts5;xkXB diff --git a/mods/moreores/textures/moreores_tool_mithrilsword.png b/mods/moreores/textures/moreores_tool_mithrilsword.png index b9396d95fc637410339dc7c8f70fb75a5868a8f6..09a030caa41029a36833205f52fd83af510e4b33 100644 GIT binary patch delta 156 zcmZ3%w1#nlL_G^L0|Ud`yN`l^lw5#Mh%1n05HMs=&1cYVWH6k@U_3`tgw;ujGuBq6 zz)vI0G)fGpfUzXVFPOpM*^M+H$HvpeF@z&JIl+OoiAi9Vp~NWx(>4Q%X5Nil23!uT z60(U}K?}4bmRUPxoa++m@Tg)|c3CUs(!_Ykl}VK0wjjH*>4S{-AbUMs{an^LB{Ts5 DvkWM# delta 281 zcmZ3(xPobdL_G%^0|SHn=l_X7im^Dz-HBn{IhmJ04qKA9y9>jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w!^FlW%RD99ItD1T!qdeu#Nu>v!U6$CUa diff --git a/mods/moreores/textures/moreores_tool_silveraxe.png b/mods/moreores/textures/moreores_tool_silveraxe.png index e49fc75e66afd84f9be948911daa364477515b5d..d33edd596298a2695946f099d4103545253553af 100644 GIT binary patch delta 125 zcmcb`*vB|QqKt)^fq~)e-A6${N+`f5#1%+8DRIWys!UorZ^!ZdXK!4ZV9F#56lE+4 z@(X5gcy=QV$kFn2aSY*zPEI($#k9a=we}RjM@*tgg^ipuEu1C0*aT*IGN>^u^%Q7e ZWH36++$_5JCNEGIgQu&X%Q~loCIDj}C6NFC delta 202 zcmeBUyu~;{qMn0|fq_B(^Z!I3#aJBV?!>U}oXkrghb_t5-G$*l2rk&Wd@@jkv%n*= zn1O*?7=#%aX3dcR3bL1Y`ns~;=HV1#<>}%WVsSb-LE_7UH@)8fKb|xe zy!7YS-{?JU211v3m=`r2;yET&)#I|8A=cSYZ~B9;P3=pSAFp-){_xLY@$(bpIyP?8 x`agGy#ee@O%lGy-XPxZY7kKu|6(3CohNClWZWz3IG8T zn3n51M6UiGb|7LZrvO`a21ComXG<8CSqe!^Rb=8Z=J66>WMflY!N5G3(WRkLaD|n~ j8b1al2Bw7u+KEgIM=$YK_f0=_5M;imtDnm{r-UW|)Jj0# delta 322 zcmV-I0logp0nq}G7=H)`0000V^Z#K0000JJOGiWi{{a60|De66lK=n!32;bRa{vGi z!~g&e!~vBn4jTXf00(qQO+^RY2@nYf3+O-Oe*gdg-bqA3R5;6}QauiWFc^JB2bu^5 zg~T|bY%a1I7Y1+P;?=wWCvY(iUFrqY4Kabl7zfC5~1z83fsL>}_% zRg?+WaY!Qri5=&nXWQ`leJ!&}V#m4YS{49c;JR2XLUhd**4x9I#;7uwg&~;)0lD4p zxa2tiphGDlp9-x8WlV?Wn`nQ25bZ55=VKB1RE#_-7-L|JL2CplPLc$hQ$dbdLDDn@ z0AyLFpRC@iEjx_5WR;UG8YinQ9Xu&fmH^<;IeWKvBk$ zAirP+hi5m^KuSDa978x{Sr0n$GAQyeY)F%s(K?rD5-U5$4fg+G>sSv|GkoV=aGv28 z!#=qMRm~?#9WDxZIw$f@jF`<7t+IeY=mWE$85^$y|HUnTfyOa-y85}Sb4q9e00AH~ AH2?qr delta 275 zcmZ3+xQJjA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w&BH0gXrYuR1u|`sr;B5V#p&dP1p)?#B%bHT{_WRE zT(Rt|$0SCB4gb$<{LcdfOf`R8B-?`PlkUGE&%r0W7=CsYe_Scle`+MK__$|8@k=)ZMan`_ahT@5J z2})tc7Zt9BJ>5T9=y|=9A@gT8;hkoS+0_Eg9(&2FWG_3B#^W$Cjg5_s;fzLv<*S0p S`+0!wW$<+Mb6Mw<&;$TN>SgT! diff --git a/mods/moreores/textures/moreores_tool_silvershovel.png b/mods/moreores/textures/moreores_tool_silvershovel.png index 614c0a9db101c6a25ea4139940d4f75923f8a973..d55185b2697b29f9f76c46a7444eb98047e8c4cc 100644 GIT binary patch delta 131 zcmeyzIE8V7L=6iw0|Ud`yN`l^lu&?Ah%1nGQsRuYRjHlPwd45yOSi8-E_@;Z6lE+4 z@(X5gcy=QV$T9GAaSY*zPEK%OJjNz4>*iI~Lk66UMiDVFiab*%FmO0e6m>G@bTHL6 fnxK1tL70J|b}x&tTtl@fP%ne0tDnm{r-UW|$8snE delta 238 zcmbQj_>XadL_G%^0|SHn=l_X7im^Dz-HBn{IhmJ04qKA9y9>jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w&BH0gr1V8`!+xMpou`Xqh{fsTgarZyLaR5Fxm~Z9 z*loGEXQB#oR(i?b?bpmxCkRbUsQC7bl{uZ6nYp=rsj@PVW)`-b<@xPU-{ar^l|L_a zQIYr(V%k~kxMuCC`Wb2^XI&a2qNo1%^P2NtQbIyP@9w^T^OtBiUGp)LxN4JPVr*bw g5U^xsVs2ENsQ!6H1O9yrgb2P zK{O$+ZRLc9RS6tfZ5P&PNeKulvZr<2a_L}UZs}$bW$?Vnb!VEn=yRY!44$rjF6*2U FngGvcG$a53 delta 284 zcmZ3(xSDB#L_G%^0|SHn=l_X7im^Dz-HBn{IhmJ04qKA9y9>jA5L~c#`DCC7XMsm# zF#`kN5fEmas?8@26l5>)^mS#w&BH0g%)jF4-EN@JYEKu(5R22v2@3=aCaqG`F@I^_ zvp4ILjoT#C`*kJ%|Mxxq{r@mel9Fq2c4ocq;k(QEJ-(}NI(uRpzth>oot_1*N3zl! z#aEovPEANiaNyifd0I?ZK6RGTn*aKD_xa76FDW4*!S%=FpS5P;zx^e@t$xl*&JFD_ zYhgY5GF;Bc!`s_f$F8P*Vq;_D!qlMe^@|o~U%Y1e-_$kY|KwRG9(Y!s?#t!5e*aHe e$^vr+QHE!|QxuNAbGZX_ID@CFpUXO@geCxkCUbTG diff --git a/mods/moretrees/depends.txt b/mods/moretrees/depends.txt index 7cab320..a04095c 100644 --- a/mods/moretrees/depends.txt +++ b/mods/moretrees/depends.txt @@ -1,7 +1,5 @@ default - plants_lib - -skylands moreblocks? +skylands \ No newline at end of file diff --git a/mods/moretrees/init.lua b/mods/moretrees/init.lua index 17a2a2c..b9aa270 100644 --- a/mods/moretrees/init.lua +++ b/mods/moretrees/init.lua @@ -60,17 +60,6 @@ else moretrees.expect_infinite_stacks = true end --- node clone, for redefining stuff - -function moretrees:clone_node(name) - node2={} - node=minetest.registered_nodes[name] - for k,v in pairs(node) do - node2[k]=v - end - return node2 -end - -- tables, load other files moretrees.cutting_tools = { @@ -171,7 +160,9 @@ end if moretrees.enable_fir then plantslib:register_generate_plant(moretrees.fir_biome, moretrees.spawn_fir_object) - plantslib:register_generate_plant(moretrees.fir_biome_snow, moretrees.spawn_fir_snow_object) + if minetest.get_modpath("snow") then + plantslib:register_generate_plant(moretrees.fir_biome_snow, moretrees.spawn_fir_snow_object) + end end -- Code to spawn a birch tree diff --git a/mods/moretrees/leafdecay.lua b/mods/moretrees/leafdecay.lua index cf6743f..9d771d7 100644 --- a/mods/moretrees/leafdecay.lua +++ b/mods/moretrees/leafdecay.lua @@ -19,14 +19,13 @@ end if moretrees.enable_leafdecay then for i in ipairs(moretrees.treelist) do local treename = moretrees.treelist[i][1] - if treename ~= "jungletree" and treename ~= "fir" then + if treename ~= "jungletree" and treename ~= "fir" and treename ~= "palm" then minetest.register_abm({ nodenames = "moretrees:"..treename.."_leaves", interval = moretrees.leafdecay_delay, chance = moretrees.leafdecay_chance, action = function(pos, node, active_object_count, active_object_count_wider) - if minetest.find_node_near(pos, moretrees.leafdecay_radius, "moretrees:"..treename.."_trunk") then return end - if minetest.find_node_near(pos, moretrees.leafdecay_radius, "ignore") then return end + if minetest.find_node_near(pos, moretrees.leafdecay_radius, { "ignore", "moretrees:"..treename.."_trunk" }) then return end process_drops(pos, node.name) minetest.remove_node(pos) nodeupdate(pos) @@ -40,8 +39,7 @@ if moretrees.enable_leafdecay then interval = moretrees.leafdecay_delay, chance = moretrees.leafdecay_chance, action = function(pos, node, active_object_count, active_object_count_wider) - if minetest.find_node_near(pos, moretrees.leafdecay_radius, {"default:jungletree", "moretrees:jungletree_trunk"}) then return end - if minetest.find_node_near(pos, moretrees.leafdecay_radius, "ignore") then return end + if minetest.find_node_near(pos, moretrees.leafdecay_radius, {"ignore", "default:jungletree", "moretrees:jungletree_trunk"}) then return end process_drops(pos, node.name) minetest.remove_node(pos) nodeupdate(pos) @@ -53,11 +51,10 @@ if moretrees.enable_leafdecay then interval = moretrees.leafdecay_delay, chance = moretrees.leafdecay_chance, action = function(pos, node, active_object_count, active_object_count_wider) - if minetest.find_node_near(pos, moretrees.leafdecay_radius, "moretrees:fir_trunk") then return end - if minetest.find_node_near(pos, moretrees.leafdecay_radius, "ignore") then return end - process_drops(pos, node.name) - minetest.remove_node(pos) - nodeupdate(pos) + if minetest.find_node_near(pos, moretrees.leafdecay_radius, { "ignore", "moretrees:fir_trunk" }) then return end + process_drops(pos, node.name) + minetest.remove_node(pos) + nodeupdate(pos) end }) @@ -66,11 +63,10 @@ if moretrees.enable_leafdecay then interval = moretrees.leafdecay_delay, chance = moretrees.leafdecay_chance, action = function(pos, node, active_object_count, active_object_count_wider) - if minetest.find_node_near(pos, moretrees.palm_leafdecay_radius, "moretrees:palm_trunk") then return end - if minetest.find_node_near(pos, moretrees.palm_leafdecay_radius, "ignore") then return end - process_drops(pos, node.name) - minetest.remove_node(pos) - nodeupdate(pos) + if minetest.find_node_near(pos, moretrees.palm_leafdecay_radius, { "ignore", "moretrees:palm_trunk" }) then return end + process_drops(pos, node.name) + minetest.remove_node(pos) + nodeupdate(pos) end }) end @@ -82,8 +78,7 @@ if moretrees.enable_default_leafdecay then interval = moretrees.default_leafdecay_delay, chance = moretrees.default_leafdecay_chance, action = function(pos, node, active_object_count, active_object_count_wider) - if minetest.find_node_near(pos, moretrees.default_leafdecay_radius, "default:tree") then return end - if minetest.find_node_near(pos, moretrees.default_leafdecay_radius, "ignore") then return end + if minetest.find_node_near(pos, moretrees.default_leafdecay_radius, { "ignore", "default:tree" }) then return end process_drops(pos, node.name) minetest.remove_node(pos) nodeupdate(pos) @@ -98,8 +93,7 @@ if moretrees.enable_default_jungle_leafdecay then interval = moretrees.default_jungle_leafdecay_delay, chance = moretrees.default_jungle_leafdecay_chance, action = function(pos, node, active_object_count, active_object_count_wider) - if minetest.find_node_near(pos, moretrees.default_jungle_leafdecay_radius, "default:jungletree") then return end - if minetest.find_node_near(pos, moretrees.default_jungle_leafdecay_radius, "ignore") then return end + if minetest.find_node_near(pos, moretrees.default_jungle_leafdecay_radius, { "ignore", "default:jungletree" }) then return end process_drops(pos, node.name) minetest.remove_node(pos) nodeupdate(pos) diff --git a/mods/moretrees/node_defs.lua b/mods/moretrees/node_defs.lua index 682e0c3..890e929 100644 --- a/mods/moretrees/node_defs.lua +++ b/mods/moretrees/node_defs.lua @@ -38,37 +38,45 @@ if moretrees.plantlike_leaves then moretrees_plantlike_leaves_visual_scale = 1.189 end -local new_default_leaves = moretrees:clone_node("default:leaves") - if moretrees.enable_default_leafdecay then - new_default_leaves.groups = {snappy=3, flammable=2, leaves=1} - end - if moretrees.plantlike_leaves then - new_default_leaves.inventory_image = minetest.inventorycube("default_leaves.png") - new_default_leaves.drawtype = "plantlike" - new_default_leaves.visual_scale = moretrees_plantlike_leaves_visual_scale - new_default_leaves.tiles = {"default_leaves_plantlike.png"} - else - new_default_leaves.waving = 1 - end - if moretrees.enable_default_leafdecay or moretrees.plantlike_leaves then - minetest.register_node(":default:leaves", new_default_leaves) - end +-- redefine default leaves to handle plantlike and/or leaf decay options -local new_default_jungleleaves = moretrees:clone_node("default:jungleleaves") - if moretrees.enable_default_leafdecay then - new_default_jungleleaves.groups = {snappy=3, flammable=2, leaves=1} - end - if moretrees.plantlike_leaves then - new_default_jungleleaves.inventory_image = minetest.inventorycube("default_jungleleaves.png") - new_default_jungleleaves.drawtype = "plantlike" - new_default_jungleleaves.visual_scale = moretrees_plantlike_leaves_visual_scale - new_default_jungleleaves.tiles = {"default_jungleleaves_plantlike.png"} - else - new_default_jungleleaves.waving = 1 - end - if moretrees.enable_default_leafdecay or moretrees.plantlike_leaves then - minetest.register_node(":default:jungleleaves", new_default_jungleleaves) - end +if moretrees.enable_default_leafdecay then + minetest.override_item("default:leaves", { + groups = { snappy = 3, flammable = 2, leaves = 1 } + }) +end +if moretrees.plantlike_leaves then + minetest.override_item("default:leaves", { + inventory_image = minetest.inventorycube("default_leaves.png"), + drawtype = "plantlike", + visual_scale = 1.189, + tiles = { "default_leaves_plantlike.png" } + }) +else + minetest.override_item("default:leaves", { + waving = 1 + }) +end + +-- redefine default jungle leaves for same + +if moretrees.enable_default_leafdecay then + minetest.override_item("default:jungleleaves", { + groups = { snappy = 3, flammable = 2, leaves = 1 } + }) +end +if moretrees.plantlike_leaves then + minetest.override_item("default:jungleleaves", { + inventory_image = minetest.inventorycube("default_jungleleaves.png"), + drawtype = "plantlike", + visual_scale = 1.189, + tiles = { "default_jungleleaves_plantlike.png" } + }) +else + minetest.override_item("default:jungleleaves", { + waving = 1 + }) +end for i in ipairs(moretrees.treelist) do local treename = moretrees.treelist[i][1] @@ -348,9 +356,9 @@ minetest.register_node("moretrees:fir_leaves_bright", { }) if moretrees.enable_redefine_apple then - local new_default_apple = moretrees:clone_node("default:apple") - new_default_apple.groups.attached_node = 1 - minetest.register_node(":default:apple", new_default_apple) + minetest.override_item("default:apple", + {groups = { fleshy=3, dig_immediate=3, flammable=2, leafdecay=3, leafdecay_drop=1, attached_node = 1} + }) end table.insert(moretrees.avoidnodes, "default:jungletree") @@ -379,10 +387,6 @@ minetest.register_node("moretrees:rubber_tree_trunk_empty", { sounds = default.node_sound_wood_defaults(), paramtype2 = "facedir", on_place = minetest.rotate_node, - after_place_node = function(pos, placer, itemstack) - local meta = minetest.get_meta(pos) - meta:set_int("placed", 1) - end }) minetest.register_abm({ @@ -400,12 +404,15 @@ minetest.register_abm({ minetest.register_alias("technic:rubber_tree_full", "moretrees:rubber_tree_trunk") minetest.register_alias("farming_plus:rubber_tree_full", "moretrees:rubber_tree_trunk") +minetest.register_alias("farming:rubber_tree_full", "moretrees:rubber_tree_trunk") minetest.register_alias("technic:rubber_leaves", "moretrees:rubber_tree_leaves") minetest.register_alias("farming_plus:rubber_leaves", "moretrees:rubber_tree_leaves") +minetest.register_alias("farming:rubber_leaves", "moretrees:rubber_tree_leaves") -minetest.register_alias("farming_plus:rubber_sapling", "moretrees:rubber_tree_sapling") minetest.register_alias("technic:rubber_tree_sapling", "moretrees:rubber_tree_sapling") +minetest.register_alias("farming_plus:rubber_sapling", "moretrees:rubber_tree_sapling") +minetest.register_alias("farming:rubber_sapling", "moretrees:rubber_tree_sapling") minetest.register_alias("default:junglesapling","moretrees:jungletree_sapling") minetest.register_alias("moretrees:jungletree_trunk_sideways", "moreblocks:horizontal_jungle_tree") diff --git a/mods/pipeworks/autoplace_tubes.lua b/mods/pipeworks/autoplace_tubes.lua index 385458c..42cf98b 100644 --- a/mods/pipeworks/autoplace_tubes.lua +++ b/mods/pipeworks/autoplace_tubes.lua @@ -1,72 +1,38 @@ -- autorouting for pneumatic tubes -local function in_table(table,element) - for _,el in ipairs(table) do - if el==element then return true end - end - return false -end - local function is_tube(nodename) - return in_table(pipeworks.tubenodes,nodename) -end - -if pipeworks == nil then - pipeworks = {} + return table.contains(pipeworks.tubenodes, nodename) end --a function for determining which side of the node we are on local function nodeside(node, tubedir) - if node and (node.param2 < 0 or node.param2 > 23) then node.param2 = 0 end - - --get a vector pointing back - local backdir = minetest.facedir_to_dir(node.param2) - - --check whether the vector is equivalent to the tube direction; if it is, the tube's on the backside - if backdir.x == tubedir.x and backdir.y == tubedir.y and backdir.z == tubedir.z then - return "back" + if node.param2 < 0 or node.param2 > 23 then + node.param2 = 0 end - --check whether the vector is antiparallel with the tube direction; that indicates the front - if backdir.x == -tubedir.x and backdir.y == -tubedir.y and backdir.z == -tubedir.z then + local backdir = minetest.facedir_to_dir(node.param2) + local back = vector.dot(backdir, tubedir) + if back == 1 then + return "back" + elseif back == -1 then return "front" end - --facedir is defined in terms of the top-bottom axis of the node; we'll take advantage of that - local topdir = ({[0]={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)] - - --is this the top? - if topdir.x == tubedir.x and topdir.y == tubedir.y and topdir.z == tubedir.z then + local topdir = minetest.facedir_to_top_dir(node.param2) + local top = vector.dot(topdir, tubedir) + if top == 1 then return "top" - end - - --or the bottom? - if topdir.x == -tubedir.x and topdir.y == -tubedir.y and topdir.z == -tubedir.z then + elseif top == -1 then return "bottom" end - --we shall apply some maths to obtain the right-facing vector - local rightdir = {x=topdir.y*backdir.z - backdir.y*topdir.z, - y=topdir.z*backdir.x - backdir.z*topdir.x, - z=topdir.x*backdir.y - backdir.x*topdir.y} - - --is this the right side? - if rightdir.x == tubedir.x and rightdir.y == tubedir.y and rightdir.z == tubedir.z then + local rightdir = minetest.facedir_to_right_dir(node.param2) + local right = vector.dot(rightdir, tubedir) + if right == 1 then return "right" - end - - --or the left? - if rightdir.x == -tubedir.x and rightdir.y == -tubedir.y and rightdir.z == -tubedir.z then + else return "left" end - - --we should be done by now; initiate panic mode - minetest.log("error", "nodeside has been confused by its parameters; see pipeworks autoplace_tubes.lua, line 78") end local vts = {0, 3, 1, 4, 2, 5} @@ -78,23 +44,23 @@ local function tube_autoroute(pos) if not is_tube(nctr.name) then return end local adjustments = { - { 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 } + {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} } -- xm = 1, xp = 2, ym = 3, yp = 4, zm = 5, zp = 6 local positions = {} local nodes = {} - for i,adj in ipairs(adjustments) do - positions[i] = {x=pos.x+adj.x, y=pos.y+adj.y, z=pos.z+adj.z} + for i, adj in ipairs(adjustments) do + positions[i] = vector.add(pos, adj) nodes[i] = minetest.get_node(positions[i]) end - for i,node in ipairs(nodes) do + for i, node in ipairs(nodes) do local idef = minetest.registered_nodes[node.name] -- handle the tubes themselves if is_tube(node.name) then @@ -102,7 +68,9 @@ local function tube_autoroute(pos) -- handle new style connectors elseif idef and idef.tube and idef.tube.connect_sides then local dir = adjustments[i] - if idef.tube.connect_sides[nodeside(node, {x=-dir.x, y=-dir.y, z=-dir.z})] then active[i] = 1 end + if idef.tube.connect_sides[nodeside(node, vector.multiply(dir, -1))] then + active[i] = 1 + end end end @@ -110,18 +78,17 @@ local function tube_autoroute(pos) local nodedef = minetest.registered_nodes[nctr.name] local basename = nodedef.basename - local newname if nodedef.style == "old" then local nsurround = "" - for i,n in ipairs(active) do - nsurround = nsurround .. n + for i, n in ipairs(active) do + nsurround = nsurround..n end nctr.name = basename.."_"..nsurround elseif nodedef.style == "6d" then local s = 0 - for i,n in ipairs(active) do + for i, n in ipairs(active) do if n == 1 then - s = s+2^vts[i] + s = s + 2^vts[i] end end nctr.name = basename.."_"..tube_table[s] @@ -131,14 +98,9 @@ local function tube_autoroute(pos) end function pipeworks.scan_for_tube_objects(pos) - if pos == nil then return end - tube_autoroute({ x=pos.x-1, y=pos.y , z=pos.z }) - tube_autoroute({ x=pos.x+1, y=pos.y , z=pos.z }) - tube_autoroute({ x=pos.x , y=pos.y-1, z=pos.z }) - tube_autoroute({ x=pos.x , y=pos.y+1, z=pos.z }) - tube_autoroute({ x=pos.x , y=pos.y , z=pos.z-1 }) - tube_autoroute({ x=pos.x , y=pos.y , z=pos.z+1 }) - tube_autoroute(pos) + for side = 0, 6 do + tube_autoroute(vector.add(pos, directions.side_to_dir(side))) + end end minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) @@ -157,7 +119,7 @@ minetest.register_on_dignode(function(pos, oldnode, digger) end end) -if minetest.get_modpath("mesecons_mvps") ~= nil then +if minetest.get_modpath("mesecons_mvps") then mesecon:register_on_mvps_move(function(moved_nodes) for _, n in ipairs(moved_nodes) do pipeworks.scan_for_tube_objects(n.pos) diff --git a/mods/pipeworks/common.lua b/mods/pipeworks/common.lua new file mode 100644 index 0000000..6a92198 --- /dev/null +++ b/mods/pipeworks/common.lua @@ -0,0 +1,144 @@ +---------------------- +-- Vector functions -- +---------------------- + +function vector.cross(a, b) + return { + x = a.y * b.z - a.z * b.y, + y = a.z * b.x - a.x * b.z, + z = a.x * b.y - a.y * b.x + } +end + +function vector.dot(a, b) + return a.x * b.x + a.y * b.y + a.z * b.z +end + +----------------------- +-- Facedir functions -- +----------------------- + +function minetest.facedir_to_top_dir(facedir) + return ({[0] = {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(facedir / 4)] +end + +function minetest.facedir_to_right_dir(facedir) + return vector.cross( + minetest.facedir_to_top_dir(facedir), + minetest.facedir_to_dir(facedir) + ) +end + +directions = {} +function directions.side_to_dir(side) + return ({[0] = vector.new(), + vector.new( 0, 1, 0), + vector.new( 0, -1, 0), + vector.new( 1, 0, 0), + vector.new(-1, 0, 0), + vector.new( 0, 0, 1), + vector.new( 0, 0, -1) + })[side] +end + +function directions.dir_to_side(dir) + local c = vector.dot(dir, vector.new(1, 2, 3)) + 4 + return ({6, 2, 4, 0, 3, 1, 5})[c] +end + +---------------------- +-- String functions -- +---------------------- + +--[[function string.split(str, sep) + local fields = {} + local index = 1 + local expr = "([^"..sep.."])+" + string.gsub(str, expr, function(substring) + fields[index] = substring + index = index + 1 + end) + return fields +end]] + +function string.startswith(str, substr) + return str:sub(1, substr:len()) == substr +end + +--------------------- +-- Table functions -- +--------------------- + +function table.contains(tbl, element) + for _, elt in pairs(tbl) do + if elt == element then + return true + end + end + return false +end + +function table.extend(tbl, tbl2) + local index = #tbl + 1 + for _, elt in ipairs(tbl2) do + tbl[index] = elt + index = index + 1 + end +end + +function table.recursive_replace(tbl, pattern, replace_with) + if type(tbl) == "table" then + local tbl2 = {} + for key, value in pairs(tbl) do + tbl2[key] = table.recursive_replace(value, pattern, replace_with) + end + return tbl2 + elseif type(tbl) == "string" then + return tbl:gsub(pattern, replace_with) + else + return tbl + end +end + +------------------------ +-- Formspec functions -- +------------------------ + +fs_helpers = {} +function fs_helpers.on_receive_fields(pos, fields) + local meta = minetest.get_meta(pos) + for field, value in pairs(fields) do + if field:startswith("fs_helpers_cycling:") then + local l = field:split(":") + local new_value = tonumber(l[2]) + local meta_name = l[3] + meta:set_int(meta_name, new_value) + end + end +end + +function fs_helpers.cycling_button(meta, base, meta_name, values) + local current_value = meta:get_int(meta_name) + local new_value = (current_value + 1) % (#values) + local text = values[current_value + 1] + local field = "fs_helpers_cycling:"..new_value..":"..meta_name + return base..";"..field..";"..text.."]" +end + +--------- +-- Env -- +--------- + +function minetest.load_position(pos) + if minetest.get_node_or_nil(pos) then + return + end + local vm = minetest.get_voxel_manip() + vm:read_from_map(pos, pos) +end \ No newline at end of file diff --git a/mods/pipeworks/compat.lua b/mods/pipeworks/compat.lua index e80fa62..a1c1d45 100644 --- a/mods/pipeworks/compat.lua +++ b/mods/pipeworks/compat.lua @@ -1,25 +1,17 @@ -- this bit of code modifies the default chests and furnaces to be compatible -- with pipeworks. -function pipeworks.clone_node(name) - local node2 = {} - local node = minetest.registered_nodes[name] - for k, v in pairs(node) do - node2[k] = v - end - return node2 -end - -local furnace = pipeworks.clone_node("default:furnace") - furnace.tiles[1] = "default_furnace_top.png^pipeworks_tube_connection_stony.png" - furnace.tiles[2] = "default_furnace_bottom.png^pipeworks_tube_connection_stony.png" - furnace.tiles[3] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" - furnace.tiles[4] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" - furnace.tiles[5] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" - -- note we don't redefine entry 6 ( front) - furnace.groups.tubedevice = 1 - furnace.groups.tubedevice_receiver = 1 - furnace.tube = { +minetest.override_item("default:furnace", { + tiles = { + "default_furnace_top.png^pipeworks_tube_connection_stony.png", + "default_furnace_bottom.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_front.png" + }, + groups = {cracky = 2, tubedevice = 1, tubedevice_receiver = 1}, + tube = { insert_object = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -39,27 +31,30 @@ local furnace = pipeworks.clone_node("default:furnace") end end, input_inventory = "dst", - connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1} - } - furnace.after_place_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end - furnace.after_dig_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, +}) -minetest.register_node(":default:furnace", furnace) - -local furnace_active = pipeworks.clone_node("default:furnace_active") - furnace_active.tiles[1] = "default_furnace_top.png^pipeworks_tube_connection_stony.png" - furnace_active.tiles[2] = "default_furnace_bottom.png^pipeworks_tube_connection_stony.png" - furnace_active.tiles[3] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" - furnace_active.tiles[4] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" - furnace_active.tiles[5] = "default_furnace_side.png^pipeworks_tube_connection_stony.png" - -- note we don't redefine entry 6 (front) - furnace_active.groups.tubedevice = 1 - furnace_active.groups.tubedevice_receiver = 1 - furnace_active.tube = { +minetest.override_item("default:furnace_active", { + tiles = { + "default_furnace_top.png^pipeworks_tube_connection_stony.png", + "default_furnace_bottom.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + groups = {cracky = 2, tubedevice = 1, tubedevice_receiver = 1, not_in_creative_inventory = 1}, + tube = { insert_object = function(pos,node,stack,direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -79,28 +74,21 @@ local furnace_active = pipeworks.clone_node("default:furnace_active") end end, input_inventory = "dst", - connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1} - } - furnace_active.after_place_node= function(pos) - pipeworks.scan_for_tube_objects(pos) - end - furnace_active.after_dig_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, +}) -minetest.register_node(":default:furnace_active", furnace_active) - - -local chest = pipeworks.clone_node("default:chest") - chest.tiles[1] = "default_chest_top.png^pipeworks_tube_connection_wooden.png" - chest.tiles[2] = "default_chest_top.png^pipeworks_tube_connection_wooden.png" - chest.tiles[3] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" - chest.tiles[4] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" - chest.tiles[5] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" - -- note we don't redefine entry 6 (front). - chest.groups.tubedevice = 1 - chest.groups.tubedevice_receiver = 1 - chest.tube = { +minetest.override_item("default:chest", { + tiles = { + "default_chest_top.png^pipeworks_tube_connection_wooden.png", + "default_chest_top.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_front.png" + }, + groups = {choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1}, + tube = { insert_object = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -112,28 +100,21 @@ local chest = pipeworks.clone_node("default:chest") return inv:room_for_item("main", stack) end, input_inventory = "main", - connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1} - } - chest.after_place_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end - chest.after_dig_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, +}) -minetest.register_node(":default:chest", chest) - - -local chest_locked = pipeworks.clone_node("default:chest_locked") - chest_locked.tiles[1] = "default_chest_top.png^pipeworks_tube_connection_wooden.png" - chest_locked.tiles[2] = "default_chest_top.png^pipeworks_tube_connection_wooden.png" - chest_locked.tiles[3] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" - chest_locked.tiles[4] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" - chest_locked.tiles[5] = "default_chest_side.png^pipeworks_tube_connection_wooden.png" - -- note we don't redefine entry 6 (front). - chest_locked.groups.tubedevice = 1 - chest_locked.groups.tubedevice_receiver = 1 - chest_locked.tube = { +minetest.override_item("default:chest_locked", { + tiles = { + "default_chest_top.png^pipeworks_tube_connection_wooden.png", + "default_chest_top.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_lock.png" + }, + groups = {choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1}, + tube = { insert_object = function(pos, node, stack, direction) local meta = minetest.env:get_meta(pos) local inv = meta:get_inventory() @@ -144,15 +125,6 @@ local chest_locked = pipeworks.clone_node("default:chest_locked") local inv = meta:get_inventory() return inv:room_for_item("main", stack) end, - connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1} - } - local old_after_place = minetest.registered_nodes["default:chest_locked"].after_place_node - chest_locked.after_place_node = function(pos, placer) - pipeworks.scan_for_tube_objects(pos) - old_after_place(pos, placer) - end - chest_locked.after_dig_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end - -minetest.register_node(":default:chest_locked", chest_locked) + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, +}) diff --git a/mods/pipeworks/crafts.lua b/mods/pipeworks/crafts.lua index 8a38daf..12913d7 100644 --- a/mods/pipeworks/crafts.lua +++ b/mods/pipeworks/crafts.lua @@ -38,9 +38,9 @@ minetest.register_craft( { }) minetest.register_craft( { - output = "pipeworks:valve_off 2", + output = "pipeworks:valve_off_empty 2", recipe = { - { "", "default:stick", "" }, + { "", "group:stick", "" }, { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, { "", "default:steel_ingot", "" } }, @@ -59,7 +59,7 @@ minetest.register_craft( { output = "pipeworks:grating 2", recipe = { { "default:steel_ingot", "", "default:steel_ingot" }, - { "", "default:steel_ingot", "" }, + { "", "pipeworks:pipe_1_empty", "" }, { "default:steel_ingot", "", "default:steel_ingot" } }, }) @@ -87,54 +87,72 @@ minetest.register_craft( { if minetest.get_modpath("homedecor") == nil then - minetest.register_craftitem(":homedecor:plastic_sheeting", { - description = "Plastic sheet", - inventory_image = "homedecor_plastic_sheeting.png", + minetest.register_craftitem(":homedecor:oil_extract", { + description = "Oil extract", + inventory_image = "homedecor_oil_extract.png", }) - minetest.register_craftitem(":homedecor:plastic_base", { - description = "Unprocessed Plastic base", - wield_image = "homedecor_plastic_base.png", - inventory_image = "homedecor_plastic_base_inv.png", + minetest.register_craftitem(":homedecor:paraffin", { + description = "Unprocessed paraffin", + inventory_image = "homedecor_paraffin.png", + }) + + minetest.register_alias("homedecor:plastic_base", "homedecor:paraffin") + + minetest.register_craftitem(":homedecor:plastic_sheeting", { + description = "Plastic sheet", + inventory_image = "homedecor_plastic_sheeting.png", }) minetest.register_craft({ type = "shapeless", - output = 'homedecor:plastic_base 4', - recipe = { "default:leaves", - "group:leaves", - "group:leaves", - "group:leaves", - "group:leaves", - "group:leaves" + output = "homedecor:oil_extract 4", + recipe = { + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves" } }) minetest.register_craft({ - type = "cooking", - output = "homedecor:plastic_sheeting", - recipe = "homedecor:plastic_base", + type = "cooking", + output = "homedecor:paraffin", + recipe = "homedecor:oil_extract", }) minetest.register_craft({ - type = 'fuel', - recipe = 'homedecor:plastic_base', - burntime = 30, + type = "cooking", + output = "homedecor:plastic_sheeting", + recipe = "homedecor:paraffin", }) minetest.register_craft({ - type = 'fuel', - recipe = 'homedecor:plastic_sheeting', - burntime = 30, + type = "fuel", + recipe = "homedecor:oil_extract", + burntime = 30, }) + minetest.register_craft({ + type = "fuel", + recipe = "homedecor:paraffin", + burntime = 30, + }) + + minetest.register_craft({ + type = "fuel", + recipe = "homedecor:plastic_sheeting", + burntime = 30, + }) end minetest.register_craft( { output = "pipeworks:one_way_tube 2", recipe = { { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, - { "default:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, + { "group:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } }, }) @@ -277,7 +295,7 @@ minetest.register_craft( { output = "pipeworks:filter 2", recipe = { { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }, - { "default:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, + { "group:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" } }, }) @@ -286,7 +304,7 @@ minetest.register_craft( { output = "pipeworks:mese_filter 2", recipe = { { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }, - { "default:stick", "default:mese", "homedecor:plastic_sheeting" }, + { "group:stick", "default:mese", "homedecor:plastic_sheeting" }, { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" } }, }) diff --git a/mods/pipeworks/default_settings.txt b/mods/pipeworks/default_settings.txt index f594a16..4aa4150 100644 --- a/mods/pipeworks/default_settings.txt +++ b/mods/pipeworks/default_settings.txt @@ -3,6 +3,7 @@ pipeworks.enable_pipes = true pipeworks.enable_autocrafter = true pipeworks.enable_deployer = true +pipeworks.enable_dispenser = true pipeworks.enable_node_breaker = true pipeworks.enable_teleport_tube = true pipeworks.enable_pipe_devices = true diff --git a/mods/pipeworks/deployer.lua b/mods/pipeworks/deployer.lua deleted file mode 100644 index e67250c..0000000 --- a/mods/pipeworks/deployer.lua +++ /dev/null @@ -1,286 +0,0 @@ - ---register aliases for when someone had technic installed, but then uninstalled it but not pipeworks -minetest.register_alias("technic:deployer_off", "pipeworks:deployer_off") -minetest.register_alias("technic:deployer_on", "pipeworks:deployer_on") - ---define the functions from https://github.com/minetest/minetest/pull/834 while waiting for the devs to notice it -local function dir_to_facedir(dir, is6d) - --account for y if requested - if is6d and math.abs(dir.y) > math.abs(dir.x) and math.abs(dir.y) > math.abs(dir.z) then - - --from above - if dir.y < 0 then - if math.abs(dir.x) > math.abs(dir.z) then - if dir.x < 0 then - return 19 - else - return 13 - end - else - if dir.z < 0 then - return 10 - else - return 4 - end - end - - --from below - else - if math.abs(dir.x) > math.abs(dir.z) then - if dir.x < 0 then - return 15 - else - return 17 - end - else - if dir.z < 0 then - return 6 - else - return 8 - end - end - end - - --otherwise, place horizontally - elseif math.abs(dir.x) > math.abs(dir.z) then - if dir.x < 0 then - return 3 - else - return 1 - end - else - if dir.z < 0 then - return 2 - else - return 0 - end - end -end - -minetest.register_craft({ - output = 'pipeworks:deployer_off 1', - recipe = { - {'group:wood', 'default:chest','group:wood'}, - {'default:stone', 'mesecons:piston','default:stone'}, - {'default:stone', 'mesecons:mesecon','default:stone'}, - } -}) - -local function swap_node(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function delay(x) - return (function() return x end) -end - -local function deployer_on(pos, node) - if node.name ~= "pipeworks:deployer_off" then - return - end - - --locate the above and under positions - local dir = minetest.facedir_to_dir(node.param2) - local pos_under, pos_above = {x = pos.x - dir.x, y = pos.y - dir.y, z = pos.z - dir.z}, {x = pos.x - 2*dir.x, y = pos.y - 2*dir.y, z = pos.z - 2*dir.z} - - swap_node(pos, "pipeworks:deployer_on") - nodeupdate(pos) - - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local invlist = inv:get_list("main") - for i, stack in ipairs(invlist) do - if stack:get_name() ~= nil and stack:get_name() ~= "" and minetest.get_node(pos_under).name == "air" then --obtain the first non-empty item slot - local pitch - local yaw - if dir.z < 0 then - yaw = 0 - pitch = 0 - elseif dir.z > 0 then - yaw = math.pi - pitch = 0 - elseif dir.x < 0 then - yaw = 3*math.pi/2 - pitch = 0 - elseif dir.x > 0 then - yaw = math.pi/2 - pitch = 0 - elseif dir.y > 0 then - yaw = 0 - pitch = -math.pi/2 - else - yaw = 0 - pitch = math.pi/2 - end - local placer = { - get_inventory_formspec = delay(meta:get_string("formspec")), - get_look_dir = delay({x = -dir.x, y = -dir.y, z = -dir.z}), - get_look_pitch = delay(pitch), - get_look_yaw = delay(yaw), - get_player_control = delay({jump=false, right=false, left=false, LMB=false, RMB=false, sneak=false, aux1=false, down=false, up=false}), - get_player_control_bits = delay(0), - get_player_name = delay("deployer"), - is_player = delay(true), - set_inventory_formspec = delay(), - getpos = delay({x = pos.x, y = pos.y - 1.5, z = pos.z}), -- Player height - get_hp = delay(20), - get_inventory = delay(inv), - get_wielded_item = delay(stack), - get_wield_index = delay(i), - get_wield_list = delay("main"), - moveto = delay(), - punch = delay(), - remove = delay(), - right_click = delay(), - setpos = delay(), - set_hp = delay(), - set_properties = delay(), - set_wielded_item = function(self, item) inv:set_stack("main", i, item) end, - set_animation = delay(), - set_attach = delay(), - set_detach = delay(), - set_bone_position = delay(), - } - local stack2 = minetest.item_place(stack, placer, {type="node", under=pos_under, above=pos_above}) - if minetest.setting_getbool("creative_mode") and not minetest.get_modpath("unified_inventory") then --infinite stacks ahoy! - stack2:take_item() - end - invlist[i] = stack2 - inv:set_list("main", invlist) - return - end - end -end - -local deployer_off = function(pos, node) - if node.name == "pipeworks:deployer_on" then - swap_node(pos, "pipeworks:deployer_off") - nodeupdate(pos) - end -end - -minetest.register_node("pipeworks:deployer_off", { - description = "Deployer", - tile_images = {"pipeworks_deployer_top.png","pipeworks_deployer_bottom.png","pipeworks_deployer_side2.png","pipeworks_deployer_side1.png", - "pipeworks_deployer_back.png","pipeworks_deployer_front_off.png"}, - mesecons = {effector={rules=pipeworks.rules_all,action_on=deployer_on,action_off=deployer_off}}, - 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={back=1}}, - is_ground_content = true, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, tubedevice_receiver=1}, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "invsize[8,9;]".. - "label[0,0;Deployer]".. - "list[current_name;main;4,1;3,3;]".. - "list[current_player;main;0,5;8,4;]") - meta:set_string("infotext", "Deployer") - local inv = meta:get_inventory() - inv:set_size("main", 3*3) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - after_place_node = function (pos, placer) - pipeworks.scan_for_tube_objects(pos, placer) - local placer_pos = placer:getpos() - - --correct for the player's height - if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end - - --correct for 6d facedir - if placer_pos then - local dir = { - x = pos.x - placer_pos.x, - y = pos.y - placer_pos.y, - z = pos.z - placer_pos.z - } - local node = minetest.get_node(pos) - node.param2 = dir_to_facedir(dir, true) - minetest.set_node(pos, node) - minetest.log("action", "real (6d) facedir: " .. node.param2) - end - end, - after_dig_node = pipeworks.scan_for_tube_objects, -}) - -minetest.register_node("pipeworks:deployer_on", { - description = "Deployer", - tile_images = {"pipeworks_deployer_top.png","pipeworks_deployer_bottom.png","pipeworks_deployer_side2.png","pipeworks_deployer_side1.png", - "pipeworks_deployer_back.png","pipeworks_deployer_front_on.png"}, - mesecons = {effector={rules=pipeworks.rules_all,action_on=deployer_on,action_off=deployer_off}}, - 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={back=1}}, - is_ground_content = true, - paramtype2 = "facedir", - tubelike=1, - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, tubedevice_receiver=1,not_in_creative_inventory=1}, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "invsize[8,9;]".. - "label[0,0;Deployer]".. - "list[current_name;main;4,1;3,3;]".. - "list[current_player;main;0,5;8,4;]") - meta:set_string("infotext", "Deployer") - local inv = meta:get_inventory() - inv:set_size("main", 3*3) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - after_place_node = function (pos, placer) - pipeworks.scan_for_tube_objects(pos, placer) - local placer_pos = placer:getpos() - - --correct for the player's height - if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end - - --correct for 6d facedir - if placer_pos then - local dir = { - x = pos.x - placer_pos.x, - y = pos.y - placer_pos.y, - z = pos.z - placer_pos.z - } - local node = minetest.get_node(pos) - node.param2 = dir_to_facedir(dir, true) - minetest.set_node(pos, node) - minetest.log("action", "real (6d) facedir: " .. node.param2) - end - end, - after_dig_node = pipeworks.scan_for_tube_objects, -}) diff --git a/mods/pipeworks/devices.lua b/mods/pipeworks/devices.lua index ab14a2d..b7571d3 100644 --- a/mods/pipeworks/devices.lua +++ b/mods/pipeworks/devices.lua @@ -590,7 +590,7 @@ for fill = 0, 10 do groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1}, sounds = default.node_sound_wood_defaults(), walkable = true, - drop = "pipeworks:storage_tank_"..fill, + drop = "pipeworks:storage_tank_0", after_place_node = function(pos) pipeworks.look_for_stackable_tanks(pos) pipeworks.scan_for_pipe_objects(pos) @@ -616,6 +616,7 @@ for fill = 0, 10 do groups = sgroups, sounds = default.node_sound_wood_defaults(), walkable = true, + drop = "pipeworks:storage_tank_0", after_place_node = function(pos) pipeworks.look_for_stackable_tanks(pos) pipeworks.scan_for_pipe_objects(pos) diff --git a/mods/pipeworks/init.lua b/mods/pipeworks/init.lua index 6964abc..b6c91d6 100644 --- a/mods/pipeworks/init.lua +++ b/mods/pipeworks/init.lua @@ -106,21 +106,23 @@ end ------------------------------------------- -- Load the various other parts of the mod +dofile(pipeworks.modpath.."/common.lua") dofile(pipeworks.modpath.."/models.lua") dofile(pipeworks.modpath.."/autoplace_pipes.lua") dofile(pipeworks.modpath.."/autoplace_tubes.lua") +dofile(pipeworks.modpath.."/luaentity.lua") dofile(pipeworks.modpath.."/item_transport.lua") dofile(pipeworks.modpath.."/flowing_logic.lua") dofile(pipeworks.modpath.."/crafts.lua") dofile(pipeworks.modpath.."/tubes.lua") +dofile(pipeworks.modpath.."/trashcan.lua") +dofile(pipeworks.modpath.."/wielder.lua") if pipeworks.enable_pipes then dofile(pipeworks.modpath.."/pipes.lua") end if pipeworks.enable_teleport_tube then dofile(pipeworks.modpath.."/teleport_tube.lua") end if pipeworks.enable_pipe_devices then dofile(pipeworks.modpath.."/devices.lua") end if pipeworks.enable_redefines then dofile(pipeworks.modpath.."/compat.lua") end if pipeworks.enable_autocrafter then dofile(pipeworks.modpath.."/autocrafter.lua") end -if pipeworks.enable_deployer then dofile(pipeworks.modpath.."/deployer.lua") end -if pipeworks.enable_node_breaker then dofile(pipeworks.modpath.."/node_breaker.lua") end minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty") diff --git a/mods/pipeworks/item_transport.lua b/mods/pipeworks/item_transport.lua index b97d5bb..02ef5f8 100644 --- a/mods/pipeworks/item_transport.lua +++ b/mods/pipeworks/item_transport.lua @@ -1,28 +1,3 @@ -dofile(pipeworks.modpath.."/compat.lua") - ---and an extra function for getting the right-facing vector -local function facedir_to_right_dir(facedir) - - --find the other directions - local backdir = minetest.facedir_to_dir(facedir) - local topdir = ({[0]={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(facedir/4)] - - --return a cross product - return {x=topdir.y*backdir.z - backdir.y*topdir.z, - y=topdir.z*backdir.x - backdir.z*topdir.x, - z=topdir.x*backdir.y - backdir.x*topdir.y} -end - -minetest.register_craftitem("pipeworks:filter", { - description = "Filter", - stack_max = 99, -}) - local fakePlayer = { get_player_name = function() return ":pipeworks" end, -- any other player functions called by allow_metadata_inventory_take anywhere... @@ -30,10 +5,17 @@ local fakePlayer = { } function pipeworks.tube_item(pos, item) + error("obsolete pipeworks.tube_item() called; change caller to use pipeworks.tube_inject_item() instead") +end + +function pipeworks.tube_inject_item(pos, start_pos, velocity, item) -- Take item in any format local stack = ItemStack(item) - local obj = minetest.add_entity(pos, "pipeworks:tubed_item") - obj:get_luaentity():set_item(stack:to_string()) + local obj = luaentity.add_entity(pos, "pipeworks:tubed_item") + obj:set_item(stack:to_string()) + obj.start_pos = vector.new(start_pos) + obj:setvelocity(velocity) + --obj:set_color("red") -- todo: this is test-only code return obj end @@ -43,19 +25,78 @@ end -- both optional w/ sensible defaults and fallback to normal allow_* function -- XXX: possibly change insert_object to insert_item --- sname = the current name to allow for, or nil if it allows anything +local function set_filter_infotext(data, meta) + local infotext = data.wise_desc.." Filter-Injector" + if meta:get_int("slotseq_mode") == 2 then + infotext = infotext .. " (slot #"..meta:get_int("slotseq_index").." next)" + end + meta:set_string("infotext", infotext) +end -local function grabAndFire(frominv,frominvname,frompos,fromnode,sname,tube,idef,dir,all) +local function set_filter_formspec(data, meta) + local itemname = data.wise_desc.." Filter-Injector" + local formspec = "size[8,8.5]".. + "item_image[0,0;1,1;pipeworks:"..data.name.."]".. + "label[1,0;"..minetest.formspec_escape(itemname).."]".. + "label[0,1;Prefer item types:]".. + "list[current_name;main;0,1.5;8,2;]".. + fs_helpers.cycling_button(meta, "button[0,3.5;4,1", "slotseq_mode", + {"Sequence slots by Priority", + "Sequence slots Randomly", + "Sequence slots by Rotation"}).. + "list[current_player;main;0,4.5;8,4;]" + meta:set_string("formspec", formspec) +end + +-- todo SOON: this function has *way too many* parameters +local function grabAndFire(data,slotseq_mode,filtmeta,frominv,frominvname,frompos,fromnode,filtername,fromtube,fromdef,dir,all) + local sposes = {} for spos,stack in ipairs(frominv:get_list(frominvname)) do - if (sname == nil and stack:get_name() ~= "") or stack:get_name() == sname then + local matches + if filtername == "" then + matches = stack:get_name() ~= "" + else + matches = stack:get_name() == filtername + end + if matches then table.insert(sposes, spos) end + end + if #sposes == 0 then return false end + if slotseq_mode == 1 then + for i = #sposes, 2, -1 do + local j = math.random(i) + local t = sposes[j] + sposes[j] = sposes[i] + sposes[i] = t + end + elseif slotseq_mode == 2 then + local headpos = filtmeta:get_int("slotseq_index") + table.sort(sposes, function (a, b) + if a >= headpos then + if b < headpos then return true end + else + if b >= headpos then return false end + end + return a < b + end) + end + for _, spos in ipairs(sposes) do + local stack = frominv:get_stack(frominvname, spos) local doRemove = stack:get_count() - if tube.can_remove then - doRemove = tube.can_remove(frompos, fromnode, stack, dir) - elseif idef.allow_metadata_inventory_take then - doRemove = idef.allow_metadata_inventory_take(frompos,"main",spos, stack, fakePlayer) + if fromtube.can_remove then + doRemove = fromtube.can_remove(frompos, fromnode, stack, dir) + elseif fromdef.allow_metadata_inventory_take then + doRemove = fromdef.allow_metadata_inventory_take(frompos, frominvname,spos, stack, fakePlayer) end -- stupid lack of continue statements grumble if doRemove > 0 then + if slotseq_mode == 2 then + local nextpos = spos + 1 + if nextpos > frominv:get_size(frominvname) then + nextpos = 1 + end + filtmeta:set_int("slotseq_index", nextpos) + set_filter_infotext(data, filtmeta) + end local item local count if all then @@ -63,162 +104,116 @@ local function grabAndFire(frominv,frominvname,frompos,fromnode,sname,tube,idef, else count = 1 end - if tube.remove_items then + if fromtube.remove_items then -- it could be the entire stack... - item = tube.remove_items(frompos, fromnode, stack, dir, count) + item = fromtube.remove_items(frompos, fromnode, stack, dir, count) else item = stack:take_item(count) frominv:set_stack(frominvname, spos, stack) - if idef.on_metadata_inventory_take then - idef.on_metadata_inventory_take(frompos, "main", spos, item, fakePlayer) + if fromdef.on_metadata_inventory_take then + fromdef.on_metadata_inventory_take(frompos, frominvname, spos, item, fakePlayer) end end - local item1 = pipeworks.tube_item(vector.add(frompos, vector.multiply(dir, 1.4)), item) - item1:get_luaentity().start_pos = vector.add(frompos, dir) - item1:setvelocity(dir) - item1:setacceleration({x=0, y=0, z=0}) + local pos = vector.add(frompos, vector.multiply(dir, 1.4)) + local start_pos = vector.add(frompos, dir) + local item1 = pipeworks.tube_inject_item(pos, start_pos, dir, item) return true-- only fire one item, please end - end end return false end -minetest.register_node("pipeworks:filter", { - description = "Filter", - tiles = {"pipeworks_filter_top.png", "pipeworks_filter_top.png", "pipeworks_filter_output.png", - "pipeworks_filter_input.png", "pipeworks_filter_side.png", "pipeworks_filter_top.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,mesecon=2}, - legacy_facedir_simple = true, - sounds = default.node_sound_wood_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "invsize[8,6.5;]".. - "list[current_name;main;0,0;8,2;]".. - "list[current_player;main;0,2.5;8,4;]") - meta:set_string("infotext", "Filter") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - after_place_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end, - after_dig_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end, - mesecons={effector={action_on=function(pos,node) - minetest.registered_nodes[node.name].on_punch(pos,node,nil) - end}}, - tube={connect_sides={right=1}}, - on_punch = function (pos, node, puncher) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - local dir = facedir_to_right_dir(node.param2) - local frompos = {x=pos.x - dir.x, y=pos.y - dir.y, z=pos.z - dir.z} - local fromnode=minetest.get_node(frompos) - if not fromnode then return end - local idef = minetest.registered_nodes[fromnode.name] - -- assert(idef) - local tube = idef.tube - if not (tube and tube.input_inventory) then - return - end - local frommeta = minetest.get_meta(frompos) - local frominvname = tube.input_inventory - local frominv = frommeta:get_inventory() - local sname - for _,filter in ipairs(inv:get_list("main")) do - sname = filter:get_name() - if sname ~= "" then - -- XXX: that's a lot of parameters - if grabAndFire(frominv, frominvname, frompos, fromnode, sname, tube, idef, dir) then return end +local function punch_filter(data, filtpos, filtnode) + local filtmeta = minetest.get_meta(filtpos) + local filtinv = filtmeta:get_inventory() + local dir = minetest.facedir_to_right_dir(filtnode.param2) + local frompos = vector.subtract(filtpos, dir) + local fromnode = minetest.get_node(frompos) + if not fromnode then return end + local fromdef = minetest.registered_nodes[fromnode.name] + if not fromdef then return end + local fromtube = fromdef.tube + if not (fromtube and fromtube.input_inventory) then return end + local filters = {} + for _, filterstack in ipairs(filtinv:get_list("main")) do + local filtername = filterstack:get_name() + if filtername ~= "" then table.insert(filters, filtername) end + end + if #filters == 0 then table.insert(filters, "") end + local slotseq_mode = filtmeta:get_int("slotseq_mode") + local frommeta = minetest.get_meta(frompos) + local frominv = frommeta:get_inventory() + if fromtube.before_filter then fromtube.before_filter(frompos) end + for _, frominvname in ipairs(type(fromtube.input_inventory) == "table" and fromtube.input_inventory or {fromtube.input_inventory}) do + local done = false + for _, filtername in ipairs(filters) do + if grabAndFire(data, slotseq_mode, filtmeta, frominv, frominvname, frompos, fromnode, filtername, fromtube, fromdef, dir, data.stackwise) then + done = true + break end end - if inv:is_empty("main") then - grabAndFire(frominv,frominvname,frompos,fromnode,nil,tube,idef,dir) - end - end, -}) - -minetest.register_craftitem("pipeworks:mese_filter", { - description = "Mese filter", - stack_max = 99, -}) - -minetest.register_node("pipeworks:mese_filter", { - description = "Mese filter", - tiles = {"pipeworks_mese_filter_top.png", "pipeworks_mese_filter_top.png", "pipeworks_mese_filter_output.png", - "pipeworks_mese_filter_input.png", "pipeworks_mese_filter_side.png", "pipeworks_mese_filter_top.png"}, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,mesecon=2}, - legacy_facedir_simple = true, - sounds = default.node_sound_wood_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", - "invsize[8,6.5;]".. - "list[current_name;main;0,0;8,2;]".. - "list[current_player;main;0,2.5;8,4;]") - meta:set_string("infotext", "Mese filter") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") - end, - after_place_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end, - after_dig_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end, - mesecons={effector={action_on=function(pos,node) - minetest.registered_nodes[node.name].on_punch(pos,node,nil) - end}}, - tube={connect_sides={right=1}}, - on_punch = function (pos, node, puncher) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - local dir = facedir_to_right_dir(node.param2) - local frompos = {x=pos.x - dir.x, y=pos.y - dir.y, z=pos.z - dir.z} - local fromnode=minetest.get_node(frompos) - local idef = minetest.registered_nodes[fromnode.name] - -- assert(idef) - local tube = idef.tube - if not (tube and tube.input_inventory) then - return - end - local frommeta = minetest.get_meta(frompos) - local frominvname = minetest.registered_nodes[fromnode.name].tube.input_inventory - local frominv = frommeta:get_inventory() - local sname - for _,filter in ipairs(inv:get_list("main")) do - sname = filter:get_name() - if sname ~= "" then - if grabAndFire(frominv, frominvname, frompos, fromnode, sname, tube, idef, dir, true) then return end - end - end - if inv:is_empty("main") then - grabAndFire(frominv, frominvname, frompos, fromnode, nil, tube, idef, dir, true) - end - end, -}) - -local function roundpos(pos) - return {x=math.floor(pos.x+0.5),y=math.floor(pos.y+0.5),z=math.floor(pos.z+0.5)} + if done then break end + end + if fromtube.after_filter then fromtube.after_filter(frompos) end end -local function addVect(pos,vect) - return {x=pos.x+vect.x,y=pos.y+vect.y,z=pos.z+vect.z} +for _, data in ipairs({ + { + name = "filter", + wise_desc = "Itemwise", + stackwise = false, + }, + { + name = "mese_filter", + wise_desc = "Stackwise", + stackwise = true, + }, +}) do + minetest.register_node("pipeworks:"..data.name, { + description = data.wise_desc.." Filter-Injector", + tiles = { + "pipeworks_"..data.name.."_top.png", + "pipeworks_"..data.name.."_top.png", + "pipeworks_"..data.name.."_output.png", + "pipeworks_"..data.name.."_input.png", + "pipeworks_"..data.name.."_side.png", + "pipeworks_"..data.name.."_top.png", + }, + paramtype2 = "facedir", + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, mesecon = 2}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + set_filter_formspec(data, meta) + set_filter_infotext(data, meta) + local inv = meta:get_inventory() + inv:set_size("main", 8*2) + end, + on_receive_fields = function(pos, formname, fields, sender) + fs_helpers.on_receive_fields(pos, fields) + local meta = minetest.get_meta(pos) + meta:set_int("slotseq_index", 1) + set_filter_formspec(data, meta) + set_filter_infotext(data, meta) + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + mesecons = { + effector = { + action_on = function(pos, node) + punch_filter(data, pos, node) + end, + }, + }, + tube = {connect_sides = {right = 1}}, + on_punch = function (pos, node, puncher) + punch_filter(data, pos, node) + end, + }) end local adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} @@ -232,95 +227,75 @@ function pipeworks.notvel(tbl, vel) end local function go_next(pos, velocity, stack) - local chests = {} - local tubes = {} + local next_positions = {} + local max_priority = 0 local cnode = minetest.get_node(pos) local cmeta = minetest.get_meta(pos) - local n local can_go local speed = math.abs(velocity.x + velocity.y + velocity.z) + if speed == 0 then + speed = 1 + end local vel = {x = velocity.x/speed, y = velocity.y/speed, z = velocity.z/speed,speed=speed} if speed >= 4.1 then speed = 4 elseif speed >= 1.1 then - speed = speed-0.1 + speed = speed - 0.1 else speed = 1 end - vel.speed=speed + vel.speed = speed if minetest.registered_nodes[cnode.name] and minetest.registered_nodes[cnode.name].tube and minetest.registered_nodes[cnode.name].tube.can_go then can_go = minetest.registered_nodes[cnode.name].tube.can_go(pos, cnode, vel, stack) else can_go = pipeworks.notvel(adjlist, vel) end - local meta = nil - for _,vect in ipairs(can_go) do - local npos = addVect(pos,vect) + for _, vect in ipairs(can_go) do + local npos = vector.add(pos, vect) local node = minetest.get_node(npos) - local tube_receiver = minetest.get_item_group(node.name,"tubedevice_receiver") - meta = minetest.get_meta(npos) - local tubelike = meta:get_int("tubelike") - if tube_receiver == 1 then - if minetest.registered_nodes[node.name].tube and - minetest.registered_nodes[node.name].tube.can_insert and - minetest.registered_nodes[node.name].tube.can_insert(npos, node, stack, vect) then - local i = #chests + 1 - chests[i] = {} - chests[i].pos = npos - chests[i].vect = vect + local tubedevice = minetest.get_item_group(node.name, "tubedevice") + local tube_def = minetest.registered_nodes[node.name].tube + local tube_priority = (tube_def and tube_def.priority) or 100 + if tubedevice > 0 and tube_priority >= max_priority then + if not tube_def or not tube_def.can_insert or + tube_def.can_insert(npos, node, stack, vect) then + if tube_priority > max_priority then + max_priority = tube_priority + next_positions = {} + end + next_positions[#next_positions + 1] = {pos = npos, vect = vect} end - elseif tubelike == 1 then - local i = #tubes + 1 - tubes[i] = {} - tubes[i].pos = npos - tubes[i].vect = vect end end - if chests[1] == nil then--no chests found - if tubes[1] == nil then - return 0 - else - n = (cmeta:get_int("tubedir")%(#tubes)) + 1 - if pipeworks.enable_cyclic_mode then - cmeta:set_int("tubedir",n) - end - velocity.x = tubes[n].vect.x*vel.speed - velocity.y = tubes[n].vect.y*vel.speed - velocity.z = tubes[n].vect.z*vel.speed - end - else - n = (cmeta:get_int("tubedir")%(#chests))+1 - if pipeworks.enable_cyclic_mode then - cmeta:set_int("tubedir",n) - end - velocity.x = chests[n].vect.x*speed - velocity.y = chests[n].vect.y*speed - velocity.z = chests[n].vect.z*speed + + if not next_positions[1] then + return false, nil end - return 1 + + local n = (cmeta:get_int("tubedir") % (#next_positions)) + 1 + if pipeworks.enable_cyclic_mode then + cmeta:set_int("tubedir", n) + end + local new_velocity = vector.multiply(next_positions[n].vect, vel.speed) + return true, new_velocity end minetest.register_entity("pipeworks:tubed_item", { initial_properties = { hp_max = 1, physical = false, --- collisionbox = {0,0,0,0,0,0}, - collisionbox = {0.1,0.1,0.1,0.1,0.1,0.1}, - visual = "sprite", - visual_size = {x=0.5, y=0.5}, + collisionbox = {0.1, 0.1, 0.1, 0.1, 0.1, 0.1}, + visual = "wielditem", + visual_size = {x = 0.15, y = 0.15}, textures = {""}, - spritediv = {x=1, y=1}, - initial_sprite_basepos = {x=0, y=0}, + spritediv = {x = 1, y = 1}, + initial_sprite_basepos = {x = 0, y = 0}, is_visible = false, - start_pos={}, - route={} }, - - itemstring = '', + physical_state = false, - set_item = function(self, itemstring) - self.itemstring = itemstring + from_data = function(self, itemstring) local stack = ItemStack(itemstring) local itemtable = stack:to_table() local itemname = nil @@ -333,159 +308,171 @@ minetest.register_entity("pipeworks:tubed_item", { item_texture = minetest.registered_items[itemname].inventory_image item_type = minetest.registered_items[itemname].type end - prop = { + self.object:set_properties({ is_visible = true, - visual = "sprite", - textures = {"unknown_item.png"} - } - if item_texture and item_texture ~= "" then - prop.visual = "sprite" - prop.textures = {item_texture} - prop.visual_size = {x=0.3, y=0.3} - else - prop.visual = "wielditem" - prop.textures = {itemname} - prop.visual_size = {x=0.15, y=0.15} - end - self.object:set_properties(prop) + textures = {stack:get_name()} + }) + local def = stack:get_definition() + self.object:setyaw((def and def.type == "node") and 0 or math.pi * 0.25) end, - get_staticdata = function(self) - if self.start_pos==nil then return end - local velocity=self.object:getvelocity() - --self.object:setvelocity({x=0,y=0,z=0}) - self.object:setpos(self.start_pos) - return minetest.serialize({ - itemstring=self.itemstring, - velocity=velocity, - start_pos=self.start_pos - }) - end, - - on_activate = function(self, staticdata) - if staticdata=="" or staticdata==nil then return end - local item = minetest.deserialize(staticdata) - local stack = ItemStack(item.itemstring) - local itemtable = stack:to_table() - local itemname = nil - if itemtable then - itemname = stack:to_table().name + get_staticdata = luaentity.get_staticdata, + on_activate = function(self, staticdata) -- Legacy code, should be replaced later by luaentity.on_activate + if staticdata == "" or staticdata == nil then + return end - - if itemname then - self.start_pos=item.start_pos - self.object:setvelocity(item.velocity) - self.object:setacceleration({x=0, y=0, z=0}) - self.object:setpos(item.start_pos) - end - self:set_item(item.itemstring) - end, - - on_step = function(self, dtime) - if self.start_pos==nil then - local pos = self.object:getpos() - self.start_pos=roundpos(pos) - end - local pos = self.object:getpos() - local node = minetest.get_node(pos) - local meta = minetest.get_meta(pos) - tubelike=meta:get_int("tubelike") - local stack = ItemStack(self.itemstring) - local drop_pos=nil - - local velocity=self.object:getvelocity() - - if velocity==nil then return end - - local velocitycopy={x=velocity.x,y=velocity.y,z=velocity.z} - - local moved=false - local speed=math.abs(velocity.x+velocity.y+velocity.z) - local vel={x=velocity.x/speed,y=velocity.y/speed,z=velocity.z/speed, speed=speed} - - if math.abs(vel.x)==1 then - local next_node=math.abs(pos.x-self.start_pos.x) - if next_node >= 1 then - self.start_pos.x=self.start_pos.x+vel.x - moved=true - end - elseif math.abs(vel.y)==1 then - local next_node=math.abs(pos.y-self.start_pos.y) - if next_node >= 1 then - self.start_pos.y=self.start_pos.y+vel.y - moved=true - end - elseif math.abs(vel.z)==1 then - local next_node=math.abs(pos.z-self.start_pos.z) - if next_node >= 1 then - self.start_pos.z=self.start_pos.z+vel.z - moved=true - end - end - - local sposcopy={x=self.start_pos.x,y=self.start_pos.y,z=self.start_pos.z} - - node = minetest.get_node(self.start_pos) - if moved and minetest.get_item_group(node.name,"tubedevice_receiver")==1 then - local leftover = nil - if minetest.registered_nodes[node.name].tube and minetest.registered_nodes[node.name].tube.insert_object then - leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos,node,stack,vel) - else - leftover = stack - end - --drop_pos=minetest.find_node_near(self.start_pos,1,"air") - --if drop_pos and not leftover:is_empty() then minetest.item_drop(leftover,"",drop_pos) end - --self.object:remove() - if leftover:is_empty() then + if staticdata == "toremove" then self.object:remove() return end - velocity.x=-velocity.x - velocity.y=-velocity.y - velocity.z=-velocity.z - self.object:setvelocity(velocity) - self:set_item(leftover:to_string()) - return - end - - if moved then - if go_next (self.start_pos, velocity, stack) == 0 then - drop_pos=minetest.find_node_near({x=self.start_pos.x+velocity.x,y=self.start_pos.y+velocity.y,z=self.start_pos.z+velocity.z}, 1, "air") - if drop_pos then - minetest.item_drop(stack, "", drop_pos) - self.object:remove() - end - end - end - - if velocity.x~=velocitycopy.x or velocity.y~=velocitycopy.y or velocity.z~=velocitycopy.z or - self.start_pos.x~=sposcopy.x or self.start_pos.y~=sposcopy.y or self.start_pos.z~=sposcopy.z then - self.object:setpos(self.start_pos) - self.object:setvelocity(velocity) - end - -end + local item = minetest.deserialize(staticdata) + pipeworks.tube_inject_item(self.object:getpos(), item.start_pos, item.velocity, item.itemstring) + self.object:remove() + end, }) -if minetest.get_modpath("mesecons_mvps") ~= nil then - mesecon:register_mvps_unmov("pipeworks:tubed_item") - mesecon:register_on_mvps_move(function(moved_nodes) - local objects_to_move = {} - for _, n in ipairs(moved_nodes) do - local objects = minetest.get_objects_inside_radius(n.oldpos, 1) - for _, obj in ipairs(objects) do - local entity = obj:get_luaentity() - if entity and entity.name == "pipeworks:tubed_item" then - objects_to_move[#objects_to_move+1] = obj +minetest.register_entity("pipeworks:color_entity", { + initial_properties = { + hp_max = 1, + physical = false, + collisionbox = {0.1, 0.1, 0.1, 0.1, 0.1, 0.1}, + visual = "cube", + visual_size = {x = 3.5, y = 3.5, z = 3.5}, -- todo: find correct size + textures = {""}, + is_visible = false, + }, + + physical_state = false, + + from_data = function(self, color) + local t = "pipeworks_color_"..color..".png" + local prop = { + is_visible = true, + visual = "cube", + textures = {t, t, t, t, t, t} -- todo: textures + } + self.object:set_properties(prop) + end, + + get_staticdata = luaentity.get_staticdata, + on_activate = luaentity.on_activate, +}) + +luaentity.register_entity("pipeworks:tubed_item", { + itemstring = '', + item_entity = nil, + color_entity = nil, + color = nil, + start_pos = nil, + + set_item = function(self, item) + local itemstring = ItemStack(item):to_string() -- Accept any input format + if self.itemstring == itemstring then + return + end + if self.item_entity then + self:remove_attached_entity(self.item_entity) + end + self.itemstring = itemstring + self.item_entity = self:add_attached_entity("pipeworks:tubed_item", itemstring) + end, + + set_color = function(self, color) + if self.color == color then + return + end + self.color = color + if self.color_entity then + self:remove_attached_entity(self.color_entity) + end + if color then + self.color_entity = self:add_attached_entity("pipeworks:color_entity", color) + else + self.color_entity = nil + end + end, + + on_step = function(self, dtime) + if self.start_pos == nil then + local pos = self:getpos() + self.start_pos = vector.round(pos) + self:setpos(pos) + end + + local pos = self:getpos() + local stack = ItemStack(self.itemstring) + local drop_pos + + local velocity = self:getvelocity() + + local moved = false + local speed = math.abs(velocity.x + velocity.y + velocity.z) + if speed == 0 then + speed = 1 + moved = true + end + local vel = {x = velocity.x / speed, y = velocity.y / speed, z = velocity.z / speed, speed = speed} + + if vector.distance(pos, self.start_pos) >= 1 then + self.start_pos = vector.add(self.start_pos, vel) + moved = true + end + + minetest.load_position(self.start_pos) + local node = minetest.get_node(self.start_pos) + if moved and minetest.get_item_group(node.name, "tubedevice_receiver") == 1 then + local leftover + if minetest.registered_nodes[node.name].tube and minetest.registered_nodes[node.name].tube.insert_object then + leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos, node, stack, vel) + else + leftover = stack + end + if leftover:is_empty() then + self:remove() + return + end + velocity = vector.multiply(velocity, -1) + self:setvelocity(velocity) + self:set_item(leftover:to_string()) + return + end + + if moved then + local found_next, new_velocity = go_next(self.start_pos, velocity, stack) -- todo: color + if not found_next then + drop_pos = minetest.find_node_near(vector.add(self.start_pos, velocity), 1, "air") + if drop_pos then + minetest.item_drop(stack, "", drop_pos) + self:remove() + return end end + + if new_velocity and not vector.equals(velocity, new_velocity) then + self:setpos(self.start_pos) + self:setvelocity(new_velocity) + end end - if #objects_to_move > 0 then - local dir = vector.subtract(moved_nodes[1].pos, moved_nodes[1].oldpos) - for _, obj in ipairs(objects_to_move) do - local entity = obj:get_luaentity() - obj:setpos(vector.add(obj:getpos(), dir)) - entity.start_pos = vector.add(entity.start_pos, dir) + end +}) + +if minetest.get_modpath("mesecons_mvps") then + mesecon:register_mvps_unmov("pipeworks:tubed_item") + mesecon:register_mvps_unmov("pipeworks:color_entity") + mesecon:register_on_mvps_move(function(moved_nodes) + local moved = {} + for _, n in ipairs(moved_nodes) do + moved[minetest.hash_node_position(n.oldpos)] = vector.subtract(n.pos, n.oldpos) + end + for id, entity in pairs(luaentity.entities) do + if entity.name == "pipeworks:tubed_item" then + local pos = entity:getpos() + local rpos = vector.round(pos) + local dir = moved[minetest.hash_node_position(rpos)] + if dir then + entity:setpos(vector.add(pos, dir)) + entity.start_pos = vector.add(entity.start_pos, dir) + end end end end) diff --git a/mods/pipeworks/legacy.lua b/mods/pipeworks/legacy.lua new file mode 100644 index 0000000..84ae31d --- /dev/null +++ b/mods/pipeworks/legacy.lua @@ -0,0 +1,60 @@ + +if not minetest.get_modpath("auto_tree_tap") and + minetest.get_modpath("technic") then + + minetest.register_abm({ + nodenames = { "auto_tree_tap:off", "auto_tree_tap:on" }, + chance = 1, + interval = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("pick", 1) + inv:set_size("ghost_pick", 1) + inv:set_size("main", 100) + minetest.set_node(pos, {name = "pipeworks:nodebreaker_off", param2 = fdir}) + minetest.registered_nodes["pipeworks:nodebreaker_off"].on_punch(pos, node) + inv:set_stack("pick", 1, ItemStack("technic:treetap")) + end + }) + + minetest.register_node(":auto_tree_tap:off", { + description = "Auto-Tap", + tiles = {"pipeworks_nodebreaker_top_off.png","pipeworks_nodebreaker_bottom_off.png","pipeworks_nodebreaker_side2_off.png","pipeworks_nodebreaker_side1_off.png", + "pipeworks_nodebreaker_back.png","pipeworks_nodebreaker_front_off.png"}, + is_ground_content = true, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, not_in_creative_inventory=1 }, + mesecons= {effector={rules=pipeworks.rules_all,action_on=node_breaker_on, action_off=node_breaker_off}}, + sounds = default.node_sound_stone_defaults(), + tube = {connect_sides={back=1}}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("pick", 1) + inv:set_stack("pick", 1, ItemStack("default:pick_mese")) + end, + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + end, + after_dig_node = pipeworks.scan_for_tube_objects, + }) +end diff --git a/mods/pipeworks/luaentity.lua b/mods/pipeworks/luaentity.lua new file mode 100644 index 0000000..fe81cb3 --- /dev/null +++ b/mods/pipeworks/luaentity.lua @@ -0,0 +1,334 @@ +local max_entity_id = 1000000000000 -- If you need more, there's a problem with your code + +luaentity = {} + +luaentity.registered_entities = {} + +local filename = minetest.get_worldpath().."/luaentities" +local function read_file() + local f = io.open(filename, "r") + if f == nil then return {} end + local t = f:read("*all") + f:close() + if t == "" or t == nil then return {} end + return minetest.deserialize(t) +end + +local function write_file(tbl) + local f = io.open(filename, "w") + f:write(minetest.serialize(tbl)) + f:close() +end + +local function read_entities() + local t = read_file() + for _, entity in pairs(t) do + setmetatable(entity, luaentity.registered_entities[entity.name]) + end + return t +end + +local function write_entities() + for _, entity in pairs(luaentity.entities) do + setmetatable(entity, nil) + for _, attached in pairs(entity._attached_entities) do + if attached.entity then + attached.entity:remove() + attached.entity = nil + end + end + entity._attached_entities_master = nil + end + write_file(luaentity.entities) +end + +minetest.register_on_shutdown(write_entities) +luaentity.entities_index = 0 + +local function get_blockpos(pos) + return {x = math.floor(pos.x / 16), + y = math.floor(pos.y / 16), + z = math.floor(pos.z / 16)} +end + +local active_blocks = {} -- These only contain active blocks near players (i.e., not forceloaded ones) +local handle_active_blocks_step = 2 +local handle_active_blocks_timer = 0 +minetest.register_globalstep(function(dtime) + handle_active_blocks_timer = handle_active_blocks_timer + dtime + if handle_active_blocks_timer >= handle_active_blocks_step then + handle_active_blocks_timer = handle_active_blocks_timer - handle_active_blocks_step + local active_block_range = tonumber(minetest.setting_get("active_block_range")) + local new_active_blocks = {} + for _, player in ipairs(minetest.get_connected_players()) do + local blockpos = get_blockpos(player:getpos()) + local minp = vector.subtract(blockpos, active_block_range) + local maxp = vector.add(blockpos, active_block_range) + + for x = minp.x, maxp.x do + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + local pos = {x = x, y = y, z = z} + new_active_blocks[minetest.hash_node_position(pos)] = pos + end + end + end + end + active_blocks = new_active_blocks + -- todo: callbacks on block load/unload + end +end) + +local function is_active(pos) + return active_blocks[minetest.hash_node_position(get_blockpos(pos))] ~= nil +end + +local entitydef_default = { + _attach = function(self, attached, attach_to) + local attached_def = self._attached_entities[attached] + local attach_to_def = self._attached_entities[attach_to] + attached_def.entity:set_attach( + attach_to_def.entity, "", + vector.subtract(attached_def.offset, attach_to_def.offset), -- todo: Does not work because is object space + vector.new(0, 0, 0) + ) + end, + _set_master = function(self, index) + self._attached_entities_master = index + if not index then + return + end + local def = self._attached_entities[index] + if not def.entity then + return + end + def.entity:setpos(vector.add(self._pos, def.offset)) + def.entity:setvelocity(self._velocity) + def.entity:setacceleration(self._acceleration) + end, + _attach_all = function(self) + local master = self._attached_entities_master + if not master then + return + end + for id, entity in pairs(self._attached_entities) do + if id ~= master and entity.entity then + self:_attach(id, master) + end + end + end, + _detach_all = function(self) + local master = self._attached_entities_master + for id, entity in pairs(self._attached_entities) do + if id ~= master and entity.entity then + entity.entity:set_detach() + end + end + end, + _add_attached = function(self, index) + local entity = self._attached_entities[index] + if entity.entity then + return + end + local entity_pos = vector.add(self._pos, entity.offset) + if not is_active(entity_pos) then + return + end + local ent = minetest.add_entity(entity_pos, entity.name):get_luaentity() + ent:from_data(entity.data) + ent.parent_id = self._id + ent.attached_id = index + entity.entity = ent.object + local master = self._attached_entities_master + if master then + self:_attach(index, master) + else + self:_set_master(index) + end + end, + _remove_attached = function(self, index) + local master = self._attached_entities_master + local entity = self._attached_entities[index] + local ent = entity.entity + entity.entity = nil + if index == master then + self:_detach_all() + local newmaster + for id, attached in pairs(self._attached_entities) do + if id ~= master and attached.entity then + newmaster = id + break + end + end + self:_set_master(newmaster) + self:_attach_all() + elseif master and ent then + ent:set_detach() + end + if ent then + ent:remove() + end + end, + _add_loaded = function(self) + for id, _ in pairs(self._attached_entities) do + self:_add_attached(id) + end + end, + getid = function(self) + return self._id + end, + getpos = function(self) + return vector.new(self._pos) + end, + setpos = function(self, pos) + self._pos = vector.new(pos) + --for _, entity in pairs(self._attached_entities) do + -- if entity.entity then + -- entity.entity:setpos(vector.add(self._pos, entity.offset)) + -- end + --end + local master = self._attached_entities_master + if master then + local master_def = self._attached_entities[master] + master_def.entity:setpos(vector.add(self._pos, master_def.offset)) + end + end, + getvelocity = function(self) + return vector.new(self._velocity) + end, + setvelocity = function(self, velocity) + self._velocity = vector.new(velocity) + local master = self._attached_entities_master + if master then + self._attached_entities[master].entity:setvelocity(self._velocity) + end + end, + getacceleration = function(self) + return vector.new(self._acceleration) + end, + setacceleration = function(self, acceleration) + self._acceleration = vector.new(acceleration) + local master = self._attached_entities_master + if master then + self._attached_entities[master].entity:setacceleration(self._acceleration) + end + end, + remove = function(self) + self:_detach_all() + for _, entity in pairs(self._attached_entities) do + if entity.entity then + entity.entity:remove() + end + end + luaentity.entities[self._id] = nil + end, + add_attached_entity = function(self, name, data, offset) + local index = #self._attached_entities + 1 + self._attached_entities[index] = { + name = name, + data = data, + offset = vector.new(offset), + } + self:_add_attached(index) + return index + end, + remove_attached_entity = function(self, index) + self:_remove_attached(index) + self._attached_entities[index] = nil + end, +} + +function luaentity.register_entity(name, prototype) + -- name = check_modname_prefix(name) + prototype.name = name + setmetatable(prototype, {__index = entitydef_default}) + prototype.__index = prototype -- Make it possible to use it as metatable + luaentity.registered_entities[name] = prototype +end + +-- function luaentity.get_entity_definition(entity) +-- return luaentity.registered_entities[entity.name] +-- end + +function luaentity.add_entity(pos, name) + local index = luaentity.entities_index + while luaentity.entities[index] do + index = index + 1 + if index >= max_entity_id then + index = 0 + end + end + luaentity.entities_index = index + + local entity = { + name = name, + _id = index, + _pos = vector.new(pos), + _velocity = {x = 0, y = 0, z = 0}, + _acceleration = {x = 0, y = 0, z = 0}, + _attached_entities = {}, + } + + local prototype = luaentity.registered_entities[name] + setmetatable(entity, prototype) -- Default to prototype for other methods + luaentity.entities[index] = entity + + if entity.on_activate then + entity:on_activate() + end + return entity +end + +-- todo: check if remove in get_staticdata works +function luaentity.get_staticdata(self) + local parent = luaentity.entities[self.parent_id] + if parent and parent._remove_attached then + parent:_remove_attached(self.attached_id) + end + return "toremove" +end + +function luaentity.on_activate(self, staticdata) + if staticdata == "toremove" then + self.object:remove() + end +end + +function luaentity.get_objects_inside_radius(pos, radius) + local objects = {} + local index = 1 + for id, entity in pairs(luaentity.entities) do + if vector.distance(pos, entity:getpos()) <= radius then + objects[index] = entity + index = index + 1 + end + end +end + +minetest.register_globalstep(function(dtime) + if not luaentity.entities then + luaentity.entities = read_entities() + end + for id, entity in pairs(luaentity.entities) do + local master = entity._attached_entities_master + if master then + local master_def = entity._attached_entities[master] + local master_entity = master_def.entity + entity._pos = vector.subtract(master_entity:getpos(), master_def.offset) + entity._velocity = master_entity:getvelocity() + entity._acceleration = master_entity:getacceleration() + else + entity._pos = vector.add(vector.add( + entity._pos, + vector.multiply(entity._velocity, dtime)), + vector.multiply(entity._acceleration, 0.5 * dtime * dtime)) + entity._velocity = vector.add( + entity._velocity, + vector.multiply(entity._acceleration, dtime)) + end + entity:_add_loaded() + if entity.on_step then + entity:on_step(dtime) + end + end +end) diff --git a/mods/pipeworks/node_breaker.lua b/mods/pipeworks/node_breaker.lua deleted file mode 100644 index 17e0475..0000000 --- a/mods/pipeworks/node_breaker.lua +++ /dev/null @@ -1,281 +0,0 @@ - ---register aliases for when someone had technic installed, but then uninstalled it but not pipeworks -minetest.register_alias("technic:nodebreaker_off", "pipeworks:nodebreaker_off") -minetest.register_alias("technic:nodebreaker_on", "pipeworks:nodebreaker_on") -minetest.register_alias("technic:node_breaker_off", "pipeworks:nodebreaker_off") --old name -minetest.register_alias("technic:node_breaker_on", "pipeworks:nodebreaker_on") --old name - -minetest.register_craft({ - output = 'pipeworks:nodebreaker_off 1', - recipe = { - {'group:wood', 'default:pick_mese','group:wood'}, - {'default:stone', 'mesecons:piston','default:stone'}, - {'default:stone', 'mesecons:mesecon','default:stone'}, - } -}) - -local function swap_node(pos, name) - local node = minetest.get_node(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - ---define the functions from https://github.com/minetest/minetest/pull/834 while waiting for the devs to notice it -local function dir_to_facedir(dir, is6d) - --account for y if requested - if is6d and math.abs(dir.y) > math.abs(dir.x) and math.abs(dir.y) > math.abs(dir.z) then - - --from above - if dir.y < 0 then - if math.abs(dir.x) > math.abs(dir.z) then - if dir.x < 0 then - return 19 - else - return 13 - end - else - if dir.z < 0 then - return 10 - else - return 4 - end - end - - --from below - else - if math.abs(dir.x) > math.abs(dir.z) then - if dir.x < 0 then - return 15 - else - return 17 - end - else - if dir.z < 0 then - return 6 - else - return 8 - end - end - end - - --otherwise, place horizontally - elseif math.abs(dir.x) > math.abs(dir.z) then - if dir.x < 0 then - return 3 - else - return 1 - end - else - if dir.z < 0 then - return 2 - else - return 0 - end - end -end - -local function delay(x) - return (function() return x end) -end - -local function break_node (pos, facedir) - --locate the outgoing velocity, front, and back of the node via facedir_to_dir - if type(facedir) ~= "number" or facedir < 0 or facedir > 23 then return end - - local vel = minetest.facedir_to_dir(facedir); - local front = {x=pos.x - vel.x, y=pos.y - vel.y, z=pos.z - vel.z} - - local node = minetest.get_node(front) - if node.name == "air" or node.name == "ignore" then - return nil - elseif minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].liquidtype ~= "none" then - return nil - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_stack("pick", 1, ItemStack("default:pick_mese")) - local pitch - local yaw - if vel.z < 0 then - yaw = 0 - pitch = 0 - elseif vel.z > 0 then - yaw = math.pi - pitch = 0 - elseif vel.x < 0 then - yaw = 3*math.pi/2 - pitch = 0 - elseif vel.x > 0 then - yaw = math.pi/2 - pitch = 0 - elseif vel.y > 0 then - yaw = 0 - pitch = -math.pi/2 - else - yaw = 0 - pitch = math.pi/2 - end - local digger = { - get_inventory_formspec = delay(""), - get_look_dir = delay({x = -vel.x, y = -vel.y, z = -vel.z}), - get_look_pitch = delay(pitch), - get_look_yaw = delay(yaw), - get_player_control = delay({jump=false, right=false, left=false, LMB=false, RMB=false, sneak=false, aux1=false, down=false, up=false}), - get_player_control_bits = delay(0), - get_player_name = delay("node_breaker"), - is_player = delay(true), - set_inventory_formspec = delay(), - getpos = delay({x = pos.x, y = pos.y - 1.5, z = pos.z}), -- Player height - get_hp = delay(20), - get_inventory = delay(inv), - get_wielded_item = delay(ItemStack("default:pick_mese")), - get_wield_index = delay(1), - get_wield_list = delay("pick"), - moveto = delay(), - punch = delay(), - remove = delay(), - right_click = delay(), - setpos = delay(), - set_hp = delay(), - set_properties = delay(), - set_wielded_item = delay(), - set_animation = delay(), - set_attach = delay(), - set_detach = delay(), - set_bone_position = delay(), - } - - --check node to make sure it is diggable - local def = ItemStack({name=node.name}):get_definition() - if #def ~= 0 and not def.diggable or (def.can_dig and not def.can_dig(front, digger)) then --node is not diggable - return - end - - --handle node drops - local drops = minetest.get_node_drops(node.name, "default:pick_mese") - for _, dropped_item in ipairs(drops) do - local item1 = pipeworks.tube_item({x=pos.x, y=pos.y, z=pos.z}, dropped_item) - item1:get_luaentity().start_pos = {x=pos.x, y=pos.y, z=pos.z} - item1:setvelocity(vel) - item1:setacceleration({x=0, y=0, z=0}) - end - - local oldmetadata = nil - if def.after_dig_node then - oldmetadata = minetest.get_meta(front):to_table() - end - - minetest.remove_node(front) - - --handle post-digging callback - if def.after_dig_node then - -- Copy pos and node because callback can modify them - local pos_copy = {x=front.x, y=front.y, z=front.z} - local node_copy = {name=node.name, param1=node.param1, param2=node.param2} - def.after_dig_node(pos_copy, node_copy, oldmetadata, digger) - end - - --run digging event callbacks - for _, callback in ipairs(minetest.registered_on_dignodes) do - -- Copy pos and node because callback can modify them - local pos_copy = {x=front.x, y=front.y, z=front.z} - local node_copy = {name=node.name, param1=node.param1, param2=node.param2} - callback(pos_copy, node_copy, digger) - end -end - -local node_breaker_on = function(pos, node) - if node.name == "pipeworks:nodebreaker_off" then - swap_node(pos, "pipeworks:nodebreaker_on") - break_node(pos, node.param2) - nodeupdate(pos) - end -end - -local node_breaker_off = function(pos, node) - if node.name == "pipeworks:nodebreaker_on" then - swap_node(pos, "pipeworks:nodebreaker_off") - nodeupdate(pos) - end -end - -minetest.register_node("pipeworks:nodebreaker_off", { - description = "Node Breaker", - tile_images = {"pipeworks_nodebreaker_top_off.png","pipeworks_nodebreaker_bottom_off.png","pipeworks_nodebreaker_side2_off.png","pipeworks_nodebreaker_side1_off.png", - "pipeworks_nodebreaker_back.png","pipeworks_nodebreaker_front_off.png"}, - is_ground_content = true, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1}, - mesecons= {effector={rules=pipeworks.rules_all,action_on=node_breaker_on, action_off=node_breaker_off}}, - sounds = default.node_sound_stone_defaults(), - tube = {connect_sides={back=1}}, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("pick", 1) - inv:set_stack("pick", 1, ItemStack("default:pick_mese")) - end, - after_place_node = function (pos, placer) - pipeworks.scan_for_tube_objects(pos, placer) - local placer_pos = placer:getpos() - - --correct for the player's height - if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end - - --correct for 6d facedir - if placer_pos then - local dir = { - x = pos.x - placer_pos.x, - y = pos.y - placer_pos.y, - z = pos.z - placer_pos.z - } - local node = minetest.get_node(pos) - node.param2 = dir_to_facedir(dir, true) - minetest.set_node(pos, node) - minetest.log("action", "real (6d) facedir: " .. node.param2) - end - end, - after_dig_node = pipeworks.scan_for_tube_objects, -}) - -minetest.register_node("pipeworks:nodebreaker_on", { - description = "Node Breaker", - tile_images = {"pipeworks_nodebreaker_top_on.png","pipeworks_nodebreaker_bottom_on.png","pipeworks_nodebreaker_side2_on.png","pipeworks_nodebreaker_side1_on.png", - "pipeworks_nodebreaker_back.png","pipeworks_nodebreaker_front_on.png"}, - mesecons= {effector={rules=pipeworks.rules_all,action_on=node_breaker_on, action_off=node_breaker_off}}, - is_ground_content = true, - paramtype2 = "facedir", - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1,not_in_creative_inventory=1}, - sounds = default.node_sound_stone_defaults(), - tube = {connect_sides={back=1}}, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("pick", 1) - inv:set_stack("pick", 1, ItemStack("default:pick_mese")) - end, - after_place_node = function (pos, placer) - pipeworks.scan_for_tube_objects(pos, placer) - local placer_pos = placer:getpos() - - --correct for the player's height - if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end - - --correct for 6d facedir - if placer_pos then - local dir = { - x = pos.x - placer_pos.x, - y = pos.y - placer_pos.y, - z = pos.z - placer_pos.z - } - local node = minetest.get_node(pos) - node.param2 = dir_to_facedir(dir, true) - minetest.set_node(pos, node) - minetest.log("action", "real (6d) facedir: " .. node.param2) - end - end, - after_dig_node = pipeworks.scan_for_tube_objects, -}) diff --git a/mods/pipeworks/teleport_tube.lua b/mods/pipeworks/teleport_tube.lua index f57f55a..16985e2 100644 --- a/mods/pipeworks/teleport_tube.lua +++ b/mods/pipeworks/teleport_tube.lua @@ -3,10 +3,10 @@ local filename=minetest.get_worldpath() .. "/teleport_tubes" local function read_file() local f = io.open(filename, "r") - if f==nil then return {} end + if f == nil then return {} end local t = f:read("*all") f:close() - if t=="" or t==nil then return {} end + if t == "" or t == nil then return {} end return minetest.deserialize(t) end @@ -18,8 +18,8 @@ end local function update_pos_in_file(pos) local tbl=read_file() - for _,val in ipairs(tbl) do - if val.x==pos.x and val.y==pos.y and val.z==pos.z then + for _, val in ipairs(tbl) do + if val.x == pos.x and val.y == pos.y and val.z == pos.z then local meta = minetest.get_meta(val) val.channel = meta:get_string("channel") val.cr = meta:get_int("can_receive") @@ -40,34 +40,56 @@ local function add_tube_in_file(pos,channel, cr) end local function remove_tube_in_file(pos) - local tbl=read_file() - local newtbl={} - for _,val in ipairs(tbl) do - if val.x~=pos.x or val.y~=pos.y or val.z~=pos.z then - table.insert(newtbl,val) + local tbl = read_file() + local newtbl = {} + for _, val in ipairs(tbl) do + if val.x ~= pos.x or val.y ~= pos.y or val.z ~= pos.z then + table.insert(newtbl, val) end end write_file(newtbl) end +local function read_node_with_vm(pos) + local vm = VoxelManip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local data = vm:get_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + return minetest.get_name_from_content_id(data[area:index(pos.x, pos.y, pos.z)]) +end + local function get_tubes_in_file(pos,channel) - local tbl=read_file() - local newtbl={} - local changed=false - for _,val in ipairs(tbl) do - local node = minetest.get_node(val) + local tbl = read_file() + local newtbl = {} + local changed = false + for _, val in ipairs(tbl) do local meta = minetest.get_meta(val) - -- That shouldn't be needed anymore since the mvps callback, but we leave it nevertheless - if node.name~="ignore" and (val.channel~=meta:get_string("channel") or val.cr~=meta:get_int("can_receive")) then - val.channel=meta:get_string("channel") - val.cr=meta:get_int("can_receive") - changed=true - end - if val.cr==1 and val.channel==channel and (val.x~=pos.x or val.y~=pos.y or val.z~=pos.z) then - table.insert(newtbl,val) + local name = read_node_with_vm(val) + local is_loaded = (minetest.get_node_or_nil(val) ~= nil) + local is_teleport_tube = minetest.registered_nodes[name] and minetest.registered_nodes[name].is_teleport_tube + if is_teleport_tube then + if is_loaded and (val.channel ~= meta:get_string("channel") or val.cr ~= meta:get_int("can_receive")) then + val.channel = meta:get_string("channel") + val.cr = meta:get_int("can_receive") + changed = true + end + if val.cr == 1 and val.channel == channel and (val.x ~= pos.x or val.y ~= pos.y or val.z ~= pos.z) then + table.insert(newtbl, val) + end + else + val.to_remove = true + changed = true end end - if changed then write_file(tbl) end + if changed then + local updated = {} + for _, val in ipairs(tbl) do + if not val.to_remove then + table.insert(updated, val) + end + end + write_file(updated) + end return newtbl end @@ -80,8 +102,17 @@ local teleport_end_textures={"pipeworks_teleport_tube_end.png","pipeworks_telepo local teleport_short_texture="pipeworks_teleport_tube_short.png" local teleport_inv_texture="pipeworks_teleport_tube_inv.png" -pipeworks.register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube segment",teleport_plain_textures, +local function set_teleport_tube_formspec(meta) + local cr = meta:get_int("can_receive") ~= 0 + meta:set_string("formspec","size[10.5,1;]".. + "field[0,0.5;7,1;channel;Channel:;${channel}]".. + "button[8,0;2.5,1;"..(cr and "cr0" or "cr1")..";".. + (cr and "Send and Receive" or "Send only").."]") +end + +pipeworks.register_tube("pipeworks:teleport_tube","Teleporting Pneumatic Tube Segment",teleport_plain_textures, teleport_noctr_textures,teleport_end_textures,teleport_short_texture,teleport_inv_texture, { + is_teleport_tube = true, tube = { can_go = function(pos,node,velocity,stack) velocity.x = 0 @@ -102,10 +133,8 @@ pipeworks.register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube seg local meta = minetest.get_meta(pos) meta:set_string("channel","") meta:set_int("can_receive",1) - meta:set_string("formspec","size[9,1;]".. - "field[0,0.5;7,1;channel;Channel:;${channel}]".. - "button[8,0;1,1;bt;On]") add_tube_in_file(pos,"") + set_teleport_tube_formspec(meta) end, on_receive_fields = function(pos,formname,fields,sender) local meta = minetest.get_meta(pos) @@ -121,7 +150,7 @@ pipeworks.register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube seg return --channels starting with '[name];' can be used by other players, but cannot be received from - elseif mode == ";" and (meta:get_int("can_receive") ~= 0) == (fields["bt"] == nil) then + elseif mode == ";" and (fields.cr1 or (meta:get_int("can_receive") ~= 0 and not fields.cr0)) then minetest.chat_send_player(sender:get_player_name(), "Sorry, receiving from channel '"..fields.channel.."' is reserved for "..name) return end @@ -131,21 +160,11 @@ pipeworks.register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube seg if fields.channel==nil then fields.channel=meta:get_string("channel") end meta:set_string("channel",fields.channel) remove_tube_in_file(pos) + if fields.cr0 then meta:set_int("can_receive", 0) end + if fields.cr1 then meta:set_int("can_receive", 1) end local cr = meta:get_int("can_receive") - if fields["bt"] then - cr=1-cr - meta:set_int("can_receive",cr) - if cr==1 then - meta:set_string("formspec","size[9,1;]".. - "field[0,0.5;7,1;channel;Channel:;${channel}]".. - "button[8,0;1,1;bt;On]") - else - meta:set_string("formspec","size[9,1;]".. - "field[0,0.5;7,1;channel;Channel:;${channel}]".. - "button[8,0;1,1;bt;Off]") - end - end - add_tube_in_file(pos,fields.channel, cr) + add_tube_in_file(pos, fields.channel, meta:get_int("can_receive")) + set_teleport_tube_formspec(meta) end, on_destruct = function(pos) remove_tube_in_file(pos) diff --git a/mods/pipeworks/textures/homedecor_oil_extract.png b/mods/pipeworks/textures/homedecor_oil_extract.png new file mode 100644 index 0000000000000000000000000000000000000000..ef0f89699fbe1dad0134d01778bd33118c532f47 GIT binary patch literal 383 zcmV-_0f7FAP)-!Tb;D&<9*4wX`alK_}m1AtOW zm%h?2V+W@&f1OL`qGN&}c(3|*yWMr3=TRKTd3Zwa%x_W^?4}P2XC3OQ8GiO?Uj8K>`pC6a&DBKoCe$-$aq4`ymkT6f}t7oa-N` z?}GpW>DnnUv$i&W2*a~+qtRFZ`1txvS0Zu=paljQ9K`Rv{A0UL>?BHS$!U<i30S!4Zu#9U2mBZNV~&oF9&pZ|8iw)2^SoA`=U%;D zw}{BpT1%zWvpmngMp3lf+uK|G1qgy*v(xDeecwl=QbDy^g<%+|*Xyut8vu~!Ii}O; zvM7pVwOW0-yu5tZ>-EkE0CskE-mkB(qup*J%Q9G&g|)Rc*tQMMIi!@3Qo^?F3K3Np zV=v0(^79}FdS&G)(}&`T6-z4gj3<>GAO~ z;y8ws5=oL^I2>X;9zzHLtu<=38p`D|7-Lv07MM&X;^yY&BRf1id}*5It9HBHbQ}jl z2q>i>guwRpHXO$R5kYGW!!V$=MifQ3y1F{+cDs*B2=Ru9%#Do=FvbvuA@1((P_0%W zgaGFpT5D*nQ4|GMs}&lJ2Aa+0BLJY=+uOkNybo!bVry#)oO8r+j5JM=rYT0F(fxEH zf>H`Zgi@)5!C(-VPESw2?e6XtN~x~vy4?4DIF19?brFUkE-o%GpU+|2HnJ?kY&O%g z*-VFFs2F2IIyg9>e!u^Ee}DfoW9-xQ_4Pw3WyLUzB#z@>qtVE0G#Zji>0000R1 ziw6%Lyl~;d(W6ICpFaKW-Mj18uW#MD_3G8DU%q?+x|dzZSrX(I{2veah)0fr zRj{BMXh^ZAi(`ny<>UTt@&T_Oy2?1oZ~w@g7%!QkoY=d#Wzp$Py!X90x( diff --git a/mods/pipeworks/textures/homedecor_plastic_base_inv.png b/mods/pipeworks/textures/homedecor_plastic_base_inv.png deleted file mode 100644 index 1a01709c8e7495359d742a09633befc300e155a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 569 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU&(T0G|-o zj~_qIn>VkerRCnedyS2ar%s((ym)bQbMx`z#}_VKIC0{{Lx&Dcn>KC1f(4HrJ^J?T z+n+ywZrr#rfByWtckgy~cCJ~o=E;*MpFVwh`0(NH-@h+kzWnv;*ApjBT)TE{!h{LE zy}j$!t=qF_&+gs3U%Ytn^5x4*moDwww{OXkC3EJ?dGO%DqD6~NpFTZx>eT-J{vSVn z^z`&hnlx$Y(xnXz4X<9kx^Usb(W6Hgrm(diBAB z2VcK_-PF`{<;s=z_V!)7b{#u*th>AW`t|Euw{D$1d-l6`@7AteJ7vn0FJHb~y?Pbs zJAhy0)Q?>3_?GNBa~^_8zdQ_$KX?y*%Ii9M`-p;uDPBX0H0@^0c3m<=x@_ zU;7NC)_>>p*!pPiJrTA=e)r!>>=He3;d(Z++oK6nlXq;G!<=v~vs5l`i;2Tj`^Oe; zX^SRlYahJBpizA=PqW|R`RTWE8yDCu582hQWp>Lv8)19%AH8eW1Kr8s>FVdQ&MBb@ E0Hpw6^#A|> diff --git a/mods/pipeworks/textures/homedecor_plastic_sheeting.png b/mods/pipeworks/textures/homedecor_plastic_sheeting.png index 1386b1902cbc80f021b248a8fc0b63c907e50544..fea8773e9b23b3576cca0e126c3f484d7496c381 100644 GIT binary patch delta 365 zcmV-z0h0cy0sI1x7=H)`0000V^Z#K000BcuL_t(I%gvIpZo)7ShJT+ifoDMC1=x^~ zvM{Av`bdco3a`|y?2#&EV_?a~6EGysosTX}1O?HhQhUdJe+0RZoPzFaPMKLYByPA8Mes%_hiF$R~*1%J#8RYlV@4H*b`9>0M=R%5sWdz9sr04)>?e&QB+lx-Dz+-oib)FoO2kBMo?9V2$&hnJdDvN zfPB4P?`}lwA!dCw5gGFPH~!6cxn>KDAPmdN-nDM?uus#vFLc9`?BA}=Sn&Tn+5=K2moje z0PyCM3tf3J6aXfv004IYz_+E_C}$G^VD?N#Dh}1v)z#9{VltVGMx)c|tgfzZZf>rr zscCF%tgWrJ*=!bzMX%RuG@A1Aa;;WdRaMp2*5+_H}Sl{%e{$z&E67nhZliN#`(NW@~X^78UZOG~X*E0szuC@A1^xeNw_NF){&6-gwL z0tSQ0bU8Yo&ld;;xjET6xU6g(HlIdOs}y)VJ~bs7orp|KL}p<#1p;1rdU|qlaza8v zTwGjAN=kNic2-taPEHO6gTZ34Nl8g46e>5@)h3%$$SUHn6>_OssnBWE3Yk>M=ZQrE zjY_H4YGl$fnWT)%k*5DVxdqZ5b$}feq4!IR9j`WnvE1PDK<8iNWfc+y6yIw>Pm~n zY^rdn(P%ar^*XIeA=ha&a+!=qr84L=d|n=rKw!}6QBhG55fN}WJUTjh^XAPPH*Wm& z>66!Dc8_Z#v+`5W$oDY|+BL3V9uJcz1OU(fe70FYlhX$P+{TlT2wc=)=v9{J4h}Fq zs7&AyeoMj>-M+y#JjHKojuQLU4)cpnGaJR9IKlApzkM~^t zGjG#dZ&4_RFmg(zId-@>34Ji~;l!UIVidp1-w@t&esT5jcjJn?ZqJ%q&YY3%3TyH4 z2=n}Ul^v=5ic0l|olx>SPwqc{SV5h@c&u18)L3-I+JajUIF&p5OYqAFSAS7Uj%^$n zjfiT(c%QR=+;(RS1a(foJ3Ozazh+}Y|Fhse((;41cBBUyeoBTcn(|&Z!8kyCz4-Ly z*>5$+4sZpaCu&*jI9P$7=XbD+-E zkL=Rh1S=x$+E^+me9}m!eOJ13i@8K3*XdOs^fWNQE6W_S@o1bFjWuQ|!bYZWvug^JUig!=q0$6PJ za!_W}v*`^ir|kFJPn?Q-Z@6oZ^~88tYJV5^1CPq{ZY_lTQn~i$M?-^aPdyyi-~IFW z@YC)WmGz70#DpJCBRkH)Y;;cKi1hlUqwkLrN{_2}g)5h4`PzLwVQX$g5A@t$Cb=h` z@jLe9-n%);LBz-B_I}}w@#vr1#0;K^{qz2CbkFlP^NJ;FbAnjJBVM*c;<@g)gPY#| zF_wN&_hb6zSL;m^zBli;F0kFtfa4|yrq^Bhs5$ifrze!o98`*J$-OzIF`fr^|MuyJ zDPdQ1TgjwTLnc$#1+SFZ!@Z8ayU8zyO}9oJjg7Lux{i*@Bp(#|PDJsDPVGM&1FPHD zJ`?*luOGcMQvLqI-d(DXXLn$Fio24Yg0=bC=O-fyRIgq|j;d!qd>#97`maff`okp# zB%A9i4~sjnFK!P(e{ymr?dC*mhfHyOmt)^LkNp>BPr4t#kA-6LX5*yzh+of9(pKIS zo#D(H9!hB~VdgFi*B9(uMfaI{G&&#kV_SYsHoC*HFk@L|W2d`M1RDQCz?G8mi+Il) zD^W#OqF>e79{+>uyz6kBSh8@9{*LPnKt!lq5rZZwfYSv9E&yQA@b#h4$WT}~E_^*476FH?4~B-r sq0nzy<4*mHP+ZDjGiCoGtb=ceg2Tf9Pmm#}FS-ao5^4*wJD#fl2QuV#Y5)KL literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_dispenser_bottom.png b/mods/pipeworks/textures/pipeworks_dispenser_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..35416de2dc966f64de118ccdd6d211b6fc6a2dfb GIT binary patch literal 4508 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%0Dy?KRyv>0 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 FV1m~oj?e%A literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_dispenser_side2.png b/mods/pipeworks/textures/pipeworks_dispenser_side2.png new file mode 100644 index 0000000000000000000000000000000000000000..8f306b281707b44d5079d66e5b1a0168487e7fbc GIT binary patch literal 4518 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 Ef(t{3+W-In literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_dispenser_top.png b/mods/pipeworks/textures/pipeworks_dispenser_top.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6f9d0e7bf56b7c262c0d383357967d9e87bbc7 GIT binary patch literal 4501 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 literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_trashcan_bottom.png b/mods/pipeworks/textures/pipeworks_trashcan_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..a50c7892d6e61aeeb8c33a178fca308893483a33 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar`&Kb4+VL)w5|_xN6>F zD5)23bH0J6;H05p07n3i!*)?=hw#HoR_AwIf4Rft@E1cxZUyEPJ3Gr`kB|5LNngOQ z;Q@DU4udieho*vx``wI`gahwcbBaXRmE4@1zNstPbuqpWdLdPKa-vA@u3v2hXANd? i#xg24tZRFe!NTyi%-j6pTSbs#7(8A5T-G@yGywoJ0zhd1 literal 0 HcmV?d00001 diff --git a/mods/pipeworks/textures/pipeworks_trashcan_side.png b/mods/pipeworks/textures/pipeworks_trashcan_side.png new file mode 100644 index 0000000000000000000000000000000000000000..7b081bfa2e05fa8408aa666cfae54fdf1ba21b59 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`+MX_sAr`&Kb4+VL)w5|_xN6>F xD5)23bH0J6;H05p0EZi|glWQ+hJ#5A3}1e7JbuOKG8d?g!PC{xWt~$(69B@B9IgNW literal 0 HcmV?d00001 diff --git a/mods/pipeworks/trashcan.lua b/mods/pipeworks/trashcan.lua new file mode 100644 index 0000000..fdec79f --- /dev/null +++ b/mods/pipeworks/trashcan.lua @@ -0,0 +1,49 @@ +minetest.register_node("pipeworks:trashcan", { + description = "Trash Can", + drawtype = "normal", + tiles = { + "pipeworks_trashcan_bottom.png", + "pipeworks_trashcan_bottom.png", + "pipeworks_trashcan_side.png", + "pipeworks_trashcan_side.png", + "pipeworks_trashcan_side.png", + "pipeworks_trashcan_side.png", + }, + groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1}, + tube = { + insert_object = function(pos, node, stack, direction) + return ItemStack("") + end, + connect_sides = {left = 1, right = 1, front = 1, back = 1, top = 1, bottom = 1}, + priority = 1, -- Lower than anything else + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "size[8,7]".. + "item_image[0,0;1,1;pipeworks:trashcan]".. + "label[1,0;Trash Can]".. + "list[current_name;trash;3.5,1;1,1;]".. + "list[current_player;main;0,3;8,4;]") + meta:set_string("infotext", "Trash Can") + meta:get_inventory():set_size("trash", 1) + end, + after_place_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.get_meta(pos):get_inventory():set_stack(listname, index, ItemStack("")) + end, +}) + +minetest.register_craft({ + output = "pipeworks:trashcan", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:steel_ingot", "", "default:steel_ingot" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, + }, +}) diff --git a/mods/pipeworks/tubes.lua b/mods/pipeworks/tubes.lua index 5e6ca4f..2822a10 100644 --- a/mods/pipeworks/tubes.lua +++ b/mods/pipeworks/tubes.lua @@ -20,7 +20,7 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e end for _, v in ipairs(connects) do - pipeworks.add_node_box(outboxes, pipeworks.tube_boxes[v]) + table.extend(outboxes, pipeworks.tube_boxes[v]) table.insert(outsel, pipeworks.tube_selectboxes[v]) outimgs[vti[v]] = noctrs[v] end @@ -31,13 +31,13 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e outimgs[vti[v]] = ends[v] end - local tgroups = {snappy = 3, tube = 1, not_in_creative_inventory = 1} + local tgroups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory = 1} local tubedesc = desc.." "..dump(connects).."... You hacker, you." local iimg = plain[1] local wscale = {x = 1, y = 1, z = 1} if #connects == 0 then - tgroups = {snappy = 3, tube = 1} + tgroups = {snappy = 3, tube = 1, tubedevice = 1} tubedesc = desc iimg=inv outimgs = { @@ -50,7 +50,8 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e wscale = {x = 1, y = 1, z = 0.01} end - table.insert(pipeworks.tubenodes, name.."_"..tname) + local rname = name.."_"..tname + table.insert(pipeworks.tubenodes, rname) local nodedef = { description = tubedesc, @@ -62,7 +63,7 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e wield_scale = wscale, paramtype = "light", selection_box = { - type = "fixed", + type = "fixed", fixed = outsel }, node_box = { @@ -77,26 +78,22 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e style = style, drop = name.."_"..dropname, tubelike = 1, - tube = {connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1}}, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_int("tubelike", 1) - if minetest.registered_nodes[name.."_"..tname].on_construct_ then - minetest.registered_nodes[name.."_"..tname].on_construct_(pos) - end - end, - after_place_node = function(pos) + tube = { + connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1}, + priority = 50 + }, + --[[after_place_node = function(pos) pipeworks.scan_for_tube_objects(pos) - if minetest.registered_nodes[name.."_"..tname].after_place_node_ then - minetest.registered_nodes[name.."_"..tname].after_place_node_(pos) + if minetest.registered_nodes[rname].after_place_node_ then + minetest.registered_nodes[rname].after_place_node_(pos) end end, after_dig_node = function(pos) pipeworks.scan_for_tube_objects(pos) - if minetest.registered_nodes[name.."_"..tname].after_dig_node_ then - minetest.registered_nodes[name.."_"..tname].after_dig_node_(pos) + if minetest.registered_nodes[rname].after_dig_node_ then + minetest.registered_nodes[rname].after_dig_node_(pos) end - end + end]] } if style == "6d" then nodedef.paramtype2 = "facedir" @@ -105,9 +102,9 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e if special == nil then special = {} end for key, value in pairs(special) do - if key == "on_construct" or key == "after_dig_node" or key == "after_place_node" then - nodedef[key.."_"] = value - elseif key == "groups" then + --if key == "after_dig_node" or key == "after_place_node" then + -- nodedef[key.."_"] = value + if key == "groups" then for group, val in pairs(value) do nodedef.groups[group] = val end @@ -115,19 +112,12 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e for key, val in pairs(value) do nodedef.tube[key] = val end - elseif type(value) == "table" then - nodedef[key] = pipeworks.replace_name(value, "#id", tname) - elseif type(value) == "string" then - nodedef[key] = string.gsub(value, "#id", tname) else - nodedef[key] = value + nodedef[key] = table.recursive_replace(value, "#id", tname) end end - local prefix = ":" - if string.find(name, "pipeworks:") then prefix = "" end - - minetest.register_node(prefix..name.."_"..tname, nodedef) + minetest.register_node(rname, nodedef) end pipeworks.register_tube = function(name, desc, plain, noctrs, ends, short, inv, special, old_registration) @@ -182,21 +172,17 @@ pipeworks.register_tube = function(name, desc, plain, noctrs, ends, short, inv, paramtype = "light", sunlight_propagates = true, description = "Pneumatic tube segment (legacy)", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_int("tubelike", 1) - end, - after_place_node = function(pos) + --[[after_place_node = function(pos) pipeworks.scan_for_tube_objects(pos) if minetest.registered_nodes[name.."_1"].after_place_node_ then minetest.registered_nodes[name.."_1"].after_place_node_(pos) end - end, - groups = {not_in_creative_inventory = 1, tube_to_update = 1}, + end,]] + groups = {not_in_creative_inventory = 1, tube_to_update = 1, tube = 1}, tube = {connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1}}, drop = name.."_1", }) - table.insert(pipeworks.tubenodes,cname) + table.insert(pipeworks.tubenodes, cname) for xm = 0, 1 do for xp = 0, 1 do for ym = 0, 1 do @@ -221,8 +207,8 @@ if REGISTER_COMPATIBILITY then interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - local minp = {x = pos.x-1, y = pos.y-1, z = pos.z-1} - local maxp = {x = pos.x+1, y = pos.y+1, z = pos.z+1} + local minp = vector.subtract(pos, 1) + local maxp = vector.add(pos, 1) if table.getn(minetest.find_nodes_in_area(minp, maxp, "ignore")) == 0 then pipeworks.scan_for_tube_objects(pos) end @@ -252,7 +238,40 @@ if pipeworks.enable_mese_tube then "pipeworks_mese_tube_end.png", "pipeworks_mese_tube_end.png", "pipeworks_mese_tube_end.png"} local mese_short_texture = "pipeworks_mese_tube_short.png" local mese_inv_texture = "pipeworks_mese_tube_inv.png" - pipeworks.register_tube("pipeworks:mese_tube", "Mese pneumatic tube segment", mese_plain_textures, mese_noctr_textures, + local function update_formspec(pos) + local meta = minetest.get_meta(pos) + local old_formspec = meta:get_string("formspec") + if string.find(old_formspec, "button1") then -- Old version + local inv = meta:get_inventory() + for i = 1, 6 do + for _, stack in ipairs(inv:get_list("line"..i)) do + minetest.item_drop(stack, "", pos) + end + end + end + meta:set_string("formspec", + "size[8,11]".. + "list[current_name;line1;1,0;6,1;]".. + "list[current_name;line2;1,1;6,1;]".. + "list[current_name;line3;1,2;6,1;]".. + "list[current_name;line4;1,3;6,1;]".. + "list[current_name;line5;1,4;6,1;]".. + "list[current_name;line6;1,5;6,1;]".. + "image[0,0;1,1;pipeworks_white.png]".. + "image[0,1;1,1;pipeworks_black.png]".. + "image[0,2;1,1;pipeworks_green.png]".. + "image[0,3;1,1;pipeworks_yellow.png]".. + "image[0,4;1,1;pipeworks_blue.png]".. + "image[0,5;1,1;pipeworks_red.png]".. + fs_helpers.cycling_button(meta, "button[7,0;1,1", "l1s", {"Off", "On"}).. + fs_helpers.cycling_button(meta, "button[7,1;1,1", "l2s", {"Off", "On"}).. + fs_helpers.cycling_button(meta, "button[7,2;1,1", "l3s", {"Off", "On"}).. + fs_helpers.cycling_button(meta, "button[7,3;1,1", "l4s", {"Off", "On"}).. + fs_helpers.cycling_button(meta, "button[7,4;1,1", "l5s", {"Off", "On"}).. + fs_helpers.cycling_button(meta, "button[7,5;1,1", "l6s", {"Off", "On"}).. + "list[current_player;main;0,7;8,4;]") + end + pipeworks.register_tube("pipeworks:mese_tube", "Sorting Pneumatic Tube Segment", mese_plain_textures, mese_noctr_textures, mese_end_textures, mese_short_texture, mese_inv_texture, {tube = {can_go = function(pos, node, velocity, stack) local tbl = {} @@ -266,6 +285,7 @@ if pipeworks.enable_mese_tube then if st:get_name() == name then found = true table.insert(tbl, vect) + break end end end @@ -288,68 +308,40 @@ if pipeworks.enable_mese_tube then meta:set_int("l"..tostring(i).."s", 1) inv:set_size("line"..tostring(i), 6*1) end - meta:set_string("formspec", - "size[8,11]".. - "list[current_name;line1;1,0;6,1;]".. - "list[current_name;line2;1,1;6,1;]".. - "list[current_name;line3;1,2;6,1;]".. - "list[current_name;line4;1,3;6,1;]".. - "list[current_name;line5;1,4;6,1;]".. - "list[current_name;line6;1,5;6,1;]".. - "image[0,0;1,1;pipeworks_white.png]".. - "image[0,1;1,1;pipeworks_black.png]".. - "image[0,2;1,1;pipeworks_green.png]".. - "image[0,3;1,1;pipeworks_yellow.png]".. - "image[0,4;1,1;pipeworks_blue.png]".. - "image[0,5;1,1;pipeworks_red.png]".. - "button[7,0;1,1;button1;On]".. - "button[7,1;1,1;button2;On]".. - "button[7,2;1,1;button3;On]".. - "button[7,3;1,1;button4;On]".. - "button[7,4;1,1;button5;On]".. - "button[7,5;1,1;button6;On]".. - "list[current_player;main;0,7;8,4;]") + update_formspec(pos) meta:set_string("infotext", "Mese pneumatic tube") end, + on_punch = update_formspec, on_receive_fields = function(pos, formname, fields, sender) - local meta = minetest.get_meta(pos) - local i - if fields.quit then return end - for key, _ in pairs(fields) do i = key end - if i == nil then return end - i = string.sub(i,-1) - newstate = 1 - meta:get_int("l"..i.."s") - meta:set_int("l"..i.."s",newstate) - local frm = "size[8,11]".. - "list[current_name;line1;1,0;6,1;]".. - "list[current_name;line2;1,1;6,1;]".. - "list[current_name;line3;1,2;6,1;]".. - "list[current_name;line4;1,3;6,1;]".. - "list[current_name;line5;1,4;6,1;]".. - "list[current_name;line6;1,5;6,1;]".. - "image[0,0;1,1;pipeworks_white.png]".. - "image[0,1;1,1;pipeworks_black.png]".. - "image[0,2;1,1;pipeworks_green.png]".. - "image[0,3;1,1;pipeworks_yellow.png]".. - "image[0,4;1,1;pipeworks_blue.png]".. - "image[0,5;1,1;pipeworks_red.png]" - for i = 1, 6 do - local st = meta:get_int("l"..tostring(i).."s") - if st == 0 then - frm = frm.."button[7,"..tostring(i-1)..";1,1;button"..tostring(i)..";Off]" - else - frm = frm.."button[7,"..tostring(i-1)..";1,1;button"..tostring(i)..";On]" - end - end - frm = frm.."list[current_player;main;0,7;8,4;]" - meta:set_string("formspec", frm) + fs_helpers.on_receive_fields(pos, fields) + update_formspec(pos) end, can_dig = function(pos, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() return (inv:is_empty("line1") and inv:is_empty("line2") and inv:is_empty("line3") and inv:is_empty("line4") and inv:is_empty("line5") and inv:is_empty("line6")) - end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + update_formspec(pos) -- For old tubes + local inv = minetest.get_meta(pos):get_inventory() + local stack_copy = ItemStack(stack) + stack_copy:set_count(1) + inv:set_stack(listname, index, stack_copy) + return 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + update_formspec(pos) -- For old tubes + local inv = minetest.get_meta(pos):get_inventory() + inv:set_stack(listname, index, ItemStack("")) + return 0 + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + update_formspec(pos) -- For old tubes + local inv = minetest.get_meta(pos):get_inventory() + inv:set_stack(from_list, from_index, ItemStack("")) + return 0 + end, }, true) -- Must use old tubes, since the textures are rotated with 6d ones end @@ -357,14 +349,16 @@ if pipeworks.enable_detector_tube then local detector_plain_textures = {"pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png"} local detector_inv_texture = "pipeworks_detector_tube_inv.png" - pipeworks.register_tube("pipeworks:detector_tube_on", "Detector tube segment on (you hacker you)", detector_plain_textures, noctr_textures, + local detector_tube_step = 2 * tonumber(minetest.setting_get("dedicated_server_step")) + pipeworks.register_tube("pipeworks:detector_tube_on", "Detecting Pneumatic Tube Segment on (you hacker you)", detector_plain_textures, noctr_textures, end_textures, short_texture, detector_inv_texture, {tube = {can_go = function(pos, node, velocity, stack) local meta = minetest.get_meta(pos) local name = minetest.get_node(pos).name local nitems = meta:get_int("nitems")+1 meta:set_int("nitems", nitems) - minetest.after(0.1, minetest.registered_nodes[name].item_exit, pos) + local saved_pos = vector.new(pos) + minetest.after(detector_tube_step, minetest.registered_nodes[name].item_exit, saved_pos) return pipeworks.notvel(pipeworks.meseadjlist,velocity) end}, groups = {mesecon = 2, not_in_creative_inventory = 1}, @@ -388,9 +382,12 @@ if pipeworks.enable_detector_tube then local meta = minetest.get_meta(pos) meta:set_int("nitems", 1) local name = minetest.get_node(pos).name - minetest.after(0.1, minetest.registered_nodes[name].item_exit,pos) - end}) - pipeworks.register_tube("pipeworks:detector_tube_off", "Detector tube segment", detector_plain_textures, noctr_textures, + local saved_pos = vector.new(pos) + minetest.after(detector_tube_step, minetest.registered_nodes[name].item_exit, saved_pos) + + end + }) + pipeworks.register_tube("pipeworks:detector_tube_off", "Detecting Pneumatic Tube Segment", detector_plain_textures, noctr_textures, end_textures, short_texture, detector_inv_texture, {tube = {can_go = function(pos, node, velocity, stack) local node = minetest.get_node(pos) @@ -423,7 +420,7 @@ if pipeworks.enable_conductor_tube then local conductor_on_end_textures = {"pipeworks_conductor_tube_on_end.png", "pipeworks_conductor_tube_on_end.png", "pipeworks_conductor_tube_on_end.png", "pipeworks_conductor_tube_on_end.png", "pipeworks_conductor_tube_on_end.png", "pipeworks_conductor_tube_on_end.png"} - pipeworks.register_tube("pipeworks:conductor_tube_off", "Conductor tube segment", conductor_plain_textures, conductor_noctr_textures, + pipeworks.register_tube("pipeworks:conductor_tube_off", "Conducting Pneumatic Tube Segment", conductor_plain_textures, conductor_noctr_textures, conductor_end_textures, conductor_short_texture, conductor_inv_texture, {groups = {mesecon = 2}, mesecons = {conductor = {state = "off", @@ -431,7 +428,7 @@ if pipeworks.enable_conductor_tube then onstate = "pipeworks:conductor_tube_on_#id"}} }) - pipeworks.register_tube("pipeworks:conductor_tube_on", "Conductor tube segment on (you hacker you)", conductor_on_plain_textures, conductor_on_noctr_textures, + pipeworks.register_tube("pipeworks:conductor_tube_on", "Conducting Pneumatic Tube Segment on (you hacker you)", conductor_on_plain_textures, conductor_on_noctr_textures, conductor_on_end_textures, conductor_short_texture, conductor_inv_texture, {groups = {mesecon = 2, not_in_creative_inventory = 1}, drop = "pipeworks:conductor_tube_off_1", @@ -451,7 +448,7 @@ if pipeworks.enable_accelerator_tube then local accelerator_short_texture = "pipeworks_accelerator_tube_short.png" local accelerator_inv_texture = "pipeworks_accelerator_tube_inv.png" - pipeworks.register_tube("pipeworks:accelerator_tube", "Accelerator pneumatic tube segment", accelerator_plain_textures, + pipeworks.register_tube("pipeworks:accelerator_tube", "Accelerating Pneumatic Tube Segment", accelerator_plain_textures, accelerator_noctr_textures, accelerator_end_textures, accelerator_short_texture, accelerator_inv_texture, {tube = {can_go = function(pos, node, velocity, stack) velocity.speed = velocity.speed+1 @@ -461,7 +458,6 @@ if pipeworks.enable_accelerator_tube then end if pipeworks.enable_crossing_tube then - -- FIXME: The textures are not the correct ones local crossing_noctr_textures = {"pipeworks_crossing_tube_noctr.png", "pipeworks_crossing_tube_noctr.png", "pipeworks_crossing_tube_noctr.png", "pipeworks_crossing_tube_noctr.png", "pipeworks_crossing_tube_noctr.png", "pipeworks_crossing_tube_noctr.png"} local crossing_plain_textures = {"pipeworks_crossing_tube_plain.png" ,"pipeworks_crossing_tube_plain.png", "pipeworks_crossing_tube_plain.png", @@ -471,7 +467,7 @@ if pipeworks.enable_crossing_tube then local crossing_short_texture = "pipeworks_crossing_tube_short.png" local crossing_inv_texture = "pipeworks_crossing_tube_inv.png" - pipeworks.register_tube("pipeworks:crossing_tube", "Crossing tube segment", crossing_plain_textures, + pipeworks.register_tube("pipeworks:crossing_tube", "Crossing Pneumatic Tube Segment", crossing_plain_textures, crossing_noctr_textures, crossing_end_textures, crossing_short_texture, crossing_inv_texture, {tube = {can_go = function(pos, node, velocity, stack) return {velocity} @@ -489,7 +485,7 @@ if pipeworks.enable_sand_tube then local sand_short_texture = "pipeworks_sand_tube_short.png" local sand_inv_texture = "pipeworks_sand_tube_inv.png" - pipeworks.register_tube("pipeworks:sand_tube", "Sand pneumatic tube segment", sand_plain_textures, sand_noctr_textures, sand_end_textures, + pipeworks.register_tube("pipeworks:sand_tube", "Vacuuming Pneumatic Tube Segment", sand_plain_textures, sand_noctr_textures, sand_end_textures, sand_short_texture, sand_inv_texture, {groups = {sand_tube = 1}}) @@ -500,10 +496,7 @@ if pipeworks.enable_sand_tube then for _, object in ipairs(minetest.get_objects_inside_radius(pos, 2)) do if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then if object:get_luaentity().itemstring ~= "" then - local titem = pipeworks.tube_item(pos,object:get_luaentity().itemstring) - titem:get_luaentity().start_pos = {x = pos.x, y = pos.y-1, z = pos.z} - titem:setvelocity({x = 0.01, y = 1, z = -0.01}) - titem:setacceleration({x = 0, y = 0, z = 0}) + pipeworks.tube_inject_item(pos, pos, vector.new(0, 0, 0), object:get_luaentity().itemstring) end object:get_luaentity().itemstring = "" object:remove() @@ -523,7 +516,7 @@ if pipeworks.enable_mese_sand_tube then local mese_sand_short_texture = "pipeworks_mese_sand_tube_short.png" local mese_sand_inv_texture = "pipeworks_mese_sand_tube_inv.png" - pipeworks.register_tube("pipeworks:mese_sand_tube", "Mese sand pneumatic tube segment", mese_sand_plain_textures, mese_sand_noctr_textures, + pipeworks.register_tube("pipeworks:mese_sand_tube", "Adjustable Vacuuming Pneumatic Tube Segment", mese_sand_plain_textures, mese_sand_noctr_textures, mese_sand_end_textures, mese_sand_short_texture,mese_sand_inv_texture, {groups = {mese_sand_tube = 1}, on_construct = function(pos) @@ -532,7 +525,7 @@ if pipeworks.enable_mese_sand_tube then meta:set_string("formspec", "size[2,1]".. "field[.5,.5;1.5,1;dist;distance;${dist}]") - meta:set_string("infotext", "Mese sand pneumatic tube") + meta:set_string("infotext", "Adjustable Vacuuming Pneumatic Tube Segment") end, on_receive_fields = function(pos,formname,fields,sender) local meta = minetest.env:get_meta(pos) @@ -563,10 +556,7 @@ if pipeworks.enable_mese_sand_tube then for _,object in ipairs(get_objects_with_square_radius(pos, minetest.env:get_meta(pos):get_int("dist"))) do if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then if object:get_luaentity().itemstring ~= "" then - local titem = pipeworks.tube_item(pos, object:get_luaentity().itemstring) - titem:get_luaentity().start_pos = {x = pos.x, y = pos.y-1, z = pos.z} - titem:setvelocity({x = 0.01, y = 1, z = -0.01}) - titem:setacceleration({x = 0, y = 0, z = 0}) + pipeworks.tube_inject_item(pos, pos, vector.new(0, 0, 0), object:get_luaentity().itemstring) end object:get_luaentity().itemstring = "" object:remove() @@ -576,59 +566,29 @@ if pipeworks.enable_mese_sand_tube then }) end -local function facedir_to_right_dir(facedir) - - --find the other directions - local backdir = minetest.facedir_to_dir(facedir) - local topdir = ({[0] = {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(facedir/4)] - - --return a cross product - return {x = topdir.y*backdir.z - backdir.y*topdir.z, - y = topdir.z*backdir.x - backdir.z*topdir.x, - z = topdir.x*backdir.y - backdir.x*topdir.y} -end - if pipeworks.enable_one_way_tube then minetest.register_node("pipeworks:one_way_tube", { - description = "One way tube", - tiles = {"pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_output.png", - "pipeworks_one_way_tube_input.png", "pipeworks_one_way_tube_side.png", "pipeworks_one_way_tube_top.png"}, - paramtype2 = "facedir", - drawtype = "nodebox", - paramtype = "light", - node_box = {type = "fixed", - fixed = {{-1/2, -9/64, -9/64, 1/2, 9/64, 9/64}}}, - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1}, - legacy_facedir_simple = true, - sounds = default.node_sound_wood_defaults(), - after_place_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end, - after_dig_node = function(pos) - pipeworks.scan_for_tube_objects(pos) - end, - tube = {connect_sides = {left = 1, right = 1}, - can_go = function(pos, node, velocity, stack) - return velocity - end, - insert_object = function(pos, node, stack, direction) - item1 = pipeworks.tube_item(pos, stack) - item1:get_luaentity().start_pos = pos - item1:setvelocity({x = direction.x*direction.speed, y = direction.y*direction.speed, z = direction.z*direction.speed}) - item1:setacceleration({x = 0, y = 0, z = 0}) - return ItemStack("") - end, - can_insert = function(pos, node, stack, direction) - local dir = facedir_to_right_dir(node.param2) - if dir.x == direction.x and dir.y == direction.y and dir.z == direction.z then - return true - end - return false - end}, + description = "One way tube", + tiles = {"pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_output.png", + "pipeworks_one_way_tube_input.png", "pipeworks_one_way_tube_side.png", "pipeworks_one_way_tube_top.png"}, + paramtype2 = "facedir", + drawtype = "nodebox", + paramtype = "light", + node_box = {type = "fixed", + fixed = {{-1/2, -9/64, -9/64, 1/2, 9/64, 9/64}}}, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + tube = { + connect_sides = {left = 1, right = 1}, + can_go = function(pos, node, velocity, stack) + return {velocity} + end, + can_insert = function(pos, node, stack, direction) + local dir = minetest.facedir_to_right_dir(node.param2) + return vector.equals(dir, direction) + end, + priority = 75 -- Higher than normal tubes, but lower than receivers + }, }) end diff --git a/mods/pipeworks/wielder.lua b/mods/pipeworks/wielder.lua new file mode 100644 index 0000000..3ce73f6 --- /dev/null +++ b/mods/pipeworks/wielder.lua @@ -0,0 +1,423 @@ +local assumed_eye_pos = vector.new(0, 1.5, 0) + +local function vector_copy(v) + return { x = v.x, y = v.y, z = v.z } +end + +local function delay(x) + return (function() return x end) +end + +local function set_wielder_formspec(data, meta) + meta:set_string("formspec", + "invsize[8,"..(6+data.wield_inv_height)..";]".. + "item_image[0,0;1,1;"..data.name_base.."_off]".. + "label[1,0;"..minetest.formspec_escape(data.description).."]".. + "list[current_name;"..minetest.formspec_escape(data.wield_inv_name)..";"..((8-data.wield_inv_width)*0.5)..",1;"..data.wield_inv_width..","..data.wield_inv_height..";]".. + "list[current_player;main;0,"..(2+data.wield_inv_height)..";8,4;]") + meta:set_string("infotext", data.description) +end + +local function wielder_on(data, wielder_pos, wielder_node) + data.fixup_node(wielder_pos, wielder_node) + if wielder_node.name ~= data.name_base.."_off" then return end + wielder_node.name = data.name_base.."_on" + minetest.swap_node(wielder_pos, wielder_node) + nodeupdate(wielder_pos) + local wielder_meta = minetest.get_meta(wielder_pos) + local inv = wielder_meta:get_inventory() + local wield_inv_name = data.wield_inv_name + local wieldindex, wieldstack + for i, stack in ipairs(inv:get_list(wield_inv_name)) do + if not stack:is_empty() then + wieldindex = i + wieldstack = stack + break + end + end + if not wieldindex then + if not data.ghost_inv_name then return end + wield_inv_name = data.ghost_inv_name + inv:set_stack(wield_inv_name, 1, ItemStack(data.ghost_tool)) + wieldindex = 1 + wieldstack = inv:get_stack(wield_inv_name, 1) + end + local dir = minetest.facedir_to_dir(wielder_node.param2) + local under_pos = vector.subtract(wielder_pos, dir) + local above_pos = vector.subtract(under_pos, dir) + local pitch + local yaw + if dir.z < 0 then + yaw = 0 + pitch = 0 + elseif dir.z > 0 then + yaw = math.pi + pitch = 0 + elseif dir.x < 0 then + yaw = 3*math.pi/2 + pitch = 0 + elseif dir.x > 0 then + yaw = math.pi/2 + pitch = 0 + elseif dir.y > 0 then + yaw = 0 + pitch = -math.pi/2 + else + yaw = 0 + pitch = math.pi/2 + end + local virtplayer = { + get_inventory_formspec = delay(wielder_meta:get_string("formspec")), + get_look_dir = delay(vector.multiply(dir, -1)), + get_look_pitch = delay(pitch), + get_look_yaw = delay(yaw), + get_player_control = delay({ jump=false, right=false, left=false, LMB=false, RMB=false, sneak=data.sneak, aux1=false, down=false, up=false }), + get_player_control_bits = delay(data.sneak and 64 or 0), + get_player_name = delay(data.masquerade_as_owner and wielder_meta:get_string("owner") or ":pipeworks:"..minetest.pos_to_string(wielder_pos)), + is_player = delay(true), + is_fake_player = true, + set_inventory_formspec = delay(), + getpos = delay(vector.subtract(wielder_pos, assumed_eye_pos)), + get_hp = delay(20), + get_inventory = delay(inv), + get_wielded_item = delay(wieldstack), + get_wield_index = delay(wieldindex), + get_wield_list = delay(wield_inv_name), + moveto = delay(), + punch = delay(), + remove = delay(), + right_click = delay(), + setpos = delay(), + set_hp = delay(), + set_properties = delay(), + set_wielded_item = function(self, item) inv:set_stack(wield_inv_name, wieldindex, item) end, + set_animation = delay(), + set_attach = delay(), + set_detach = delay(), + set_bone_position = delay(), + } + local pointed_thing = { type="node", under=under_pos, above=above_pos } + data.act(virtplayer, pointed_thing) + if data.eject_drops then + for i, stack in ipairs(inv:get_list("main")) do + if not stack:is_empty() then + pipeworks.tube_inject_item(wielder_pos, wielder_pos, dir, stack) + inv:set_stack("main", i, ItemStack("")) + end + end + end +end + +local function wielder_off(data, pos, node) + if node.name == data.name_base.."_on" then + node.name = data.name_base.."_off" + minetest.swap_node(pos, node) + nodeupdate(pos) + end +end + +local function register_wielder(data) + data.fixup_node = data.fixup_node or function (pos, node) end + data.fixup_oldmetadata = data.fixup_oldmetadata or function (m) return m end + for _, state in ipairs({ "off", "on" }) do + local groups = { snappy=2, choppy=2, oddly_breakable_by_hand=2, mesecon=2, tubedevice=1, tubedevice_receiver=1 } + if state == "on" then groups.not_in_creative_inventory = 1 end + local tile_images = {} + for _, face in ipairs({ "top", "bottom", "side2", "side1", "back", "front" }) do + table.insert(tile_images, data.texture_base.."_"..face..(data.texture_stateful[face] and "_"..state or "")..".png") + end + minetest.register_node(data.name_base.."_"..state, { + description = data.description, + tile_images = tile_images, + mesecons = { + effector = { + rules = pipeworks.rules_all, + action_on = function (pos, node) + wielder_on(data, pos, node) + end, + action_off = function (pos, node) + wielder_off(data, pos, node) + end, + }, + }, + tube = { + can_insert = function(pos, node, stack, tubedir) + if not data.tube_permit_anteroposterior_insert then + local nodedir = minetest.facedir_to_dir(node.param2) + if vector.equals(tubedir, nodedir) or vector.equals(tubedir, vector.multiply(nodedir, -1)) then + return false + end + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item(data.wield_inv_name, stack) + end, + insert_object = function(pos, node, stack, tubedir) + if not data.tube_permit_anteroposterior_insert then + local nodedir = minetest.facedir_to_dir(node.param2) + if vector.equals(tubedir, nodedir) or vector.equals(tubedir, vector.multiply(nodedir, -1)) then + return stack + end + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item(data.wield_inv_name, stack) + end, + input_inventory = data.wield_inv_name, + connect_sides = data.tube_connect_sides, + can_remove = function(pos, node, stack, tubedir) + return stack:get_count() + end, + }, + is_ground_content = true, + paramtype2 = "facedir", + tubelike = 1, + groups = groups, + sounds = default.node_sound_stone_defaults(), + drop = data.name_base.."_off", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + set_wielder_formspec(data, meta) + local inv = meta:get_inventory() + inv:set_size(data.wield_inv_name, data.wield_inv_width*data.wield_inv_height) + if data.ghost_inv_name then + inv:set_size(data.ghost_inv_name, 1) + end + if data.eject_drops then + inv:set_size("main", 100) + end + end, + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos) + local placer_pos = placer:getpos() + if placer_pos and placer:is_player() then placer_pos = vector.add(placer_pos, assumed_eye_pos) end + if placer_pos then + local dir = vector.subtract(pos, placer_pos) + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + end, + can_dig = (data.can_dig_nonempty_wield_inv and delay(true) or function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty(data.wield_inv_name) + end), + after_dig_node = function(pos, oldnode, oldmetadata, digger) + -- The legacy-node fixup is done here in a + -- different form from the standard fixup, + -- rather than relying on a standard fixup + -- in an on_dig callback, because some + -- non-standard diggers (such as technic's + -- mining drill) don't respect on_dig. + oldmetadata = data.fixup_oldmetadata(oldmetadata) + for _, stack in ipairs(oldmetadata.inventory[data.wield_inv_name] or {}) do + if not stack:is_empty() then + minetest.add_item(pos, stack) + end + end + pipeworks.scan_for_tube_objects(pos) + end, + on_punch = data.fixup_node, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end, + }) + end +end + +if pipeworks.enable_node_breaker then + local data + data = { + name_base = "pipeworks:nodebreaker", + description = "Node Breaker", + texture_base = "pipeworks_nodebreaker", + texture_stateful = { top = true, bottom = true, side2 = true, side1 = true, front = true }, + tube_connect_sides = { top=1, bottom=1, left=1, right=1, back=1 }, + tube_permit_anteroposterior_insert = false, + wield_inv_name = "pick", + wield_inv_width = 1, + wield_inv_height = 1, + can_dig_nonempty_wield_inv = true, + ghost_inv_name = "ghost_pick", + ghost_tool = "default:pick_mese", + fixup_node = function (pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + -- Node breakers predating the visible pick slot + -- may have been partially updated. This code + -- fully updates them. Some have been observed + -- to have no pick slot at all; first add one. + if inv:get_size("pick") ~= 1 then + inv:set_size("pick", 1) + end + -- Originally, they had a ghost pick in a "pick" + -- inventory, no other inventory, and no form. + -- The partial update of early with-form node + -- breaker code gives them "ghost_pick" and "main" + -- inventories, but leaves the old ghost pick in + -- the "pick" inventory, and doesn't add a form. + -- First perform that partial update. + if inv:get_size("ghost_pick") ~= 1 then + inv:set_size("ghost_pick", 1) + inv:set_size("main", 100) + end + -- If the node breaker predates the visible pick + -- slot, which we can detect by it not having a + -- form, then the pick slot needs to be cleared + -- of the old ghost pick. + if (meta:get_string("formspec") or "") == "" then + inv:set_stack("pick", 1, ItemStack("")) + end + -- Finally, unconditionally set the formspec + -- and infotext. This not only makes the + -- pick slot visible for node breakers where + -- it wasn't before; it also updates the form + -- for node breakers that had an older version + -- of the form, and sets infotext where it was + -- missing for early with-form node breakers. + set_wielder_formspec(data, meta) + end, + fixup_oldmetadata = function (oldmetadata) + -- Node breakers predating the visible pick slot, + -- with node form, kept their ghost pick in an + -- inventory named "pick", the same name as the + -- later visible pick slot. The pick must be + -- removed to avoid spilling it. + if not oldmetadata.fields.formspec then + return { inventory = { pick = {} }, fields = oldmetadata.fields } + else + return oldmetadata + end + end, + masquerade_as_owner = true, + sneak = false, + act = function(virtplayer, pointed_thing) + local wieldstack = virtplayer:get_wielded_item() + local oldwieldstack = ItemStack(wieldstack) + local on_use = (minetest.registered_items[wieldstack:get_name()] or {}).on_use + if on_use then + virtplayer:set_wielded_item(on_use(wieldstack, virtplayer, pointed_thing) or wieldstack) + else + local under_node = minetest.get_node(pointed_thing.under) + local on_dig = (minetest.registered_nodes[under_node.name] or {on_dig=minetest.node_dig}).on_dig + on_dig(pointed_thing.under, under_node, virtplayer) + end + wieldstack = virtplayer:get_wielded_item() + local wieldname = wieldstack:get_name() + if wieldname == oldwieldstack:get_name() then + -- don't mechanically wear out tool + if wieldstack:get_count() == oldwieldstack:get_count() and + wieldstack:get_metadata() == oldwieldstack:get_metadata() and + ((minetest.registered_items[wieldstack:get_name()] or {}).wear_represents or "mechanical_wear") == "mechanical_wear" then + virtplayer:set_wielded_item(oldwieldstack) + end + elseif wieldname ~= "" then + -- tool got replaced by something else: + -- treat it as a drop + virtplayer:get_inventory():add_item("main", wieldstack) + virtplayer:set_wielded_item(ItemStack("")) + end + end, + eject_drops = true, + } + register_wielder(data) + minetest.register_craft({ + output = "pipeworks:nodebreaker_off", + recipe = { + { "group:wood", "default:pick_mese", "group:wood" }, + { "default:stone", "mesecons:piston", "default:stone" }, + { "default:stone", "mesecons:mesecon", "default:stone" }, + } + }) + -- aliases for when someone had technic installed, but then uninstalled it but not pipeworks + minetest.register_alias("technic:nodebreaker_off", "pipeworks:nodebreaker_off") + minetest.register_alias("technic:nodebreaker_on", "pipeworks:nodebreaker_on") + minetest.register_alias("technic:node_breaker_off", "pipeworks:nodebreaker_off") + minetest.register_alias("technic:node_breaker_on", "pipeworks:nodebreaker_on") + -- turn legacy auto-tree-taps into node breakers + dofile(pipeworks.modpath.."/legacy.lua") +end + +if pipeworks.enable_deployer then + register_wielder({ + name_base = "pipeworks:deployer", + description = "Deployer", + texture_base = "pipeworks_deployer", + texture_stateful = { front = true }, + tube_connect_sides = { back=1 }, + tube_permit_anteroposterior_insert = true, + wield_inv_name = "main", + wield_inv_width = 3, + wield_inv_height = 3, + can_dig_nonempty_wield_inv = false, + masquerade_as_owner = true, + sneak = false, + act = function(virtplayer, pointed_thing) + local wieldstack = virtplayer:get_wielded_item() + virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or {on_place=minetest.item_place}).on_place(wieldstack, virtplayer, pointed_thing) or wieldstack) + end, + eject_drops = false, + }) + minetest.register_craft({ + output = "pipeworks:deployer_off", + recipe = { + { "group:wood", "default:chest", "group:wood" }, + { "default:stone", "mesecons:piston", "default:stone" }, + { "default:stone", "mesecons:mesecon", "default:stone" }, + } + }) + -- aliases for when someone had technic installed, but then uninstalled it but not pipeworks + minetest.register_alias("technic:deployer_off", "pipeworks:deployer_off") + minetest.register_alias("technic:deployer_on", "pipeworks:deployer_on") +end + +if pipeworks.enable_dispenser then + register_wielder({ + name_base = "pipeworks:dispenser", + description = "Dispenser", + texture_base = "pipeworks_dispenser", + texture_stateful = { front = true }, + tube_connect_sides = { back=1 }, + tube_permit_anteroposterior_insert = true, + wield_inv_name = "main", + wield_inv_width = 3, + wield_inv_height = 3, + can_dig_nonempty_wield_inv = false, + masquerade_as_owner = false, + sneak = true, + act = function(virtplayer, pointed_thing) + local wieldstack = virtplayer:get_wielded_item() + virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or {on_drop=minetest.item_drop}).on_drop(wieldstack, virtplayer, virtplayer:getpos()) or wieldstack) + end, + eject_drops = false, + }) + minetest.register_craft({ + output = "pipeworks:dispenser_off", + recipe = { + { "default:desert_sand", "default:chest", "default:desert_sand" }, + { "default:stone", "mesecons:piston", "default:stone" }, + { "default:stone", "mesecons:mesecon", "default:stone" }, + } + }) +end diff --git a/mods/plants_lib/depends.txt b/mods/plants_lib/depends.txt index ceb8b91..4ad96d5 100644 --- a/mods/plants_lib/depends.txt +++ b/mods/plants_lib/depends.txt @@ -1,2 +1 @@ default -skylands \ No newline at end of file diff --git a/mods/plants_lib/init.lua b/mods/plants_lib/init.lua index 232f633..a32e42f 100644 --- a/mods/plants_lib/init.lua +++ b/mods/plants_lib/init.lua @@ -1,5 +1,4 @@ -- Plantlife library mod by Vanessa Ezekowitz --- last revision, 2014-05-15 -- -- License: WTFPL -- @@ -14,6 +13,8 @@ plantslib = {} plantslib.modpath = minetest.get_modpath("plants_lib") plantslib.intllib_modpath = minetest.get_modpath("intllib") +plantslib.total_legacy_calls = 0 + local S if plantslib.intllib_modpath then dofile(plantslib.intllib_modpath.."/intllib.lua") @@ -69,15 +70,6 @@ function plantslib:is_node_loaded(node_pos) return true end -function plantslib:clone_node(name) - node2={} - node=minetest.registered_nodes[name] - for k,v in pairs(node) do - node2[k]=v - end - return node2 -end - function plantslib:set_defaults(biome) biome.seed_diff = biome.seed_diff or 0 biome.min_elevation = biome.min_elevation or -31000 @@ -108,96 +100,180 @@ end -- Spawn plants using the map generator -function plantslib:register_generate_plant(biomedef, node_or_function_or_model) - minetest.register_on_generated(plantslib:search_for_surfaces(minp, maxp, biomedef, node_or_function_or_model)) +plantslib.surfaces_list = {} +plantslib.actions_list = {} +plantslib.surface_nodes = {} + +local function search_table(t, s) + for i = 1, #t do + if t[i] == s then return true end + end + return false end -function plantslib:search_for_surfaces(minp, maxp, biomedef, node_or_function_or_model) - return function(minp, maxp, blockseed) - local biome = biomedef - plantslib:set_defaults(biome) +-- register the list of surfaces to spawn stuff on, filtering out all duplicates. - local searchnodes = minetest.find_nodes_in_area(minp, maxp, biome.surface) - local in_biome_nodes = {} - for _ , pos in ipairs(searchnodes) do - local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } - local perlin1 = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) - local noise1 = perlin1:get2d({x=p_top.x, y=p_top.z}) - local noise2 = plantslib.perlin_temperature:get2d({x=p_top.x, y=p_top.z}) - local noise3 = plantslib.perlin_humidity:get2d({x=p_top.x+150, y=p_top.z+50}) - if (not biome.depth or minetest.get_node({ x = pos.x, y = pos.y-biome.depth-1, z = pos.z }).name ~= biome.surface) - and (not biome.check_air or (biome.check_air and minetest.get_node(p_top).name == "air")) - and pos.y >= biome.min_elevation - and pos.y <= biome.max_elevation - and noise1 > biome.plantlife_limit - and noise2 <= biome.temp_min - and noise2 >= biome.temp_max - and noise3 <= biome.humidity_min - and noise3 >= biome.humidity_max - and (not biome.ncount or #(minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, biome.neighbors)) > biome.ncount) - and (not biome.near_nodes or #(minetest.find_nodes_in_area({x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, biome.near_nodes)) >= biome.near_nodes_count) - and math.random(1,100) > biome.rarity - and (not biome.below_nodes or string.find(dump(biome.below_nodes), minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name) ) - then - table.insert(in_biome_nodes, pos) +function plantslib:register_generate_plant(biomedef, node_or_function_or_model) + + -- if calling code passes an undefined node, don't register an action for it. + if type(node_or_function_or_model) == "string" + and string.find(node_or_function_or_model, ":") + and not minetest.registered_nodes[node_or_function_or_model] then + plantslib:dbg("Warning: Ignored registration for undefined spawn node: "..dump(node_or_function_or_model)) + return + end + + if type(node_or_function_or_model) == "string" + and not string.find(node_or_function_or_model, ":") then + plantslib:dbg("Warning: Registered function call using deprecated string method: "..dump(node_or_function_or_model)) + end + + if biomedef.check_air == false then + plantslib:dbg("Warning: Registered legacy mapgen hook: "..dump(node_or_function_or_model)) + minetest.register_on_generated(plantslib:generate_block_legacy(minp, maxp, biomedef, node_or_function_or_model)) + plantslib.total_legacy_calls = plantslib.total_legacy_calls + 1 + else + plantslib.actions_list[#plantslib.actions_list + 1] = { biomedef, node_or_function_or_model } + local s = biomedef.surface + if type(s) == "string" then + if s and minetest.registered_nodes[s] then + if not search_table(plantslib.surfaces_list, s) then + plantslib.surfaces_list[#plantslib.surfaces_list + 1] = s + end + else + plantslib:dbg("Warning: Ignored registration for undefined surface node: "..dump(s)) + end + else + for i = 1, #biomedef.surface do + local s = biomedef.surface[i] + if s and minetest.registered_nodes[s] then + if not search_table(plantslib.surfaces_list, s) then + plantslib.surfaces_list[#plantslib.surfaces_list + 1] = s + end + else + plantslib:dbg("Warning: Ignored registration for undefined surface node: "..dump(s)) + end + end + end + end +end + +function plantslib:generate_block(minp, maxp, blockseed) + return function(minp, maxp, blockseed) + + -- use the block hash as a unique key into the surface_nodes + -- table, so that we can write the table thread-safely. + + local blockhash = minetest.hash_node_position(minp) + local search_area = minetest.find_nodes_in_area(minp, maxp, plantslib.surfaces_list) + + -- search the generated block for surfaces + + local surface_nodes = {} + surface_nodes.blockhash = {} + + for i = 1, #search_area do + local pos = search_area[i] + local p_top = { x=pos.x, y=pos.y+1, z=pos.z } + if minetest.get_node(p_top).name == "air" then + surface_nodes.blockhash[#surface_nodes.blockhash + 1] = pos end end - local num_in_biome_nodes = #in_biome_nodes + for action = 1, #plantslib.actions_list do + local biome = plantslib.actions_list[action][1] + local node_or_function_or_model = plantslib.actions_list[action][2] - if num_in_biome_nodes > 0 then - for i = 1, math.min(biome.max_count, num_in_biome_nodes) do - local tries = 0 - local spawned = false - while tries < 2 and not spawned do - local pos = in_biome_nodes[math.random(1, num_in_biome_nodes)] - if biome.spawn_replace_node then - pos.y = pos.y-1 - end - local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + plantslib:set_defaults(biome) - if not (biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near(p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes)) then - if biome.delete_above then - minetest.remove_node(p_top) - minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z}) - end + -- filter stage 1 - find nodes from the supplied surfaces that are within the current biome. - if biome.delete_above_surround then - minetest.remove_node({x=p_top.x-1, y=p_top.y, z=p_top.z}) - minetest.remove_node({x=p_top.x+1, y=p_top.y, z=p_top.z}) - minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z-1}) - minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z+1}) + local in_biome_nodes = {} + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) - minetest.remove_node({x=p_top.x-1, y=p_top.y+1, z=p_top.z}) - minetest.remove_node({x=p_top.x+1, y=p_top.y+1, z=p_top.z}) - minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z-1}) - minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z+1}) - end + for i = 1, #surface_nodes.blockhash do + local pos = surface_nodes.blockhash[i] + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z}) + local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z}) + local noise3 = plantslib.perlin_humidity:get2d({x=pos.x+150, y=pos.z+50}) + local biome_surfaces_string = dump(biome.surface) + if ((not biome.depth and string.find(biome_surfaces_string, minetest.get_node(pos).name)) or (biome.depth and not string.find(biome_surfaces_string, minetest.get_node({ x = pos.x, y = pos.y-biome.depth-1, z = pos.z }).name))) + and (not biome.check_air or (biome.check_air and minetest.get_node(p_top).name == "air")) + and pos.y >= biome.min_elevation + and pos.y <= biome.max_elevation + and noise1 > biome.plantlife_limit + and noise2 <= biome.temp_min + and noise2 >= biome.temp_max + and noise3 <= biome.humidity_min + and noise3 >= biome.humidity_max + and (not biome.ncount or #(minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, biome.neighbors)) > biome.ncount) + and (not biome.near_nodes or #(minetest.find_nodes_in_area({x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, biome.near_nodes)) >= biome.near_nodes_count) + and math.random(1,100) > biome.rarity + and (not biome.below_nodes or string.find(dump(biome.below_nodes), minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name) ) + then + in_biome_nodes[#in_biome_nodes + 1] = pos + end + end + -- filter stage 2 - find places within that biome area to place the plants. + + local num_in_biome_nodes = #in_biome_nodes + + if num_in_biome_nodes > 0 then + for i = 1, math.min(biome.max_count, num_in_biome_nodes) do + local tries = 0 + local spawned = false + while tries < 2 and not spawned do + local pos = in_biome_nodes[math.random(1, num_in_biome_nodes)] if biome.spawn_replace_node then - minetest.remove_node(pos) + pos.y = pos.y-1 end + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } - local objtype = type(node_or_function_or_model) + if not (biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near(p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes)) then + if biome.delete_above then + minetest.remove_node(p_top) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z}) + end - if objtype == "table" then - plantslib:generate_tree(pos, node_or_function_or_model) - spawned = true - elseif objtype == "string" and - minetest.registered_nodes[node_or_function_or_model] then - minetest.add_node(p_top, { name = node_or_function_or_model }) - spawned = true - elseif objtype == "function" then - node_or_function_or_model(pos) - spawned = trueload - elseif objtype == "string" and pcall(loadstring(("return %s(...)"): - format(node_or_function_or_model)),pos) then - spawned = true + if biome.delete_above_surround then + minetest.remove_node({x=p_top.x-1, y=p_top.y, z=p_top.z}) + minetest.remove_node({x=p_top.x+1, y=p_top.y, z=p_top.z}) + minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z-1}) + minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z+1}) + + minetest.remove_node({x=p_top.x-1, y=p_top.y+1, z=p_top.z}) + minetest.remove_node({x=p_top.x+1, y=p_top.y+1, z=p_top.z}) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z-1}) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z+1}) + end + + if biome.spawn_replace_node then + minetest.remove_node(pos) + end + + local objtype = type(node_or_function_or_model) + + if objtype == "table" then + plantslib:generate_tree(pos, node_or_function_or_model) + spawned = true + elseif objtype == "string" and + minetest.registered_nodes[node_or_function_or_model] then + minetest.set_node(p_top, { name = node_or_function_or_model }) + spawned = true + elseif objtype == "function" then + node_or_function_or_model(pos) + spawned = true + elseif objtype == "string" and pcall(loadstring(("return %s(...)"): + format(node_or_function_or_model)),pos) then + spawned = true + else + plantslib:dbg("Warning: Ignored invalid definition for object "..dump(node_or_function_or_model).." that was pointed at {"..dump(pos).."}") + end else - print("Ignored invalid definition for object "..dump(node_or_function_or_model).." that was pointed at {"..dump(pos).."}") + tries = tries + 1 end - else - tries = tries + 1 end end end @@ -205,6 +281,8 @@ function plantslib:search_for_surfaces(minp, maxp, biomedef, node_or_function_or end end +minetest.register_on_generated(plantslib:generate_block(minp, maxp, blockseed)) + -- The spawning ABM function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa) @@ -239,8 +317,8 @@ function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa) action = function(pos, node, active_object_count, active_object_count_wider) local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } local n_top = minetest.get_node(p_top) - local perlin1 = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) - local noise1 = perlin1:get2d({x=p_top.x, y=p_top.z}) + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) + local noise1 = perlin_fertile_area:get2d({x=p_top.x, y=p_top.z}) local noise2 = plantslib.perlin_temperature:get2d({x=p_top.x, y=p_top.z}) local noise3 = plantslib.perlin_humidity:get2d({x=p_top.x+150, y=p_top.z+50}) if noise1 > biome.plantlife_limit @@ -262,7 +340,7 @@ function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa) local walldir = plantslib:find_adjacent_wall(p_top, biome.verticals_list) if biome.alt_wallnode and walldir then if n_top.name == "air" then - minetest.add_node(p_top, { name = biome.alt_wallnode, param2 = walldir }) + minetest.set_node(p_top, { name = biome.alt_wallnode, param2 = walldir }) end else local currentsurface = minetest.get_node(pos).name @@ -279,19 +357,19 @@ function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa) assert(loadstring(spawn_plants.."(...)"))(pos) elseif not biome.spawn_on_side and not biome.spawn_on_bottom and not biome.spawn_replace_node then if n_top.name == "air" then - minetest.add_node(p_top, { name = plant_to_spawn, param2 = fdir }) + minetest.set_node(p_top, { name = plant_to_spawn, param2 = fdir }) end elseif biome.spawn_replace_node then - minetest.add_node(pos, { name = plant_to_spawn, param2 = fdir }) + minetest.set_node(pos, { name = plant_to_spawn, param2 = fdir }) elseif biome.spawn_on_side then local onside = plantslib:find_open_side(pos) if onside then - minetest.add_node(onside.newpos, { name = plant_to_spawn, param2 = onside.facedir }) + minetest.set_node(onside.newpos, { name = plant_to_spawn, param2 = onside.facedir }) end elseif biome.spawn_on_bottom then if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then - minetest.add_node({x=pos.x, y=pos.y-1, z=pos.z}, { name = plant_to_spawn, param2 = fdir} ) + minetest.set_node({x=pos.x, y=pos.y-1, z=pos.z}, { name = plant_to_spawn, param2 = fdir} ) end end end @@ -338,11 +416,11 @@ function plantslib:grow_plants(opts) -- corner case for changing short junglegrass -- to dry shrub in desert if n_bot.name == options.dry_early_node and options.grow_plant == "junglegrass:short" then - minetest.add_node(pos, { name = "default:dry_shrub" }) + minetest.set_node(pos, { name = "default:dry_shrub" }) elseif options.grow_vertically and walldir then if plantslib:search_downward(pos, options.height_limit, options.ground_nodes) then - minetest.add_node(p_top, { name = options.grow_plant, param2 = walldir}) + minetest.set_node(p_top, { name = options.grow_plant, param2 = walldir}) end elseif not options.grow_result and not options.grow_function then @@ -366,19 +444,19 @@ function plantslib:replace_object(pos, replacement, grow_function, walldir, seed plantslib:grow_tree(pos, grow_function) return elseif growtype == "function" then - local perlin1 = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale) - local noise1 = perlin1:get2d({x=pos.x, y=pos.z}) + local perlin_fertile_area = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale) + local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z}) local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z}) grow_function(pos,noise1,noise2,walldir) return elseif growtype == "string" then - local perlin1 = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale) - local noise1 = perlin1:get2d({x=pos.x, y=pos.z}) + local perlin_fertile_area = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale) + local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z}) local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z}) assert(loadstring(grow_function.."(...)"))(pos,noise1,noise2,walldir) return elseif growtype == "nil" then - minetest.add_node(pos, { name = replacement, param2 = walldir}) + minetest.set_node(pos, { name = replacement, param2 = walldir}) return elseif growtype ~= "nil" and growtype ~= "string" and growtype ~= "table" then error("Invalid grow function "..dump(grow_function).." used on object at ("..dump(pos)..")") @@ -456,5 +534,107 @@ function plantslib:get_nodedef_field(nodename, fieldname) return minetest.registered_nodes[nodename][fieldname] end +-- The old version of the mapgen spawner, for mods that require disabling of +-- checking for air during the initial map read stage. + +function plantslib:generate_block_legacy(minp, maxp, biomedef, node_or_function_or_model) + return function(minp, maxp, blockseed) + local biome = biomedef + plantslib:set_defaults(biome) + + local searchnodes = minetest.find_nodes_in_area(minp, maxp, biome.surface) + local in_biome_nodes = {} + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) + + for i = 1, #searchnodes do + local pos = searchnodes[i] + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + local noise1 = perlin_fertile_area:get2d({x=p_top.x, y=p_top.z}) + local noise2 = plantslib.perlin_temperature:get2d({x=p_top.x, y=p_top.z}) + local noise3 = plantslib.perlin_humidity:get2d({x=p_top.x+150, y=p_top.z+50}) + if (not biome.depth or minetest.get_node({ x = pos.x, y = pos.y-biome.depth-1, z = pos.z }).name ~= biome.surface) + and pos.y >= biome.min_elevation + and pos.y <= biome.max_elevation + and noise1 > biome.plantlife_limit + and noise2 <= biome.temp_min + and noise2 >= biome.temp_max + and noise3 <= biome.humidity_min + and noise3 >= biome.humidity_max + and (not biome.ncount or #(minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, biome.neighbors)) > biome.ncount) + and (not biome.near_nodes or #(minetest.find_nodes_in_area({x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, biome.near_nodes)) >= biome.near_nodes_count) + and math.random(1,100) > biome.rarity + and (not biome.below_nodes or string.find(dump(biome.below_nodes), minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name) ) + then + in_biome_nodes[#in_biome_nodes + 1] = pos + end + end + + local num_in_biome_nodes = #in_biome_nodes + + if num_in_biome_nodes > 0 then + for i = 1, math.min(biome.max_count, num_in_biome_nodes) do + local tries = 0 + local spawned = false + while tries < 2 and not spawned do + local pos = in_biome_nodes[math.random(1, num_in_biome_nodes)] + if biome.spawn_replace_node then + pos.y = pos.y-1 + end + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + + if not (biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near(p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes)) then + if biome.delete_above then + minetest.remove_node(p_top) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z}) + end + + if biome.delete_above_surround then + minetest.remove_node({x=p_top.x-1, y=p_top.y, z=p_top.z}) + minetest.remove_node({x=p_top.x+1, y=p_top.y, z=p_top.z}) + minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z-1}) + minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z+1}) + + minetest.remove_node({x=p_top.x-1, y=p_top.y+1, z=p_top.z}) + minetest.remove_node({x=p_top.x+1, y=p_top.y+1, z=p_top.z}) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z-1}) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z+1}) + end + + if biome.spawn_replace_node then + minetest.remove_node(pos) + end + + local objtype = type(node_or_function_or_model) + + if objtype == "table" then + plantslib:generate_tree(pos, node_or_function_or_model) + spawned = true + elseif objtype == "string" and + minetest.registered_nodes[node_or_function_or_model] then + minetest.set_node(p_top, { name = node_or_function_or_model }) + spawned = true + elseif objtype == "function" then + node_or_function_or_model(pos) + spawned = trueload + elseif objtype == "string" and pcall(loadstring(("return %s(...)"): + format(node_or_function_or_model)),pos) then + spawned = true + else + plantslib:dbg("Warning: Ignored invalid definition for object "..dump(node_or_function_or_model).." that was pointed at {"..dump(pos).."}") + end + else + tries = tries + 1 + end + end + end + end + end +end + +print("[Plants Lib] Loaded") + +minetest.after(0, function() + print("[Plants Lib] Registered a total of "..#plantslib.surfaces_list.." surface types to be evaluated,") + print("[Plants Lib] a total of "..#plantslib.actions_list.." actions, and "..plantslib.total_legacy_calls.." legacy mapgen hooks.") +end) -print(S("[Plantlife Library] Loaded")) diff --git a/mods/skylands/abms.lua b/mods/skylands/abms.lua index 7da8f4a..c18d9cb 100644 --- a/mods/skylands/abms.lua +++ b/mods/skylands/abms.lua @@ -276,4 +276,5 @@ minetest.register_abm({ vm:write_to_map() vm:update_map() end, -}) \ No newline at end of file +}) + diff --git a/mods/skylands/init.lua b/mods/skylands/init.lua index be737e4..75fc046 100644 --- a/mods/skylands/init.lua +++ b/mods/skylands/init.lua @@ -1,11 +1,11 @@ --- skylands 4.0 by HeroOfTheWinds, based on floatindev 0.2.0 by paramat +-- skylands 4.2 by HeroOfTheWinds, based on floatindev 0.2.0 by paramat -- For latest stable Minetest and back to 0.4.8 --- Depends default, fire, stairs, moreblocks?, moreores?, mesecons? +-- Depends default, fire, stairs, moreblocks?, moreores?, mesecons?, technic? -- License: code WTFPL -- Parameters -local YMIN = 700 -- Approximate realm limits. +local YMIN = -33000 -- Approximate realm limits. local YMAX = 33000 local XMIN = -33000 local XMAX = 33000 @@ -158,6 +158,7 @@ dofile(minetest.get_modpath("skylands").."/wheat.lua") dofile(minetest.get_modpath("skylands").."/abms.lua") dofile(minetest.get_modpath("skylands").."/functions.lua") dofile(minetest.get_modpath("skylands").."/pools.lua") +dofile(minetest.get_modpath("skylands").."/tools.lua") dofile(minetest.get_modpath("skylands").."/farming.lua") diff --git a/mods/skylands/pools.lua b/mods/skylands/pools.lua index 8cf0f64..c0b3a0e 100644 --- a/mods/skylands/pools.lua +++ b/mods/skylands/pools.lua @@ -23,6 +23,8 @@ function skylands:gen_pool(lakepoints, area, data, x0, z0, x1, z1) local c_hvngrass = minetest.get_content_id("skylands:heaven_grass") local c_rich = minetest.get_content_id("skylands:rich_dirt") + local c_cloud = minetest.get_content_id("skylands:cloud") + local sidelen = x1 - x0 -- actually sidelen - 1 @@ -251,6 +253,7 @@ function skylands:gen_pool(lakepoints, area, data, x0, z0, x1, z1) break elseif data[viu] == c_hvngrass then data[viu] = c_rich + break else break end diff --git a/mods/skylands/textures/skylands_cavorite_handle.png b/mods/skylands/textures/skylands_cavorite_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5b46d77f17ee351055ebd5a314d5b9b42fac9f GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lZ;1}?LWceZT;3dv@MM3gw^=jNv7l>oU649-QV zi6yBi3gww484B*6z5ywEsq8@UcuyC{5R22vDF>L8rXTrRez7pc;@1}zW*|5`nY~}K z<)^E}wBtHSF5#z-I55=I|Ce2Fg(q>K0KPq#u_Ks=HNZ^f8MS||2vHilz$9%yPUaQ^8CGB$3Hwc%+DtIY(I~u z)_=);|9YF&D;f{><-}t8K-4BmG&*$0KJ>O`O2)AeS<^SjR8vOtNEaK&V6?a9S z&9_6=2cF$>4! zK~y-)V_={VFd}m{$4dWaU|?X-lM-c+({N%qa$^^RZRZt6q76VcNRp46!B|F|;mViK z3?KgdA!rZ-E`$EJ+y4JQzv#c6iopLsOPT*fxd7b|QEpBKb8|n2n8m9Y9z6cSaP;;E z(p;0YHU0lIKYqANkmZ<&(agZWz_3Hxgkj6Rl?(@~lNb({>-;CmfTXSI|E;Ah7@jm`xtBl1c`I@+za#nyG`}_k1b%4T|u;F7`R@b_5c6;qW=sG3=Ax| zoW1hsYKC3e+pvcAowpwuxNhtt-DYg5mWdRb$@Vioz{0@5!0_b3V}_Lv9+Pe}H2?sB WrHVCu>yfGe0000ZT66#a0Tf9@ zK~y-)<&i%x192S2Ki9k8^<3RG{-qLO5V4p|($zrf6|i*aVDTDs@CIrlhE6PorUtvg zAZ3uK1g+B|{X>s5xr+P@7K6B7BC+_)-_MhLp9g-4rg~VsYhzI=1=O=iIW#zl5H^12k*o3%Qohsey#ZkSBo|i3WM6CqQ#WZo zlxa1pI0F;t!lLazg$JbaHLbw0oSmBHxzoUQ62#0X?dAoqK@X)Dwr(OU@0Tzw2iJD# zzT9(idCgqzEWE^YF(a39>lm8k+`Ijhs~)L*EquLnF(bE6cjWx$g8bTv(&pdE%KSsw l0Jy7o>{dJuR}VD)nh%nUgdbiP5`6#w002ovPDHLkV1nH1o-+Ud literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_bronzesword.png b/mods/skylands/textures/skylands_cavorite_tool_bronzesword.png new file mode 100644 index 0000000000000000000000000000000000000000..775ba77d035d09996961087aae7c1c7d9798a697 GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~)SE-=iuee>8FD8gCb z5n0T@z%2~Ij105pNB{-dOFVsD+3#`ii;GFV%~a_E3T^UqaSX9Iot&^hz+lp<#98wH z>m{tSFT1;`1(~L^sTp^0e=^up^RcxN1Uf^`zUEt#VlYua_3q98&&B`7OY8srpSbhj z|0?5W{|^U#HnIQre}jgSt1-8cy0O8`#>PZFuZ;7z>t`J#tcEFdf*;!snC$fZ+LXP*JX!4=Lqvyi iwwmS4NpIp+7#PgDdVhDu)@%p5p25@A&t;ucLK6V)2XHX} literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_diamondaxe.png b/mods/skylands/textures/skylands_cavorite_tool_diamondaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..1025008d834f9013649822344089016312970465 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lbRaUsT8nUyzyLMJ_4978NlCnqd0?YO!5bN!il zbN?5fG=6w_PW8Jl^}4aPY-N0YY?F95%rSm#uWikKczyhSi6tV^g_yWs@qvzwj?Tf8 z6Muhu%OmwV%~)pd-^Ph63=)8#;`Yt675@)1w|P(3Gc+(TSdgK{rIPFW-~RidKmQLs zUHad%&uK>5_LXsqXJxLGoF_EjrsB+oPY09RVsGA-kbJ?(5SX49DZjvXI?z)Lp00i_ I>zopr0I>&pJ^%m! literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_diamondpick.png b/mods/skylands/textures/skylands_cavorite_tool_diamondpick.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbe07e77196643747175dc2fde327c1a380d06e GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lbRadDyK1!tTY7#KM{T^vI!PA4ZU5HL_GZaMA! z-`ms6$imXvn1hqc=+3^vxrv?K*2)*z6r@wqvri{vW}Yl~{*1RR|NcHflMcq|j%e~p@0tHoBp>Zax%hwG_VxeWtxx{h9ww@AcfyjjFaMXSfBE~q>i4hx zbGcSA_8iGbOGrqlD1O3sIQ?w}n{jY(+wy+-gNIu>C!}R(a<{4T%Ngfn-9KIN@>42X zqM#s~qoU%YIkw*q{rR64y!T%+_l+60*8eB3kz`x+?d{L_y3fDr*TgkgRzJOXm1p;+ z?TNgL=USH={rT~=yJYsn#&<1tA>snb#zqz2{#aI;EoK&DV`Br`v8Lw342{_<`4}GX WPTIXZ#-|P#P7I!|elF{r5}E)b6PMQj literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_diamondshovel.png b/mods/skylands/textures/skylands_cavorite_tool_diamondshovel.png new file mode 100644 index 0000000000000000000000000000000000000000..f122eb2328ac09c36ea31640f99b5870534f54b9 GIT binary patch literal 382 zcmV-^0fGLBP)eYKH434q`6|E}r>6AAH{rzeH0#thAbPKA&ecm*agh;e2CL1DH{j zS4t(y>uanoFEMAD?A`fNDWKA7%Ch57EG#k{jd*x`BFi$;GzGx;NnSWPmId2JBndB_ z4#U9!*LBf#o!4%6dce3^)9N5S&qD}-<2YEBMHEHEag0)ht@aJc={}}uQnYP^5comB zxLTV&;(>oCcQ4K`G)WkS2qCC98lN)L8FD8gCb z5n0T@z%2~Ij105pNB{-dOFVsD+3#`ii%YUk_{XXS6guST;uvCaIyqs1fWf3yjyv{z zvG4i2ZS(AjogrtRrl#^J9XiC5pMO6s0SFXsF|s<@)206t16`(_HSk@M<>u*;7rggh zcGPx*oI87FI!1bRCBDD5mWSuHnZW!T&*EnMzke?LZT-L2;w7vSo6@$gjQjt#=IX!l yy|uo36b*cVdIhAKm^`>`M9!)_*9-dF&B9Q|FuB>AWqJe9Hw>PxelF{r5}E){Y<*$? literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_meseaxe.png b/mods/skylands/textures/skylands_cavorite_tool_meseaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..11840ba15c3160b05174b6f5b751e297c292ea12 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lbRaY?g-3am0fp(CCyjv*GOlM@!0?)csC@c-4> zJpWH#s(HQc)&KwhSO2rGZ@tZ+79%9S-t*6Nf$-EHpT7$;n}@3$zRP}tH}PQVf!p8p zC4N-iH~8@JPqKhWLRvxsM=Hk_n}7dbPoK}TTW^1w$}Q=1J+D9YpU*w~e}BK-fB$)p z|K_jNa;U0!V|(bs|6jRB|5x)RS2edzc(!Ei%m4BpA`A@n_@oqUOifTZ2^M-DH{<{P z+*RT)&&gf&v1xFBJej>;GR&^x%m(dhX=P?xMuz5nC5lI<9CHKuhr!d;&t;ucLK6Tx CLV-pA literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_mesepick.png b/mods/skylands/textures/skylands_cavorite_tool_mesepick.png new file mode 100644 index 0000000000000000000000000000000000000000..9837cee25c8265d90c8a9b306ca568b4c4212a82 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lbRacQv=74Bg`p%b1ijv*GO_fA~Pb%=qXB|j;^ zB*(YF^#c0_&E{6t=3EJ}9I@s%g*}JgFlTI7qua%wAdz#zA*cDM@s5W__W$j;zQ6x5 z-;dNB_ARm#=1d5YbW2E_Se`Y}MAA(|UCDQn+SPR)wHljUq??0%mt7M6?435da!;@0 z*54Wen+`BM*e$11%kK&F+Sy;dYipXPeq-48I&u3AE_ZW>#miFH=gNl3=pL^zeRDkh z-a*fE)A>%?aUc9HCdGX)(=+jh=LB)T<+Ez`^sPU%znC>iaY3W_s;|{RKQVZ^`njxg HN@xNAun%%} literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_meseshovel.png b/mods/skylands/textures/skylands_cavorite_tool_meseshovel.png new file mode 100644 index 0000000000000000000000000000000000000000..ccad33654c79d2f54cb9d439bc70dccd81c580a8 GIT binary patch literal 375 zcmV--0f_#IP)-jottN0R%}z zK~y-)<&ZH-15p%3&;R*~phYrHqAA>ig$@KHX~e=p_mC!qyKoI!inR+!3cI99krcXv z877!$AY^nzh%@snf?y%z2f@bM-gn-+@4_#oYzLpFo|H;1N`qvuVmb;y+rnkHf-Y21 zs!Enl2}hm)7#n!g-6o?C(?#(CyV^eIp@B#zgZ8aje;@2wKBzwhW*9 zLZjYS!+~M^pqM{H(GgbHgeX$PFP8P49_+~BZc+TellOE_Uf=em+pEc^pPQiBZpq2T zIYtRVP++l838FD8gCb z5n0T@z%2~Ij105pNB{-dOFVsD+3#`ii<>LheclPuxysYUF~s6@a>4=ugGs9tO(s3G z@7Y^r$*e5Aa#pzR?1KxI96Rvgm8hiI|Nr+t@82`;;s1-lJpbR$71UD41uFjkf4(R~&9Zm$n|Kul ZhA+93elM9Kzz%dZgQu&X%Q~loCIHqibiM!p literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_steelaxe.png b/mods/skylands/textures/skylands_cavorite_tool_steelaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc762839f51e8077eafa52d19bc7ba7ac323510 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lbRaSNfsJzw;ILMJ?3978Nlzn!#@uPH#JjXx{R z?S_wq{Gpq?X0Llin$9Pen3>5pNWXAWJYk|JU4FP^?mM=d27k@WnV9dG{QUmk`u;gf zm-~J)$2%5r$WOg&!pflHc}Z4)g>g!d#%Uqfz$;NauNa&-m>j01PF(joMS@Ltxw1&V z`p@I5uiZLQ8k-Wyrm1T2e1>nE=;S!z2E%2oi5@{-L0%XCtXaYCQ(uK9UK zBraR&Uiv1J!xw$#diT5VAJcC?|Jx}(@v`5OC+l~(?LWiq`>cII8^e5Opr05#UHx3v IIVCg!0IvRWf&c&j literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_steelpick.png b/mods/skylands/textures/skylands_cavorite_tool_steelpick.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7a679115f31d4c1e868cc6e0a2ecb4cf3530f1 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lbRaZ8cLBMDJJq062wjv*GO*G^o>*OVZ0g#Q`y zjin3UFDO=);4#~LHtB<{iFD7oGdX!ubK(tdJYBu%Ae(Z{hMyeimo$S}p8Wdz?%jX( zRZ|3-oH(?WdQ4jPdXveC&o+}%L|p$j${bhpj5=%8F5A2`ed3c9=^JjZ5^wJ*pR9f) zYajC$n>2<9ne+)kk4pAF{Hpd#zj*saw-@X;&b3Zc;aoDsz}Gnb?bXz?|B4QL@tqQM zbNgrb;LpB*#3zs zzD$NoxGUKC6Ewxds#+6g>+WeyzYsL%nx5;mL*7SZ6i&AAvb2dP)_3tJp3geyRL0IC zUH`V){>Q!F4e^J3#HR+O+%}U)R#0MbOnBp@>H65>Qsch&D|Nh?8jOW+ey`oJt~+zq zgy)vmN?WfF*&kLTGYQn?3HP_pT!|F`G+Ko5cO1^*L=oY+Wa@6L$$0U|HpD**~ zltowltXVqydGxP;!i#U%pFH-*`6g3C)Vq&r-+xq8r2oj?#}IsXako`)#SUONFnGH9 KxvX8FD8gCb z5n0T@z%2~Ij105pNB{-dOFVsD+3#`ii(8pYY!?m$3eER)aSX9I{dV$3-a`f=F6T8^ z_l7%2Dlcu-N#&2;=)NGWK|_ew$wW@kb=iW#=bU?vTzt^SWUagZ*V*0HFG~)b6W)5j z=Dg1S?{P9&iO*%0OzAMZW<5EDqft{;D)~qIeukxs)SffF?OH2#c22Q055xEC&4+Io zKflAb+O=4sdeR@yCE6F~PuK2yF1#&Mlp$elYG`cM#hl3G?}dlUqFuWWNFS5hpLtm$ R#02P622WQ%mvv4FO#qxCVr>8b literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_stoneaxe.png b/mods/skylands/textures/skylands_cavorite_tool_stoneaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..f51f4787370c81506527cfb68f765a0b4c53f6ee GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lbRachJAkIy)PLWezF978NlCnqd0J#qHz-}$p= z|CXO_BW!opwUzb1Xv&h0Q4NuCBbFk@jgZcV+!$1H2b~`rA zpWisWe?E}zSG*AP?EiIrd&#ocy0aX?$2~N74mmmh>+b9{^ziU7vZ?tp;o+@DQy%yH z`UDj%9tj`_TN`)y$E&N_ZRzLd8`u2#!02imsF0cc>;F#iXaD)Rd4KvBi5xQ7?fX^g xs*m^C4^w_TIhfowm0!;I&8d6GPB{28FwAMnIdd+m_&m@%44$rjF6*2UngDWEcK`qY literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_stonepick.png b/mods/skylands/textures/skylands_cavorite_tool_stonepick.png new file mode 100644 index 0000000000000000000000000000000000000000..173cc68e93df2f3a87cd399e4abebe683de43ae6 GIT binary patch literal 399 zcmV;A0dW3_P)~jpyXQZ!Va)QN)oQ7=77-yy5;~oZDI@?0!%#&8*L9iC z=VVz%x7#&q3l?cK8Y&`Gt5qJZ&ajm&Zk{G)Z2^Gq`(++B8uM`zocKB002ovPDHLkV1i0`nBFAy0J4+o_ zlww&agy$1Skp^&0I}s;WW=kEUs8{a|ZzLx-UP;4OP6&kKa`@O+&N@J zmL^S8s@aUE;qY6gO+LLp)2k zUT3~ou-h`l~#>tImT%= zxpFS0NT9OTGdSpv41nXGP;{Ow-}vNYmcwPD0D>?i(3tm7egXEJggh*k7ia(g002ov JPDHLkV1k(6lV<<` literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_woodaxe.png b/mods/skylands/textures/skylands_cavorite_tool_woodaxe.png new file mode 100644 index 0000000000000000000000000000000000000000..975787569b5941a05e991a3d75efa5a4a1719749 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~rAQyILR6^}3jMK}vQ zB8wRqxP?KOkzv*x37{Z*iKnkC`#lZ;24*J5RX_cJLPtGa978NlCnqd0<=8Uir+kLy zXZh(i!ggmBpZ)p2ly%?ZtqjW<-`!&RZ+SyfqVE6C;|k|KPd#|qL1wkKM4@EDa-|RR zC(mtcY=3UgEHBP{xc@#6&-(kD4Gato4d3kgBekxdbvk4FyPAX+$uFOu+q1>Vxv}YO z+s~7~|Bvc9))(s@KKgU~!&__NI|+*%FJ1fczgYjw|9p_4Pa-^S&H8sg>Q+Nc2`4^^{F6^T{e8ZQ_<@G~n(ylc z9Szw)!0#D9kH39^(Hi@IEfX`CC4gX!sq4S)4}Ve;fIvV{BzZ^Sf8E0uZ_7)3tY+kt z+54~U<5}@Cklr@)_wj}js|iI7HkDl8|M|MP2RD3r zk=6G3yZymfClQZZv;Nh;YyJ8E?y{=C?);Ne%%A=jyte1R=e3?3jx*9eKj!S!u9m(Q zA@m?Iwc_v0nI*GNelk95y4e5-Y$`v@NPOCS+~TiKFatxv@$xC>H%_Pk1`mU$tDnm{ Hr-UW|f18sM literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_woodshovel.png b/mods/skylands/textures/skylands_cavorite_tool_woodshovel.png new file mode 100644 index 0000000000000000000000000000000000000000..141f802479a8e2b0ffd5b6b5636eb43b6eb624e6 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(}QwTN%>1K81sna29w( z7Bet#3xhBt!>l+b>zeeiT~46!)jvUy@=%T=SJh1w?B zUUMSWTno}+_)yb*!r|)XjB8VN3LXmJbi3KHvuX9it#RL~cdQd~{nMn`^giz0*GJpd y+M8>B{Ty5H@{jWkwhCGQ3JL#;U6mr==ISrM)?glGY5W1`cLq;aKbLh*2~7Z5@Q*|Q literal 0 HcmV?d00001 diff --git a/mods/skylands/textures/skylands_cavorite_tool_woodsword.png b/mods/skylands/textures/skylands_cavorite_tool_woodsword.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa3dde25947e23ad4604be9aaaea4e982768246 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(}QwTN%>1K81sna29w( z7Bet#3xhBt!>lM-C)l>q7E_k{)hFF|VPFNsdFlm+Ig`j8l zJ$wKC5Oz}wGWF)JNlyTRir>GunL$8!<*fO24^k2mf4IyNzhJt*=IoJz7w6dB7V#Wd zK63$Mi^*ft28pv8YzG#l|NW@mb0q6n2Ww{Id!8j3$38S|U3Q{g@?bpA{(qkZmr5RH z^*p^>@}B!`gAK-l%O#IC>=b|YKfbcWw7I8A=kVk59G + +local technic = technic or {} +technic.concrete_posts = {} + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if intllib then + S = intllib.Getter() +else + S = function(s) return s end +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"), + tile_images = {"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"), + tile_images = {"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"), + tile_images = {"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[5] ~= 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], 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, platform) + local box = {box_center} + 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[4] * 1) + (links[3] * 2) + + (links[2] * 4) + (links[1] * 8) + + (links[5] * 16) +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}, + } + + local links = {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 + -- 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[5] = oldlinks[5] + 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 platform = 0, 1 do + local links = {x1, x2, z1, z2, 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, 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 + diff --git a/mods/technic-master/concrete/locale/de.txt b/mods/technic-master/concrete/locale/de.txt new file mode 100644 index 0000000..83fdc19 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/concrete/locale/template.txt b/mods/technic-master/concrete/locale/template.txt new file mode 100644 index 0000000..451adaf --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/concrete/textures/technic_blast_resistant_concrete_block.png b/mods/technic-master/concrete/textures/technic_blast_resistant_concrete_block.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d8588f4378699fa4c4133c0f157b2006c5eaa4 GIT binary patch literal 311 zcmV-70m%M|P)e5 z!GXgt2os2;d)+GCe}TrJK1dv2>K6t9LSXOr9{>Qyk?uyinE{a0M%%}cq>+s2B~PQ@ z^k=4osv;@LSCE9vlC*fV=9^i}7|F~WqX0Cq%mmP$eLuOxN;e{;ky)8Vx)~%y_{uQW zkE94TF0-!A-f_}0<&$Vvl0>o*`yTBi2_RGF3}zPL&2@I0gU#k$S}>O*MZ`*P)wnr#}G&<1!)y zC~W%v{sR!6<5GIMt3dX4PcX!r_v0>RX1WAIO6;@{0^B{eC7pA2*|YN+Cj&}Ek|_3L zCN(pOA-l&hRChx@>8PTr>uwcEc5}`H>^hNGN$$J5TWAu;NC952`|r<>opao?rApF0 z$P$tQCAB0~OG?M&()sRY(5N~zI-m~3T6{@=LoT@YxJ zg{l(h{hY3#>{6Bgx^8tfqN@h!W4W8%cpW0ujNWetUsFI&lif{;@_LPJ;u)1v&3#|j zr7rFAe$IJ5m6#;eMN(>8=bW#vJ1FS7?(W_7uFf&Iy9*L8(m4yBX^`MNC$XfNfqc;2 qmAGo+>=Kla1W77Ds()0HWcwGgt1aS4)iwqI0000Yxd6vpvqW;(V! zHlBE76_4%6vWk@uMF^=CQD6~~(wCIBVnrAI6#Y)D*?=IBAZV3BP$N-^f=DeaH79fJVR;&F0z&i;*aLn9VYo7qPm?X*2^SldE%9mwXzH$Ws09Kae z6W{kY27^JT*=$~9jBRnw|8WHXfH#!VeE{F|dcD((vE@9^Zy95lD*%i!hm_JH48tp7 z7!IYBb4scE#u)7c003I+UkM?dG)+I5o0~gF2pJ0@ezDfN0RYfa%EyF|m1?zmCW@j} zA;g{#;?NZU0Jsoh*IN5ktJO;D_4=yTdXsZLb_D={w?c^hN~QAka5(HWo6WPF^IMcs z?g{{F?V(cY58wB%j7FmcDP^@NiU(3k>jVG*Qp(>r=eg&3pS4=8^IGc{lgVV?8DNHZ z#yJmawc6!0P1k}TxH}$?-#7yRFr4$JTI)0Ic6%jBl0~icoh-|kD*ymU#@Id2^A?tt zmabZBPZL768Dr8F0M=Tel-ki+U+(w&Unr&Ol+uSn2<-#_078f&%d)*72(AtWgLNT< z&hz|dt+jOmm>uO`Qp$ryqw#IG+g(#iy`D~|&y6u|006)k`&|ezO_F4z-|v4K1i_1= zqoV_7001C_JmZ|JG)+H`<9NL+%bhIC{&WTaUED!e*T)Zb~K$%Z%QeR6Ts{y6s7c0 rQ4}r4*x!`Whf+$7caVqo{ilBc1GJl=xluv200000NkvXXu0mjfdTMa{ literal 0 HcmV?d00001 diff --git a/mods/technic-master/concrete/textures/x32/technic_concrete_block.png b/mods/technic-master/concrete/textures/x32/technic_concrete_block.png new file mode 100644 index 0000000000000000000000000000000000000000..91364f33f5d51e6b83765b15bb57ac1fab0698a6 GIT binary patch literal 2319 zcmV+q3GnubP)#R7{j`*<9PuCBMxgFDP1`4F-AC!lQBBC+eXO+?>){ttOy?;cb3KDose=z z6`U3N7`U7ZKYo1Y^YcNi6=Pso7J_%Q-m%u=oW(lJ+qWC7K`9w)1q?i&2O@$hc;~2f z5JF&CB04&$6s)tT8fsHi2daV*A$pILS{S_%mw*+65n+h|?>z=kRj%ve{nsbP7-~th zT4}8z#>`?wFh)49%yAq5JRVQ1b2uvuRmK?f-Z`&KZH<&OtyN^(Hs0?~z_4u_PQZId z${FVzITvahhzR%llhy}{;pfl)!5HD&+Z!SVYvwn`!2A0L&*R|Z{R3lQ4URDsV}xZ{ zsHL#23){9L+ACtfTA|i5k4`&c3|Gn+W9WU5OXE0Z_acVZw>MgEwANAWC?KMM!H0lz z4kMQ9O57h$6iB&XP(rYX70&a*ZTk%nLhyhmM$c#+=PJ%;PyqcZq|=7w^VcWezr9jg z=XTp^CDU4`sG-z?>job@IcItwgy7N9F#xJK=XiYH+4dcGo)@hT`jr@CP>N%X9vB4g z`Mf`9trKHpT~}&rh_wt=taUsePY}x(1MeN)J5-ezJjZdeZX2~0dLKAvDYX%TL#*JP z;0$2IphFp|)Y>@D3ss0qM8vZ15gmi;Itd~2eHLfdh90_;j!Wun~>tcy3y$@8O56Gn=)_^MBIlTAuUeP|d-yeur zj_cxiCJgYmzy1b544zVi);lRB)WE*27_mGacXSM*cU&pqoCw>tq8O|dK0co~XE9>% z&SEV%=jeUVTF3i9ADw^w`|qS&X{}JJqQK*EV2qNTCj>uP(gv!XkIy@;502wxTNluQ zSV7ixVObVpjHD~E#E7avbzrT*I}h4Oh@GhP&LiS5 zhB-tbV1U*d06*StSZjH?ZFo2NURwhUxpYK?HF|>gIA_t(sb#XnIfq#1Ij%G@TPsF{ z$K#k&o-(CYu9Q%PQVJ<0wryn$#W~?P6V3_F3EQ?1y`}d)uS;g3$CYMbwQ)QTu9OJD zkJ}-wO`$b$dB7jtCcGk+`2^eZQ=2}z5w9~A<)ObiouHEyb=It!&!qd4n+_n80#1{ zbAKLKnR9TS7cVb6A0Ky0tvG90*M&X?0IhYbb&N4^t#^8^EYY)XD~BY`D^E(hg1-p>xb^V4!hxUR%d&{4VV8{T_rZ9E=d zYTtK6rW;}mtn17h>k?p0FYMcjdpu9pH4>aHR7x#T^DC=eB7VN%WWs6!j43OImStsK*BMks z=e!a+qXnQ}AhHY{3{|f474LhB7HGnD!mS^Jojvlh(2S)uhYT@VA;dC^D5 z7;vq1_HDx$_;%ZPKA$t58N<45I5E`LIG!iVy0EM(I+Rip+ZMl+?dIKH378%!Ib)2{ zo$zwo0j0HxdLx1}LMatztwnWUjN$YCVDvHD(;2tCcPwjUS>r@=aG+6mC{Yj}6D>L{GZS>aIww=)jPQobIi;m@D%h{()=DAGFK2}_KWoVmT+V03!#_^@E@ z%nrr~?;oGIF&d9&ruT+5hM~%DKfZIN3&R|s<4oN4jeXy#wbJ_x9k-Vot#wB4^j1-n z(L1NkqrXzYmdX+X06Ax_bRotPLcmT=SaL3e5LwsA@jN-Nix?cvI=T*Gh+L`A+QHCi zyluN-bnyFcZ+v_{$)#fLG-S$!S{uE0#5k@i5tlgsi)CHnTzMF z&Y9ylamSg!7;gK pLtt4vs){OL46SuST)w)8{{?77tH*U*h@Aic002ovPDHLkV1g4LUh)6{ literal 0 HcmV?d00001 diff --git a/mods/technic-master/concrete/textures/x32/technic_rebar.png b/mods/technic-master/concrete/textures/x32/technic_rebar.png new file mode 100644 index 0000000000000000000000000000000000000000..16d1fc541cd007378cc0ced0ca55127ec9d11952 GIT binary patch literal 813 zcmV+|1JeA7P)Yxd6vpvqW;(V! zHlBE76_4%6vWk@uMF^=CQD6~~(wCIBVnrAI6#Y)D*?=IBAZV3BP$N-^f=DeaH79fJVR;&F0z&i;*aLn9VYo7qPm?X*2^SldE%9mwXzH$Ws09Kae z6W{kY27^JT*=$~9jBRnw|8WHXfH#!VeE{F|dcD((vE@9^Zy95lD*%i!hm_JH48tp7 z7!IYBb4scE#u)7c003I+UkM?dG)+I5o0~gF2pJ0@ezDfN0RYfa%EyF|m1?zmCW@j} zA;g{#;?NZU0Jsoh*IN5ktJO;D_4=yTdXsZLb_D={w?c^hN~QAka5(HWo6WPF^IMcs z?g{{F?V(cY58wB%j7FmcDP^@NiU(3k>jVG*Qp(>r=eg&3pS4=8^IGc{lgVV?8DNHZ z#yJmawc6!0P1k}TxH}$?-#7yRFr4$JTI)0Ic6%jBl0~icoh-|kD*ymU#@Id2^A?tt zmabZBPZL768Dr8F0M=Tel-ki+U+(w&Unr&Ol+uSn2<-#_078f&%d)*72(AtWgLNT< z&hz|dt+jOmm>uO`Qp$ryqw#IG+g(#iy`D~|&y6u|006)k`&|ezO_F4z-|v4K1i_1= zqoV_7001C_JmZ|JG)+H`<9NL+%bhIC{&WTaUED!e*T)Zb~K$%Z%QeR6Ts{y6s7c0 rQ4}r4*x!`Whf+$7caVqo{ilBc1GJl=xluv200000NkvXXu0mjfdTMa{ literal 0 HcmV?d00001 diff --git a/mods/technic-master/extranodes/depends.txt b/mods/technic-master/extranodes/depends.txt new file mode 100644 index 0000000..6271875 --- /dev/null +++ b/mods/technic-master/extranodes/depends.txt @@ -0,0 +1,6 @@ +default +moreblocks +technic_worldgen +concrete +intllib? + diff --git a/mods/technic-master/extranodes/init.lua b/mods/technic-master/extranodes/init.lua new file mode 100644 index 0000000..934193f --- /dev/null +++ b/mods/technic-master/extranodes/init.lua @@ -0,0 +1,86 @@ +-- Minetest 0.4.6 mod: extranodes +-- namespace: technic +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if intllib then + S = intllib.Getter() +else + S = function(s) return s end +end +--register stairslike nodes +register_stair_slab_panel_micro("technic", "marble", "technic:marble", + {cracky=2, not_in_creative_inventory=1}, + {"technic_marble.png"}, + S("Marble"), + "marble", + "facedir", + 0) + +register_stair_slab_panel_micro("technic", "marble_bricks", "technic:marble_bricks", + {cracky=2, not_in_creative_inventory=1}, + {"technic_marble_bricks.png"}, + S("Marble Bricks"), + "marble_bricks", + "facedir", + 0) + +register_stair_slab_panel_micro("technic", "granite", "technic:granite", + {cracky=1, not_in_creative_inventory=1}, + {"technic_granite.png"}, + S("Granite"), + "granite", + "facedir", + 0) + +register_stair_slab_panel_micro("technic", "concrete", "technic:concrete", + {cracky=3, not_in_creative_inventory=1}, + {"technic_concrete_block.png"}, + S("Concrete"), + "concrete", + "facedir", + 0) + +--register nodes in circular saw if aviable +if circular_saw then + for i,v in ipairs({"concrete", "marble", "marble_bricks", "granite", "default:obsidian"}) do + table.insert(circular_saw.known_stairs, "technic:" ..v); + end +end + + +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") diff --git a/mods/technic-master/extranodes/locale/de.txt b/mods/technic-master/extranodes/locale/de.txt new file mode 100644 index 0000000..f3c017e --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/extranodes/locale/template.txt b/mods/technic-master/extranodes/locale/template.txt new file mode 100644 index 0000000..2ffe498 --- /dev/null +++ b/mods/technic-master/extranodes/locale/template.txt @@ -0,0 +1,7 @@ +# technic_extranodes translation template + +Marble = +Marble Bricks = +Granite = +Concrete = + diff --git a/mods/technic-master/manual.md b/mods/technic-master/manual.md new file mode 100644 index 0000000..fb21f45 --- /dev/null +++ b/mods/technic-master/manual.md @@ -0,0 +1,821 @@ +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 simply cooking the latex, with each +latex lump producing one lump of rubber. If you have an extractor, +however, the latex is better processed there: each latex lump will +produce three lumps of rubber. + +### 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. + +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×4 (32) slots +2. iron chest: 9×5 (45) slots +3. copper chest: 12×5 (60) slots +4. silver chest: 12×6 (72) slots +5. gold chest: 15×6 (90) slots +6. mithril chest: 15×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. + +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. Due to a bug, +the switching station will visually appear to connect to cables on other +sides, but those connections don't do anything. + +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. + +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, centred 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×511×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×16×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: + +* substances + * concrete +* powered machines + * machine upgrades + * how machines interact with tubes + * battery box + * processing machines + * CNC machine + * music player + * tool workshop + * forcefield emitter + * quarry +* power generators + * hydro + * geothermal + * fuel-fired + * wind + * solar + * nuclear +* tools + * tool charging + * battery and energy crystals + * chainsaw + * flashlight + * mining lasers + * liquid cans + * mining drills + * prospector + * sonic screwdriver + * wrench +* radioactivity +* frames +* templates diff --git a/mods/technic-master/modpack.txt b/mods/technic-master/modpack.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/mods/technic-master/modpack.txt @@ -0,0 +1 @@ + diff --git a/mods/technic-master/technic/README.md b/mods/technic-master/technic/README.md new file mode 100644 index 0000000..89e838b --- /dev/null +++ b/mods/technic-master/technic/README.md @@ -0,0 +1,24 @@ +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 + +RealBadAngel: (WTFPL) + * Everything else. + +CC BY-SA 3.0: diff --git a/mods/technic-master/technic/config.lua b/mods/technic-master/technic/config.lua new file mode 100644 index 0000000..e512bee --- /dev/null +++ b/mods/technic-master/technic/config.lua @@ -0,0 +1,17 @@ +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_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/mods/technic-master/technic/crafts.lua b/mods/technic-master/technic/crafts.lua new file mode 100644 index 0000000..29ff0d0 --- /dev/null +++ b/mods/technic-master/technic/crafts.lua @@ -0,0 +1,202 @@ +-- 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'}, + } +}) + +minetest.register_craft({ + output = 'technic:lv_transformer', + recipe = { + {'mesecons_materials:fiber', 'technic:wrought_iron_ingot', 'mesecons_materials:fiber'}, + {'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 = { + {'mesecons_materials:fiber', 'technic:carbon_steel_ingot', 'mesecons_materials:fiber'}, + {'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 = { + {'mesecons_materials:fiber', 'technic:stainless_steel_ingot', 'mesecons_materials:fiber'}, + {'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 +minetest.register_craftitem("technic:nothing", { + description = "", + inventory_image = "blank.png", + groups = { not_in_creative_inventory = 1 }, +}) + +if minetest.register_craft_predict then + minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack:get_name() == "technic:nothing" then + return ItemStack("") + end + end) +end + +-- Bronze +minetest.register_craft({ + type = "shapeless", + output = "technic:nothing", + recipe = {"default:copper_ingot", "default:steel_ingot"} +}) + +-- Accelerator tube +minetest.register_craft({ + output = "technic:nothing", + 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 = "technic:nothing", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:desert_stone", "default:mese_block", "default:desert_stone" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + diff --git a/mods/technic-master/technic/depends.txt b/mods/technic-master/technic/depends.txt new file mode 100644 index 0000000..c2671c5 --- /dev/null +++ b/mods/technic-master/technic/depends.txt @@ -0,0 +1,7 @@ +default +pipeworks +technic_worldgen +bucket? +mesecons_mvps? +intllib? +unified_inventory? diff --git a/mods/technic-master/technic/helpers.lua b/mods/technic-master/technic/helpers.lua new file mode 100644 index 0000000..c07937a --- /dev/null +++ b/mods/technic-master/technic/helpers.lua @@ -0,0 +1,38 @@ +-- 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 + diff --git a/mods/technic-master/technic/init.lua b/mods/technic-master/technic/init.lua new file mode 100644 index 0000000..28427da --- /dev/null +++ b/mods/technic-master/technic/init.lua @@ -0,0 +1,53 @@ +-- Minetest 0.4.7 mod: technic +-- namespace: technic +-- (c) 2012-2013 by RealBadAngel + +technic = technic or {} + +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 intllib then + technic.getter = intllib.Getter() +else + technic.getter = function(s) return s 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/mods/technic-master/technic/items.lua b/mods/technic-master/technic/items.lua new file mode 100644 index 0000000..3c00dd9 --- /dev/null +++ b/mods/technic-master/technic/items.lua @@ -0,0 +1,225 @@ + +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: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: + -- 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=1. This yields radioactive=2 + -- for a fully-depleted uranium block and radioactive=5 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(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/mods/technic-master/technic/legacy.lua b/mods/technic-master/technic/legacy.lua new file mode 100644 index 0000000..8360a71 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/locale/de.txt b/mods/technic-master/technic/locale/de.txt new file mode 100644 index 0000000..31ea107 --- /dev/null +++ b/mods/technic-master/technic/locale/de.txt @@ -0,0 +1,199 @@ +# 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) +%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 +%s Battery Box: %d/%d = %s Batteriebox: %d/%d +# $1: Machine name $2: Supply $3: Demand +%s. Supply: %d Demand: %d = %s. Versorgung: %d Bedarf: %d +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 = + +## 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/mods/technic-master/technic/locale/es.txt b/mods/technic-master/technic/locale/es.txt new file mode 100644 index 0000000..80a5736 --- /dev/null +++ b/mods/technic-master/technic/locale/es.txt @@ -0,0 +1,192 @@ +# Spanish Translation for Technic Mod +# Traduccion al Español del Mod Technic +# Autor: Diego Martínez + +## 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) +%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 +%s Battery Box: %d/%d = Caja de Bateria %s: %d/%d +# $1: Machine name $2: Supply $3: Demand +%s. Supply: %d Demand: %d = %s. Alimentacion: %d Demanda: %d +# $1: Production percent +Production at %d%% = Produccion en %d%% +Stopped = +Keeping %d/%d map blocks loaded = + +## 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/mods/technic-master/technic/locale/it.txt b/mods/technic-master/technic/locale/it.txt new file mode 100644 index 0000000..4ad5a97 --- /dev/null +++ b/mods/technic-master/technic/locale/it.txt @@ -0,0 +1,196 @@ + +## 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) +%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 +%s Battery Box: %d/%d = %s Box Batterie: %d/%d +# $1: Machine name $2: Supply $3: Demand +%s. Supply: %d Demand: %d = %s. Prodotto: %d Consumato: %d +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 = + +## 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/mods/technic-master/technic/locale/template.txt b/mods/technic-master/technic/locale/template.txt new file mode 100644 index 0000000..4df3586 --- /dev/null +++ b/mods/technic-master/technic/locale/template.txt @@ -0,0 +1,205 @@ +# 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) +%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 +%s Battery Box: %d/%d = +# $1: Machine name $2: Supply $3: Demand +%s. Supply: %d Demand: %d = +Production at %d%% = +Choose Milling Program: = +Slim Elements half / normal height: = +Current track %s = +Stopped = +Keeping %d/%d map blocks loaded = + +## 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/mods/technic-master/technic/machines/HV/battery_box.lua b/mods/technic-master/technic/machines/HV/battery_box.lua new file mode 100644 index 0000000..1e054ec --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/HV/cables.lua b/mods/technic-master/technic/machines/HV/cables.lua new file mode 100644 index 0000000..25297c8 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/HV/forcefield.lua b/mods/technic-master/technic/machines/HV/forcefield.lua new file mode 100644 index 0000000..fadc9cb --- /dev/null +++ b/mods/technic-master/technic/machines/HV/forcefield.lua @@ -0,0 +1,243 @@ +-- Forcefield mod by ShadowNinja +-- Modified by kpoppel +-- +-- Forcefields are powerful barriers but they consume huge amounts of power. +-- Forcefield Generator is a HV machine. + +-- How expensive is the generator? +-- Leaves room for upgrades lowering the power drain? +local forcefield_power_drain = 10 +local forcefield_step_interval = 1 + +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' }, + } +}) + + +-- 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) + local shape = meta:get_int("shape") + local range = meta:get_int("range") + local vm = VoxelManip() + local p1 = {x = pos.x-range, y = pos.y-range, z = pos.z-range} + local p2 = {x = pos.x+range, y = pos.y+range, z = pos.z+range} + local MinEdge, MaxEdge = vm:read_from_map(p1, p2) + 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 + relevant = + x*x+y*y+z*z <= range * range + range and + x*x+y*y+z*z >= (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 + if active and data[vi] == c_air then + data[vi] = c_field + elseif not active and data[vi] == 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() + vm:update_map() +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 run = function(pos, node, active_object_count, active_object_count_wider) + 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 + if node.name == "technic:forcefield_emitter_off" then + technic.swap_node(pos, "technic:forcefield_emitter_on") + meta:set_string("infotext", S("%s Active"):format(machine_name)) + end + update_forcefield(pos, meta, true) + 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, unbreakable=1}, + paramtype = "light", + light_source = 15, + 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/mods/technic-master/technic/machines/HV/generator.lua b/mods/technic-master/technic/machines/HV/generator.lua new file mode 100644 index 0000000..aa83590 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/HV/init.lua b/mods/technic-master/technic/machines/HV/init.lua new file mode 100644 index 0000000..d7136b4 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/HV/nuclear_reactor.lua b/mods/technic-master/technic/machines/HV/nuclear_reactor.lua new file mode 100644 index 0000000..b57faa7 --- /dev/null +++ b/mods/technic-master/technic/machines/HV/nuclear_reactor.lua @@ -0,0 +1,715 @@ +-- 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;]" + +-- "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=7, 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 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 + end + + meta:set_int("burn_time", burn_time + 1) + local timer = minetest.get_node_timer(pos) + timer:start(1) + 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: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 metres from a node at which an +-- unshielded player will be damaged by 0.25 HP/s. Or, equivalently, it +-- is half 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 radiation resistance values from the sampled nodes yield +-- a measure of the total amount of radiation resistance on the path. +-- As in reality, shielding causes exponential attenuation of radiation. +-- However, the effect is scaled down relative to real life: each +-- metre-point of shielding, corresponding to a real-life halving of +-- radiation, reduces radiation by 0.01 nepers (a factor of about 1.01). +-- This 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) +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 + 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 resistance = 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 + resistance = resistance + node_radiation_resistance(minetest.get_node(intnodepos).name) + end + end + local dmg_rate = 0.25 * strength*strength * math.exp(-0.0025*resistance) / 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, +}) + +-- radioactive materials that can result from destroying a reactor + +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 = 1, + radioactive = (state == "source" and 32 or 16), + 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=5, 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, +}) + +minetest.register_abm({ + nodenames = {"technic:corium_flowing"}, + neighbors = {"group:water"}, + interval = 1, + chance = 1, + action = function (pos, node) + minetest.set_node(pos, {name="technic:chernobylite_block"}) + end, +}) + +local griefing = technic.config:get_bool("enable_corium_griefing") + +minetest.register_abm({ + nodenames = {"technic:corium_flowing"}, + interval = 5, + chance = (griefing and 10 or 1), + action = function (pos, node) + minetest.set_node(pos, {name="technic:chernobylite_block"}) + end, +}) + +if griefing then + 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/mods/technic-master/technic/machines/HV/quarry.lua b/mods/technic-master/technic/machines/HV/quarry.lua new file mode 100644 index 0000000..10c0ee0 --- /dev/null +++ b/mods/technic-master/technic/machines/HV/quarry.lua @@ -0,0 +1,184 @@ + +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 function set_quarry_formspec(meta) + local formspec = "size[3,1.5]".. + "field[1,0.5;2,1;size;Radius;"..meta:get_int("size").."]" + if meta:get_int("enabled") == 0 then + formspec = formspec.."button[0,1;3,1;enable;"..S("%s Disabled"):format(S("%s Quarry"):format("HV")).."]" + else + formspec = formspec.."button[0,1;3,1;disable;"..S("%s Enabled"):format(S("%s Quarry"):format("HV")).."]" + end + meta:set_string("formspec", formspec) +end + +local function quarry_receive_fields(pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + if fields.size then + local size = tonumber(fields.size) or 0 + size = math.max(size, 2) + size = math.min(size, 8) + meta:set_int("size", size) + end + if fields.enable then meta:set_int("enabled", 1) end + if fields.disable then meta:set_int("enabled", 0) end + set_quarry_formspec(meta) +end + +local function get_quarry_center(pos, size) + local node = minetest.get_node(pos) + local back_dir = minetest.facedir_to_dir(node.param2) + local relative_center = vector.multiply(back_dir, size + 1) + local center = vector.add(pos, relative_center) + return center +end + +local function gen_next_digpos(center, digpos, size) + digpos.x = digpos.x + 1 + if digpos.x > center.x + size then + digpos.x = center.x - size + digpos.z = digpos.z + 1 + end + if digpos.z > center.z + size then + digpos.x = center.x - size + digpos.z = center.z - size + digpos.y = digpos.y - 1 + end +end + +local function find_next_digpos(data, area, center, dig_y, size) + local c_air = minetest.get_content_id("air") + + for y = center.y + quarry_dig_above_nodes, dig_y - 1, -1 do + for z = center.z - size, center.z + size do + for x = center.x - size, center.x + size do + if data[area:index(x, y, z)] ~= c_air then + return vector.new(x, y, z) + end + end + end + end +end + +local function quarry_dig(pos, center, size) + local meta = minetest.get_meta(pos) + local drops = {} + local dig_y = meta:get_int("dig_y") + local owner = meta:get_string("owner") + + local vm = VoxelManip() + local p1 = vector.new( + center.x - size, + center.y + quarry_dig_above_nodes, + center.z - size) + local p2 = vector.new( + center.x + size, + dig_y - 1, -- One node lower in case we have finished the current layer + center.z + size) + local e1, e2 = vm:read_from_map(p1, p2) + local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2}) + local data = vm:get_data() + + local digpos = find_next_digpos(data, area, center, dig_y, size) + + if digpos then + if digpos.y < pos.y - quarry_max_depth then + meta:set_int("dig_y", digpos.y) + return drops + end + if minetest.is_protected and minetest.is_protected(digpos, owner) then + meta:set_int("enabled", 0) + set_quarry_formspec(meta) + return {} + end + dig_y = digpos.y + local node = minetest.get_node(digpos) + local node_def = minetest.registered_nodes[node.name] or { diggable = false } + if node_def.diggable and ((not node_def.can_dig) or node_def.can_dig(digpos, nil)) then + minetest.remove_node(digpos) + drops = minetest.get_node_drops(node.name, "") + end + elseif not (dig_y < pos.y - quarry_max_depth) then + dig_y = dig_y - 16 + end + + meta:set_int("dig_y", dig_y) + return drops +end + +local function send_items(items, pos, node) + for _, item in pairs(items) do + technic.tube_inject_item(pos, pos, vector.new(0, 1, 0), item) + end +end + +local run = function(pos, node) + local meta = minetest.get_meta(pos) + local size = meta:get_int("size") + local eu_input = meta:get_int("HV_EU_input") + local demand = 10000 + local center = get_quarry_center(pos, size) + local dig_y = meta:get_int("dig_y") + local machine_name = S("%s Quarry"):format("HV") + + if meta:get_int("enabled") == 0 then + meta:set_string("infotext", S("%s Disabled"):format(machine_name)) + meta:set_int("HV_EU_demand", 0) + return + end + + if eu_input < demand then + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + elseif eu_input >= demand then + meta:set_string("infotext", S("%s Active"):format(machine_name)) + + local items = quarry_dig(pos, center, size) + send_items(items, pos, node) + + if dig_y < pos.y - quarry_max_depth then + meta:set_string("infotext", S("%s Finished"):format(machine_name)) + end + end + meta:set_int("HV_EU_demand", demand) +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"}, + 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) + meta:set_int("dig_y", pos.y) + 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, + after_dig_node = pipeworks.scan_for_tube_objects, + on_receive_fields = quarry_receive_fields, + technic_run = run, +}) + +technic.register_machine("HV", "technic:quarry", technic.receiver) + diff --git a/mods/technic-master/technic/machines/HV/solar_array.lua b/mods/technic-master/technic/machines/HV/solar_array.lua new file mode 100644 index 0000000..414291a --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/alloy_furnace.lua b/mods/technic-master/technic/machines/LV/alloy_furnace.lua new file mode 100644 index 0000000..bdf2f31 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/battery_box.lua b/mods/technic-master/technic/machines/LV/battery_box.lua new file mode 100644 index 0000000..429bcd6 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/cables.lua b/mods/technic-master/technic/machines/LV/cables.lua new file mode 100644 index 0000000..e18eae1 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/cnc.lua b/mods/technic-master/technic/machines/LV/cnc.lua new file mode 100644 index 0000000..2a89a7a --- /dev/null +++ b/mods/technic-master/technic/machines/LV/cnc.lua @@ -0,0 +1,231 @@ +-- 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, + 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_sphere.png;sphere; ]".. + "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[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;]" + +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/mods/technic-master/technic/machines/LV/cnc_api.lua b/mods/technic-master/technic/machines/LV/cnc_api.lua new file mode 100644 index 0000000..58708c9 --- /dev/null +++ b/mods/technic-master/technic/machines/LV/cnc_api.lua @@ -0,0 +1,356 @@ +-- 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 = {} + +technic.cnc.detail_level = 16 + +-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES: +------------------------------------------------------ +local function cnc_sphere() + local nodebox = {} + local detail = technic.cnc.detail_level + local sehne + for i = 1, detail - 1 do + sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) + nodebox[i]={-sehne, (i/detail) - 0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne} + end + return nodebox +end + +local function cnc_cylinder_horizontal() + local nodebox = {} + local detail = technic.cnc.detail_level + local sehne + for i = 1, detail - 1 do + sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) + nodebox[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne} + end + return nodebox +end + +local function cnc_cylinder() + local nodebox = {} + local detail = technic.cnc.detail_level + local sehne + for i = 1, detail - 1 do + sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) + nodebox[i]={(i/detail) - 0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne} + end + return nodebox +end + +local function cnc_twocurvededge() + local nodebox = {} + local detail = technic.cnc.detail_level * 2 + local sehne + for i = (detail / 2) - 1, detail - 1 do + sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) + nodebox[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5} + end + return nodebox +end + +local function cnc_onecurvededge() + local nodebox = {} + local detail = technic.cnc.detail_level * 2 + local sehne + for i = (detail / 2) - 1, detail - 1 do + sehne = math.sqrt(0.25 - (((i / detail) - 0.5) ^ 2)) + nodebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5} + end + return nodebox +end + +local function cnc_spike() + local nodebox = {} + local detail = technic.cnc.detail_level + for i = 0, detail - 1 do + nodebox[i+1] = {(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, + 0.5-(i/detail/2), (i/detail)-0.5+(1/detail), 0.5-(i/detail/2)} + end + return nodebox +end + +local function cnc_pyramid() + local nodebox = {} + local detail = technic.cnc.detail_level / 2 + for i = 0, detail - 1 do + nodebox[i+1] = {(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail/2)-0.5+(1/detail), 0.5-(i/detail/2)} + end + return nodebox +end + +local function cnc_slope_inner_edge_upsdown() + local nodebox = {} + local detail = technic.cnc.detail_level + for i = 0, detail-1 do + nodebox[i+1] = {0.5-(i/detail)-(1/detail), (i/detail)-0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} + nodebox[i+detail+1] = {-0.5, (i/detail)-0.5, 0.5-(i/detail)-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5} + end + return nodebox +end + +local function cnc_slope_edge_upsdown() + local nodebox = {} + local detail = technic.cnc.detail_level + for i = 0, detail-1 do + nodebox[i+1] = {(-1*(i/detail))+0.5-(1/detail), (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5} + end + return nodebox +end + +local function cnc_slope_inner_edge() + local nodebox = {} + local detail = technic.cnc.detail_level + for i = 0, detail-1 do + nodebox[i+1] = {(i/detail)-0.5, -0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} + nodebox[i+detail+1] = {-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} + end + return nodebox +end + +local function cnc_slope_edge() + local nodebox = {} + local detail = technic.cnc.detail_level + for i = 0, detail-1 do + nodebox[i+1] = {(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} + end + return nodebox +end + +local function cnc_slope_upsdown() + local nodebox = {} + local detail = technic.cnc.detail_level + for i = 0, detail-1 do + nodebox[i+1] = {-0.5, (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5} + end + return nodebox +end + +local function cnc_slope_lying() + local nodebox = {} + local detail = technic.cnc.detail_level + for i = 0, detail-1 do + nodebox[i+1] = {(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5} + end + return nodebox +end + +local function cnc_slope() + local nodebox = {} + local detail = technic.cnc.detail_level + for i = 0, detail-1 do + nodebox[i+1] = {-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5} + end + return nodebox +end + +-- Define slope boxes for the various nodes +------------------------------------------- +technic.cnc.programs = { + {suffix = "technic_cnc_stick", + nodebox = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}, + desc = S("Stick")}, + + {suffix = "technic_cnc_element_end_double", + nodebox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5}, + desc = S("Element End Double")}, + + {suffix = "technic_cnc_element_cross_double", + nodebox = { + {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", + nodebox = { + {-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", + nodebox = { + {-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", + nodebox = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5}, + desc = S("Element Straight Double")}, + + {suffix = "technic_cnc_element_end", + nodebox = {-0.3, -0.5, -0.3, 0.3, 0, 0.5}, + desc = S("Element End")}, + + {suffix = "technic_cnc_element_cross", + nodebox = { + {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", + nodebox = { + {-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", + nodebox = { + {-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", + nodebox = {-0.3, -0.5, -0.5, 0.3, 0, 0.5}, + desc = S("Element Straight")}, + + {suffix = "technic_cnc_sphere", + nodebox = cnc_sphere(), + desc = S("Sphere")}, + + {suffix = "technic_cnc_cylinder_horizontal", + nodebox = cnc_cylinder_horizontal(), + desc = S("Horizontal Cylinder")}, + + {suffix = "technic_cnc_cylinder", + nodebox = cnc_cylinder(), + desc = S("Cylinder")}, + + {suffix = "technic_cnc_twocurvededge", + nodebox = cnc_twocurvededge(), + desc = S("Two Curved Edge Block")}, + + {suffix = "technic_cnc_onecurvededge", + nodebox = cnc_onecurvededge(), + desc = S("One Curved Edge Block")}, + + {suffix = "technic_cnc_spike", + nodebox = cnc_spike(), + desc = S("Spike")}, + + {suffix = "technic_cnc_pyramid", + nodebox = cnc_pyramid(), + desc = S("Pyramid")}, + + {suffix = "technic_cnc_slope_inner_edge_upsdown", + nodebox = cnc_slope_inner_edge_upsdown(), + desc = S("Slope Upside Down Inner Edge")}, + + {suffix = "technic_cnc_slope_edge_upsdown", + nodebox = cnc_slope_edge_upsdown(), + desc = S("Slope Upside Down Edge")}, + + {suffix = "technic_cnc_slope_inner_edge", + nodebox = cnc_slope_inner_edge(), + desc = S("Slope Inner Edge")}, + + {suffix = "technic_cnc_slope_edge", + nodebox = cnc_slope_edge(), + desc = S("Slope Edge")}, + + {suffix = "technic_cnc_slope_upsdown", + nodebox = cnc_slope_upsdown(), + desc = S("Slope Upside Down")}, + + {suffix = "technic_cnc_slope_lying", + nodebox = cnc_slope_lying(), + desc = S("Slope Lying")}, + + {suffix = "technic_cnc_slope", + nodebox = cnc_slope(), + desc = S("Slope")}, +} + +-- 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_sphere", "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, nodebox, groups, images, description) + minetest.register_node(":"..recipeitem.."_"..suffix, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + node_box = { + type = "fixed", + fixed = nodebox + }, + groups = groups, + }) +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.nodebox, groups, images, description.." "..data.desc) + 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_sphere, 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_sphere(recipeitem, groups, images, desc_sphere) + 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/mods/technic-master/technic/machines/LV/cnc_nodes.lua b/mods/technic-master/technic/machines/LV/cnc_nodes.lua new file mode 100644 index 0000000..b250bc8 --- /dev/null +++ b/mods/technic-master/technic/machines/LV/cnc_nodes.lua @@ -0,0 +1,96 @@ +-- 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")) +technic.cnc.programs_disable["default:dirt"] = {"technic_cnc_sphere", "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"} + +-- 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/mods/technic-master/technic/machines/LV/coal_alloy_furnace.lua b/mods/technic-master/technic/machines/LV/coal_alloy_furnace.lua new file mode 100644 index 0000000..a149921 --- /dev/null +++ b/mods/technic-master/technic/machines/LV/coal_alloy_furnace.lua @@ -0,0 +1,165 @@ + +-- 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;]" + +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.env: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;]") + 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/mods/technic-master/technic/machines/LV/coal_furnace.lua b/mods/technic-master/technic/machines/LV/coal_furnace.lua new file mode 100644 index 0000000..53a0f8b --- /dev/null +++ b/mods/technic-master/technic/machines/LV/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/mods/technic-master/technic/machines/LV/compressor.lua b/mods/technic-master/technic/machines/LV/compressor.lua new file mode 100644 index 0000000..e2bde40 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/electric_furnace.lua b/mods/technic-master/technic/machines/LV/electric_furnace.lua new file mode 100644 index 0000000..cc4daff --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/extractor.lua b/mods/technic-master/technic/machines/LV/extractor.lua new file mode 100644 index 0000000..363d2e3 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/generator.lua b/mods/technic-master/technic/machines/LV/generator.lua new file mode 100644 index 0000000..999dbc5 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/geothermal.lua b/mods/technic-master/technic/machines/LV/geothermal.lua new file mode 100644 index 0000000..e88d3c9 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/grinder.lua b/mods/technic-master/technic/machines/LV/grinder.lua new file mode 100644 index 0000000..0ea8aeb --- /dev/null +++ b/mods/technic-master/technic/machines/LV/grinder.lua @@ -0,0 +1,13 @@ + +minetest.register_alias("grinder", "technic:grinder") +minetest.register_craft({ + output = 'technic: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/mods/technic-master/technic/machines/LV/init.lua b/mods/technic-master/technic/machines/LV/init.lua new file mode 100644 index 0000000..f8778cd --- /dev/null +++ b/mods/technic-master/technic/machines/LV/init.lua @@ -0,0 +1,33 @@ + +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") + +-- Coal-powered machines (TODO -> move to somewhere else?) +dofile(path.."/coal_alloy_furnace.lua") +dofile(path.."/coal_furnace.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/mods/technic-master/technic/machines/LV/music_player.lua b/mods/technic-master/technic/machines/LV/music_player.lua new file mode 100644 index 0000000..dc7e2d0 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/solar_array.lua b/mods/technic-master/technic/machines/LV/solar_array.lua new file mode 100644 index 0000000..4d2c3b3 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/LV/solar_panel.lua b/mods/technic-master/technic/machines/LV/solar_panel.lua new file mode 100644 index 0000000..959de52 --- /dev/null +++ b/mods/technic-master/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("%s Active"):format(machine_name).." ("..charge_to_give.."EU)") + 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/mods/technic-master/technic/machines/LV/water_mill.lua b/mods/technic-master/technic/machines/LV/water_mill.lua new file mode 100644 index 0000000..9088d1d --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/alloy_furnace.lua b/mods/technic-master/technic/machines/MV/alloy_furnace.lua new file mode 100644 index 0000000..a1918fd --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/battery_box.lua b/mods/technic-master/technic/machines/MV/battery_box.lua new file mode 100644 index 0000000..45437c1 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/cables.lua b/mods/technic-master/technic/machines/MV/cables.lua new file mode 100644 index 0000000..b1a34c8 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/centrifuge.lua b/mods/technic-master/technic/machines/MV/centrifuge.lua new file mode 100644 index 0000000..5bf24bf --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/compressor.lua b/mods/technic-master/technic/machines/MV/compressor.lua new file mode 100644 index 0000000..5b36cc5 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/electric_furnace.lua b/mods/technic-master/technic/machines/MV/electric_furnace.lua new file mode 100644 index 0000000..1f6b1c2 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/extractor.lua b/mods/technic-master/technic/machines/MV/extractor.lua new file mode 100644 index 0000000..fdef5b2 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/generator.lua b/mods/technic-master/technic/machines/MV/generator.lua new file mode 100644 index 0000000..4ae24b8 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/grinder.lua b/mods/technic-master/technic/machines/MV/grinder.lua new file mode 100644 index 0000000..dac536c --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/init.lua b/mods/technic-master/technic/machines/MV/init.lua new file mode 100644 index 0000000..72a98b6 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/lighting.lua b/mods/technic-master/technic/machines/MV/lighting.lua new file mode 100644 index 0000000..76fcb20 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/power_radiator.lua b/mods/technic-master/technic/machines/MV/power_radiator.lua new file mode 100644 index 0000000..4f9a837 --- /dev/null +++ b/mods/technic-master/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 _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.env: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/mods/technic-master/technic/machines/MV/solar_array.lua b/mods/technic-master/technic/machines/MV/solar_array.lua new file mode 100644 index 0000000..227d8ee --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/MV/tool_workshop.lua b/mods/technic-master/technic/machines/MV/tool_workshop.lua new file mode 100644 index 0000000..1026718 --- /dev/null +++ b/mods/technic-master/technic/machines/MV/tool_workshop.lua @@ -0,0 +1,85 @@ +-- 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_formspec = + "invsize[8,9;]".. + "list[current_name;src;3,1;1,1;]".. + "label[0,0;"..S("%s Tool Workshop"):format("MV").."]".. + "list[current_player;main;0,5;8,4;]" + +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" + local demand = 5000 + + -- Setup meta data if it does not exist. + if not eu_input then + meta:set_int("MV_EU_demand", demand) + meta:set_int("MV_EU_input", 0) + return + end + + 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 + 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 < demand then + meta:set_string("infotext", S("%s Unpowered"):format(machine_name)) + elseif eu_input >= demand 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", demand) +end + +minetest.register_node("technic:tool_workshop", { + description = S("%s Tool Workshop"):format("MV"), + 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}, + 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) + end, + can_dig = technic.machine_can_dig, + allow_metadata_inventory_put = technic.machine_inventory_put, + allow_metadata_inventory_take = technic.machine_inventory_take, + technic_run = run, +}) + +technic.register_machine("MV", "technic:tool_workshop", technic.receiver) + diff --git a/mods/technic-master/technic/machines/MV/wind_mill.lua b/mods/technic-master/technic/machines/MV/wind_mill.lua new file mode 100644 index 0000000..4d63ddc --- /dev/null +++ b/mods/technic-master/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", machine_name.." ("..power.."EU)") +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/mods/technic-master/technic/machines/init.lua b/mods/technic-master/technic/machines/init.lua new file mode 100644 index 0000000..ad79eab --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/other/anchor.lua b/mods/technic-master/technic/machines/other/anchor.lua new file mode 100644 index 0000000..1c15bd2 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/other/constructor.lua b/mods/technic-master/technic/machines/other/constructor.lua new file mode 100644 index 0000000..3396ac7 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/other/frames.lua b/mods/technic-master/technic/machines/other/frames.lua new file mode 100644 index 0000000..427e60b --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/other/init.lua b/mods/technic-master/technic/machines/other/init.lua new file mode 100644 index 0000000..27a47d5 --- /dev/null +++ b/mods/technic-master/technic/machines/other/init.lua @@ -0,0 +1,9 @@ +local path = technic.modpath.."/machines/other" + +-- mesecons and tubes related +dofile(path.."/injector.lua") +dofile(path.."/constructor.lua") +if minetest.get_modpath("mesecons_mvps") ~= nil then + dofile(path.."/frames.lua") +end +dofile(path.."/anchor.lua") diff --git a/mods/technic-master/technic/machines/other/injector.lua b/mods/technic-master/technic/machines/other/injector.lua new file mode 100644 index 0000000..36c2592 --- /dev/null +++ b/mods/technic-master/technic/machines/other/injector.lua @@ -0,0 +1,107 @@ + +local S = technic.getter + +local function inject_items (pos) + local meta=minetest.env: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;]") +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}, + tube = {connect_sides={bottom=1}}, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.env: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.env: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.env: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, +}) + +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/mods/technic-master/technic/machines/register/alloy_furnace.lua b/mods/technic-master/technic/machines/register/alloy_furnace.lua new file mode 100644 index 0000000..879e528 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/register/alloy_recipes.lua b/mods/technic-master/technic/machines/register/alloy_recipes.lua new file mode 100644 index 0000000..86fe87d --- /dev/null +++ b/mods/technic-master/technic/machines/register/alloy_recipes.lua @@ -0,0 +1,31 @@ + +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"}, +} + +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/mods/technic-master/technic/machines/register/battery_box.lua b/mods/technic-master/technic/machines/register/battery_box.lua new file mode 100644 index 0000000..4474dcf --- /dev/null +++ b/mods/technic-master/technic/machines/register/battery_box.lua @@ -0,0 +1,282 @@ + +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;]" + + 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").."]" + 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("%s Battery Box: %d/%d"):format(tier, + current_charge, 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, + }) + 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 srcstack = inv:get_stack("src", 1) + + local toolname = srcstack:get_name() + if not technic.power_tools[toolname] then + return batt_charge, false + end + -- Set meta data for the tool if it didn't do it itself + 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 charging + local item_max_charge = technic.power_tools[toolname] + 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(srcstack, tool_charge, item_max_charge) + src_meta.charge = tool_charge + srcstack:set_metadata(minetest.serialize(src_meta)) + inv:set_stack("src", 1, srcstack) + 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/mods/technic-master/technic/machines/register/cables.lua b/mods/technic-master/technic/machines/register/cables.lua new file mode 100644 index 0000000..9ec1cfa --- /dev/null +++ b/mods/technic-master/technic/machines/register/cables.lua @@ -0,0 +1,173 @@ + +local S = technic.getter + +technic.cables = {} + +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}) + + technic.cables["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 technic.cables[name] and technic.cables[name] == tier +end + + +function technic.get_cable_tier(name) + return technic.cables[name] +end + + +function technic.cables_should_connect(pos1, pos2, tier) + local name = minetest.get_node(pos2).name + + if 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/mods/technic-master/technic/machines/register/centrifuge.lua b/mods/technic-master/technic/machines/register/centrifuge.lua new file mode 100644 index 0000000..dd05977 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/register/centrifuge_recipes.lua b/mods/technic-master/technic/machines/register/centrifuge_recipes.lua new file mode 100644 index 0000000..8b447a2 --- /dev/null +++ b/mods/technic-master/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 rubber_tree_planks = minetest.get_modpath("moretrees") and "moretrees:rubber_tree_planks" or "default:wood" + +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" }, + { "moretrees:rubber_tree_trunk_empty", rubber_tree_planks.." 4", "technic:raw_latex" }, + { "moretrees:rubber_tree_trunk", rubber_tree_planks.." 4", "technic:raw_latex" }, +} + +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 + +for _, data in pairs(recipes) do + technic.register_separating_recipe({ input = { data[1] }, output = { data[2], data[3] } }) +end diff --git a/mods/technic-master/technic/machines/register/common.lua b/mods/technic-master/technic/machines/register/common.lua new file mode 100644 index 0000000..0e59d0e --- /dev/null +++ b/mods/technic-master/technic/machines/register/common.lua @@ -0,0 +1,154 @@ + +local S = technic.getter + +function technic.handle_machine_upgrades(meta) + -- Get the names of the upgrades + local inv = meta:get_inventory() + local upg_item1 + local upg_item2 + local srcstack = inv:get_stack("upgrade1", 1) + if srcstack then + upg_item1 = srcstack:to_table() + end + srcstack = inv:get_stack("upgrade2", 1) + if srcstack then + upg_item2 = srcstack:to_table() + end + + -- 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 then + if upg_item1.name == "technic:battery" then + EU_upgrade = EU_upgrade + 1 + elseif upg_item1.name == "technic:control_logic_unit" then + tube_upgrade = tube_upgrade + 1 + end + end + if upg_item2 then + if upg_item2.name == "technic:battery" then + EU_upgrade = EU_upgrade + 1 + elseif upg_item2.name == "technic:control_logic_unit" then + tube_upgrade = tube_upgrade + 1 + end + end + return EU_upgrade, tube_upgrade +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 + tube_time = meta:get_int("tube_time") + tube_time = 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") or + not inv:is_empty("upgrade1") or not inv:is_empty("upgrade2") then + minetest.chat_send_player(player:get_player_name(), + S("Machine cannot be removed because it is not empty")) + return false + else + return true + end +end + +local function inv_change(pos, player, count) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.chat_send_player(player:get_player_name(), + S("Inventory move disallowed due to protection")) + return 0 + end + return count +end + +function technic.machine_inventory_put(pos, listname, index, stack, player) + return inv_change(pos, player, stack:get_count()) +end + +function technic.machine_inventory_take(pos, listname, index, stack, player) + return inv_change(pos, player, stack:get_count()) +end + +function technic.machine_inventory_move(pos, from_list, from_index, + to_list, to_index, count, player) + return inv_change(pos, player, count) +end + diff --git a/mods/technic-master/technic/machines/register/compressor.lua b/mods/technic-master/technic/machines/register/compressor.lua new file mode 100644 index 0000000..49830d7 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/register/compressor_recipes.lua b/mods/technic-master/technic/machines/register/compressor_recipes.lua new file mode 100644 index 0000000..4fba03b --- /dev/null +++ b/mods/technic-master/technic/machines/register/compressor_recipes.lua @@ -0,0 +1,24 @@ + +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: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"}, +} + +for _, data in pairs(recipes) do + technic.register_compressor_recipe({input = {data[1]}, output = data[2]}) +end + diff --git a/mods/technic-master/technic/machines/register/electric_furnace.lua b/mods/technic-master/technic/machines/register/electric_furnace.lua new file mode 100644 index 0000000..44de16c --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/register/extractor.lua b/mods/technic-master/technic/machines/register/extractor.lua new file mode 100644 index 0000000..eeef9ff --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/register/extractor_recipes.lua b/mods/technic-master/technic/machines/register/extractor_recipes.lua new file mode 100644 index 0000000..f752144 --- /dev/null +++ b/mods/technic-master/technic/machines/register/extractor_recipes.lua @@ -0,0 +1,32 @@ + +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 + +local recipes = { + -- Dyes + {"technic:coal_dust", "dye:black 2"}, + {"default:cactus", "dye:green 2"}, + {"default:dry_shrub", "dye:brown 2"}, + {"flowers:geranium", "dye:blue 2"}, + {"flowers:dandelion_white", "dye:white 2"}, + {"flowers:dandelion_yellow", "dye:yellow 2"}, + {"flowers:tulip", "dye:orange 2"}, + {"flowers:rose", "dye:red 2"}, + {"flowers:viola", "dye:violet 2"}, + + -- Rubber + {"technic:raw_latex", "technic:rubber 3"}, + {"moretrees:rubber_tree_trunk_empty", "technic:rubber"}, + {"moretrees:rubber_tree_trunk", "technic:rubber"}, +} + +for _, data in pairs(recipes) do + technic.register_extractor_recipe({input = {data[1]}, output = data[2]}) +end + diff --git a/mods/technic-master/technic/machines/register/generator.lua b/mods/technic-master/technic/machines/register/generator.lua new file mode 100644 index 0000000..64f75be --- /dev/null +++ b/mods/technic-master/technic/machines/register/generator.lua @@ -0,0 +1,168 @@ +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;]" + + 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") + 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;]") + 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, + }) + + 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 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 + 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;]") + local timer = minetest.get_node_timer(pos) + timer:start(1) + end, + }) + + technic.register_machine(tier, "technic:"..ltier.."_generator", technic.producer) + technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer) +end + diff --git a/mods/technic-master/technic/machines/register/grinder.lua b/mods/technic-master/technic/machines/register/grinder.lua new file mode 100644 index 0000000..19ea094 --- /dev/null +++ b/mods/technic-master/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/mods/technic-master/technic/machines/register/grinder_recipes.lua b/mods/technic-master/technic/machines/register/grinder_recipes.lua new file mode 100644 index 0000000..6ab19e7 --- /dev/null +++ b/mods/technic-master/technic/machines/register/grinder_recipes.lua @@ -0,0 +1,131 @@ + +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"}, + + -- Other + {"default:cobble", "default:gravel"}, + {"default:gravel", "default:dirt"}, + {"default:stone", "default:sand"}, +} + +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 + +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", + on_place_on_ground = minetest.craftitem_place_item, + }) + 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("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("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, +}) + diff --git a/mods/technic-master/technic/machines/register/init.lua b/mods/technic-master/technic/machines/register/init.lua new file mode 100644 index 0000000..3cf373d --- /dev/null +++ b/mods/technic-master/technic/machines/register/init.lua @@ -0,0 +1,30 @@ +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") + +-- 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/mods/technic-master/technic/machines/register/machine_base.lua b/mods/technic-master/technic/machines/register/machine_base.lua new file mode 100644 index 0000000..6972b9c --- /dev/null +++ b/mods/technic-master/technic/machines/register/machine_base.lua @@ -0,0 +1,178 @@ + +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_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).."]" + 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").."]" + 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 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) + return + end + + if eu_input < machine_demand[EU_upgrade+1] then + -- Unpowered - go idle + technic.swap_node(pos, machine_node) + meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier)) + elseif eu_input >= machine_demand[EU_upgrade+1] then + -- Powered + technic.swap_node(pos, machine_node.."_active") + meta:set_string("infotext", S("%s Active"):format(machine_desc_tier)) + + meta:set_int("src_time", meta:get_int("src_time") + 1) + if meta:get_int("src_time") >= result.time / data.speed then + meta:set_int("src_time", 0) + 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 room_for_output then + inv:set_list("src", result.new_input) + inv:set_list("dst", inv:get_list("dst_tmp")) + else + end + end + end + meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1]) + 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, + }) + + 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/mods/technic-master/technic/machines/register/recipes.lua b/mods/technic-master/technic/machines/register/recipes.lua new file mode 100644 index 0000000..22e9866 --- /dev/null +++ b/mods/technic-master/technic/machines/register/recipes.lua @@ -0,0 +1,97 @@ + +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 unified_inventory 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) + 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) + 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) + 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/mods/technic-master/technic/machines/register/solar_array.lua b/mods/technic-master/technic/machines/register/solar_array.lua new file mode 100644 index 0000000..615219b --- /dev/null +++ b/mods/technic-master/technic/machines/register/solar_array.lua @@ -0,0 +1,63 @@ + +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 + 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("%s Active"):format(machine_name).." ("..charge_to_give.."EU)") + 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/mods/technic-master/technic/machines/supply_converter.lua b/mods/technic-master/technic/machines/supply_converter.lua new file mode 100644 index 0000000..d89c3c1 --- /dev/null +++ b/mods/technic-master/technic/machines/supply_converter.lua @@ -0,0 +1,82 @@ +-- 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", machine_name + .." ("..input.." "..from.." -> " + ..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.env: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/mods/technic-master/technic/machines/switching_station.lua b/mods/technic-master/technic/machines/switching_station.lua new file mode 100644 index 0000000..5517917 --- /dev/null +++ b/mods/technic-master/technic/machines/switching_station.lua @@ -0,0 +1,408 @@ +-- 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: +-- _EU_supply : Exists for PR and BA node types. This is the EU value supplied by the node. Output +-- _EU_demand : Exists for RE and BA node types. This is the EU value the node requires to run. Output +-- _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 + +local load_position = function(pos) + if minetest.get_node_or_nil(pos) then return end + local vm = VoxelManip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) +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) + load_position(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) 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) + 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"}, + 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 + load_position(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("%s. Supply: %d Demand: %d"):format( + machine_name, PR_eu_supply, 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 + 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/mods/technic-master/technic/register.lua b/mods/technic-master/technic/register.lua new file mode 100644 index 0000000..6a237f9 --- /dev/null +++ b/mods/technic-master/technic/register.lua @@ -0,0 +1,59 @@ +-- 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] = {} + technic.cables[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/mods/technic-master/technic/sounds/chainsaw.ogg b/mods/technic-master/technic/sounds/chainsaw.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5fe7552fac1dc561887cec11dcf17c724b59e167 GIT binary patch literal 38174 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%0AOR?`k>aWasF<0 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
#$ALy@jN#=KT#`M4hQFPb}7# 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 WD{p%d0H){XQPxnV{ifSk_`wavhpN~B literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/item_drop_pickup.1.ogg b/mods/technic-master/technic/sounds/item_drop_pickup.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2ae432d59f31f18dd4f703ed84d9915bf65f9e28 GIT binary patch literal 9981 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/item_drop_pickup.2.ogg b/mods/technic-master/technic/sounds/item_drop_pickup.2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f58bf08e00f206d3e433b28ddf2297d1ada1a853 GIT binary patch literal 10477 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 I^7ShC4+bz0#sB~S literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/item_drop_pickup.3.ogg b/mods/technic-master/technic/sounds/item_drop_pickup.3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cf57c94c7383d90e5e282e9b36a6c69f59688075 GIT binary patch literal 9586 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 U1v_AG(2P=Jc3}msD^mdf2RBqq4gdfE literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/item_drop_pickup.4.ogg b/mods/technic-master/technic/sounds/item_drop_pickup.4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bfe99d9a37181071db8a5fa22214535ef850c31b GIT binary patch literal 9696 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 NuKyC?AOCCk{{TRC4?zF` literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg b/mods/technic-master/technic/sounds/technic_hv_nuclear_reactor_siren_clear.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3332debcff305e0bdbf35d46e44c44aa07afb451 GIT binary patch literal 31184 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/technic_laser_mk1.0.ogg b/mods/technic-master/technic/sounds/technic_laser_mk1.0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..19be08015f88865b06079a4134405d91252c8df8 GIT binary patch literal 13465 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/technic_laser_mk2.0.ogg b/mods/technic-master/technic/sounds/technic_laser_mk2.0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2cf154863bb6cac784737e1da2aa5eea9991df25 GIT binary patch literal 16766 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/technic_laser_mk2.1.ogg b/mods/technic-master/technic/sounds/technic_laser_mk2.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b3f9afb036c8dbcf2f8c1c9a97167c23b6ca33a6 GIT binary patch literal 17725 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%0A|@7T~LqA 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/technic_prospector_hit.ogg b/mods/technic-master/technic/sounds/technic_prospector_hit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3a8ad2d137ae3a9016a076c8f39dfed257da7e2b GIT binary patch literal 4698 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 HokZ|oc%Pgc literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/sounds/technic_sonic_screwdriver.ogg b/mods/technic-master/technic/sounds/technic_sonic_screwdriver.ogg new file mode 100644 index 0000000000000000000000000000000000000000..471bb727c4da0deca36cfff224b870b1a20ebe40 GIT binary patch literal 29827 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

9yo&h$O3#G)of%*gQ8S%p~0TSRUK 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 PhPM0NE^6|4R8;>DpE~cY literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png b/mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_128.png new file mode 100644 index 0000000000000000000000000000000000000000..2848f89e5992b566fbfbb14c694edea8f89aefe2 GIT binary patch literal 26143 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 WZy-Cn{t5d40000SP)e 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 Hu0mjfy~4Kb literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png b/mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_512.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2bd8978bc8fd6442e4b9c20318578a2117303d GIT binary patch literal 254444 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

4=I#JP;sI zUq^Fw9nF3}p=g|>C}VTE$R0eBxW&q;iV8m8wd>pur8ff%%5~{B&E`<8)&Z(uM$n;W zZXWr4`_txaAmph>Mv(1h* z6lK}c$4E^k$jVkZS<}Mxh261aWuaKCh^mIav7TU)mxlUU{DB}bvzde_V|S&KS2PB* z-ARqRhIilH$jy^)$0Qj-FwlDJ2L&$vf>1)PEEs<)nW;_!t$toxvkY%j1M?q#k``|x z6?;D>M-`~@`6%q&mv~z{zWN55YHRU$y@X>)3|T=mOXT(|B&%N`ptE($CYoDXxaa4lY@@?l|k#{d+HX^DmpDT~h3_BeN4mB#tha3Dwn6duR{mYup?@b)0dNCXua4 zh)JE6KoDdFRW{Req}Y!DJ4#hU25}>v!D| zb?T@~O8}r~*2dKIjNEV_fNbbAA3jJt6u=~!aHcvDVhQwE9ACHtQ4okGbgsO*7dgYO zBbtm8i$z(pW;uDeT`60#ltf1q_t*P~heDWD>tVkyJi2shenc2J>S9jQzXG%cT2C0! zuo0}-kN@E3#3Dib;V2#LA#9RFL0)&#vbzzCBnTT4xg$o>Wz+;jMWOt_e&#PMW7_mP zx#5qn#W}w9rbR9B^%=`j!3a%vF-VS<_6)T^{VozoHvK6Fg7W^I$P32!3NwaA9+d{<; zJiYjfSC+5h{)G#E+!2*6eU5M-az#;!an=+GAgd{u4S|>_qo=xXT|Jy#+uo;W`~(uQ zBspEPIeYpvZ@#sjl3Djskl&kxuG4(x7;RN<;>pDM*7ne_*-IBSUzR0%cFx>GJ!}+O zREvPcL1xheqLBpa*RE#w=erqDG=k#M#njbSp;~Orm_CzWqyxz;abf=+BN+|}NrdgU zJyJSx!^-EGQ8w?t_k>R^e2OlP^xSAmO;z{)Lkz8RcOm3&X4O-RxM^AmnoXhKpn?2t z&u*^l(}(;Xy$}R}kk3PX`B#QXFbN&u*!Y7gxr>TNbKOOf`tK5E8e^S-$pgKPRv zi%-0=_It_YC^%8?2~T@)p5aJMq3Q5Gs`qWD?z?gn%|=^O1IIu3D=~j73Czc9yk5s0 zdgeEm>#$8fwvpHGn)9!{ztvUW*5yRq0Ev^O)H3Y%HWD*ToQG||oV#=*$rKPVv zw~D(SU+}XAo1e7h+xC9N#Ny$sT)6n9RI7E4#iEf2cQmx=;^4VU%4&bWFU8GbZ8()Nlj2>E@cM*00A~hL_t(I%dOMTN&-<7 z$MNr|Q&#>LD-(lS1#NnWo}-tMXw|Bv`=CdN-l0XCq%c!y)O4=qh)&n&w2%au?9bSN zv-w@_hYROiLqu4l0xVen3pm5GzY8KV)BV9I)mGP&&udRmZz;6aRIH9aKt!mvx)Y?? z^#_Ou<)=1UYpOpW-ySxUgVvgQyXOxO5gsfXJ#u+$*#3YiqV<>4`SrM}&B=5u<;>*9 zyuWZ$Oo)1g_4pD2aoIcS8E^cUp(shSO=AGQm7N%0z!8Jk}-2RBeLeBvB008{VTJiSARsaA107*qo IM6N<$f@tl;DgXcg literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_copper_plate.png b/mods/technic-master/technic/textures/technic_copper_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..99a49c8235619877b827fc56b6cd06ac7e6e1fa5 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar_~T6BY;<7#SEClpJ~S zU){a<=%nr*9fLmq02a?#+t)-NJOBbsz7qr-w)Jq%SFw_xtvz#tC2ypnk^F4#nFT-j zrz^ThI&>*k9A=oUDALM!F>Zkd&jjZ=YYZH|sqdP=PdC;(D_^q9TK-yvXpx5165~TT)E}S}V#gHG2^RZ>WnZNu`Z=*5*PDBu+J&5#z5BkBT zLZex$+){ze4l!%<2V42jrh3G5CnV6^N1{j7AEs#<9*FHfff~A;$0n+qt z!%(~wo5+fyCrE1rx709np8K}>tF@9_6m<)o0wy3q(zlux9jB+p60uB6`p5#u=J>{q ztgLVL%PY-d)vfKPBu)ZS>%If(ND3MyTio?Gxcqlj5>*^8($|1sX<$BMF}I@%NhK}P znQ}sa!7G@OYS~sN!@W8IFKJ0ZU{lz8ytqF;v#8Lwu4kRrIyo{#9qT3}9L zcA8j;O5vCsVQ-L*Mx@hZ(YAul5B+%TSRY z&-20@N9GxyAQ$D#0yWZqySF(MfCM@#VFsbFRF!0nPfS!7__s4)L4uJCTQ*U^(3RJx z!wNLMNc9>DOW;fv#c+#>-^aoCAOhns&6PMSLkkf#zHeSlXVG|+-|yk{ha4VZ9Ime? zt$6!=h{6;kp~zcjvad)r9fK5-5;Hbmxfh3n3m+0y1SDn`^nn8;#K8e3C}=_Bs|;uP z(^^_Phy?h24Ss>Yl@BLjCD@R=`auX<&rOjj0 z;D=_|3K}@jA9mBDJD0`V!!{?+FuIL(dX0$khc|XR^!3ZyNY=Z@5|(UF0k5{{~0{Nq-X| ziD86G%%%g;*E3Y5`2IT9`a3Jca6P@h8yt|hs20u}ZiYG%f_lkDqjjU+c&C#|$$+9i z04xq<7Hl!P!;PeZu&9i=p^A4FF$8YW;gjv%8qFq)l7c`{*fW$K$dATAzoUaSV)gmS zIcnKxAOw+(3QonN{NY+Q7{nDHS|e^T{k+BL0)C0N$PUMbwz}D*Gxx!(NaDPF zj_zxDz)@2rR$VCZqcqPg@y-&b7D&c8nZqLj+srl1PDmi>fO&+XKuB_(7ix-pe}thi z7-sNe^fU#GlJZoDPXYQW^_`T`NI9$IsjyDa!OMdXfy*$>g#_2s#^%JCUuH`qc?6gE zyC$AIOiZz@gYPslrFif^VGbftfI6sztsr0?Nr{N!yIXPT96rGU1O(1b*zmsrGC)By z8h_0Ro4@q1wu$*V?sZcM;X2+~gq5Hme-)rcXhO%sFCA2o?_I#}y~HIgoe>iH12B_}Q027dS+_ORQ|y=+=k`ilE5<@N(=>;cOE02bx$R z*L@T{PZfOzTm?vn4LX)h(#9)1A5HO81vmK6JsNSf$Q->rJnF*+OC5m4%OxrVJ(9Gd zUU+Y-XWHV`QM8kHVfn|BNxsrXuTDyFsx;&lW3O2pvj~F6X0v(I>Z*usq+WRsNs4DD z=wHJwN607EkC%8h#|vrR$nai@xfExLm?E&=xFMu}3Q!ng2t`qK!45Z6*?e=F4`yJJ z1H;&9Y&50ZJ_)U8`~}S|h#V&4nmp2|Q>XF#g{wTwaU#oBe|kA$ zBC6OO;%}>%v)OSF7GMhUP!B%X0OHeMDiKlqWDRbOS1uBVN{PD#y21PmKsqR>MGynY z87~(tp3Cu%ZcI2<;^9%S;UY{!HMBzrd`K*wG-y%Z4hv>eoU(xa78&^GFh2;xWk`d9 z1^^0W1C7-nWzcw_XLP1l{0*0(x(V4F(bU(dh!ogN&?U8K0Nz z*{NLg{Qnr}&R$$P2b0K)7dUG1vwZy7y^sd*AVNZGZ9oLT4?DodrxVu9jb3EoIJ1i9 zPpZ^jh_g;3LFOeZdt^WH2^x06S!ksl(#kq^9Gx*Nh(7}HCjGU$-p?y9`a>AbI!lw!!DCk!I{`n**XOScA*1Xv-poD-@UzJyCqE5l8)ZnKWl zPf;TWC5mspW51M0MnSIM!WLN@I|(7yx{w;0@Edqs;P>LtnYS^}W2brJ1izXNy1`9TY(hTB6zQ7asso5(J6?f}|UEtBEp#1(GcNxz#}o5O_#C6}Mh zGnK>?c=9~ttqXRfhMo58zam-S%m9_Q@Nl&mlC{T6JTb?f2&ZRRyg=y+pG0XA6<=@$ z8fzhmP7g#7Hbv#uX!SE+onhY~Sg=4eMb}Q!!Zd96RRjG26`Lu<$+>bFG1cL~QOV#w z7=vMmusB6i$6`b+zBorBj>ea`=^7>mIDM8OgZ?IxieqoVJWRt96nOin^|~N2^Qjbz z%-P)kB@7qy`6iaZi5Dc_C}cpgL-yf|IB6sOdN zZzug*AWYZSMT4YGP|Tr|M;A~4LDT10BdHJQSy6mrGqWQMUu5?mQPt_J6S=j*dt`e` z;=(8JJPI|WHF_lXRGRntv|T}pHjxbBRoKcpFrsp*@VRCr0a~G?LnYABv4_p2|YM$ItXr?oO)Nl!}8`A@hAky(EKr%PT`|ok+EK+w9 zvtbNlGyT_)S4`T`1v`DzLO0PWNGKZ6>b7GgnEnM?++wu7m>yyCeQXLaV{HolSC-=9=I^6$WT7GYgjcz8EvCiZ4GU}$Y)zw{5 ze61z7m_lbYOoL4c%@9?7mMbzGeH}_LPcB9E-DHHrVVfQ^M>86C;=BoKo>;(MBH7`j z)WGOZVHCz-hU_@T`qX$K|N1b688jZGV;4)m;K~P_v+3<3374LSMTkNM3LM|h!4!on z5JyrVVX^r;Xm0Ya5rLpU_Q9sB0HweL7ue8)#vijB|R@Q27d1zQUC|P`Lw@ zJ5ad;l?_xj(Enuvl{-**1C=*WxdWB2aOEppxdW9uP`LyB|L;Km1=U;zr3=4d?*IS* M07*qoM6N<$f+vy@9smFU literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_corium_source_animated.png b/mods/technic-master/technic/textures/technic_corium_source_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3ee56012c003a6409e1713ff6cbb8cd35b5eae GIT binary patch literal 2954 zcmV;53w88~P)@(tSVTpJ9fqA@8;04w+volOoOAmZI{ppM^E&V632gS|MxQPF zM0??9x4!A-R&z_n?N9c%_Y4Mo{^xFTG;#?sW#Y>lO-n~z;qzMt?QOTC#f*}=jGlE} zM?3dY!)bbbZj!Rt6UT&q=Pq_iLKuMOkhRhEBI&z4^ZP3INqKwU6tNcib6(SOtz{-k3)9ok>e zR-rr`Tc)k8f@YDAFCwet>>R-FFWYeam2!zhkLxW;z+V5EAWzkp6

gusJLyK-XveYdMmwlYM4tCBW=!A5ZeU_8&sRQ}x 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 uajCl0i!UR7zzbfaC+<|MGPq0IHGDUx}#A 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png b/mods/technic-master/technic/textures/hires/technic_hv_nuclear_reactor_core_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa8f18a08da3336fee3080db18bc97939a51ad8 GIT binary patch literal 8114 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 M07*qoM6N<$f}RD7^#A|> literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/power_meter.png b/mods/technic-master/technic/textures/power_meter.png new file mode 100644 index 0000000000000000000000000000000000000000..9f96caceb7f4706ad796462dde828ba4419a8244 GIT binary patch literal 463 zcmV;=0WkiFP)WBAdRxBX{jm#3AU89zKIDy323)TzK3-Qs}eRfRM@%1f{`dD z>@pzOnoR=f>}DFu!vQeHr#*4h3ZB-3CcLh<6D;gD-5L0(;duvH1;yTi&@xE0 z!gxS9srBF)N(pJczbT)^gkB6Jwt8Y94gjS zTn=9a4!i+5P}B4$0P;YD9O#ir=43$5_)VlCPI;hRwWy75LOJxA z*f!5NeeZxDH=q9FT8{RB3DXWtV<12~aLIv74lMsT{RQ}?Z+yEP8M^=g002ovPDHLk FV1h$rxIh2^ literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_admin_anchor.png b/mods/technic-master/technic/textures/technic_admin_anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce9b4cd7003d5ea49f72eeb80588850e217e09c GIT binary patch literal 873 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyacIC_6YK2V5m}KU}$JzVE6?TYIwoGP-?)y@G60U!D%qyBcZG#r@9f+^efrLXgi9$Y7yA46%$>XK_wTNmGj}vL9$vh7b5hd9<;yn~ z6r7fl`uzEG-~9Po*REYBCiYcL?d|H->({SeyL9QM&6`&*T)1WD&XwQ4_i%CjTDfw= z_U)^F{_N)9`0e3wcmMunXV1>Bsyg=c>6DlFzu{b?-;>(~z4gxL8*V`9yJQ5X1 z7I9?x=)!6va8x?vK=l3prgx6C1nlw@{hMBuwkxe{xoE0I&yPQh>+1|y9tM8@7t!*O z^UyovCYME%4gaibvIy>cDVY|_TKsvzq@G>&N?RFTx~|X9*r2jny@dPphNRDD8VDQtyH=QP0CBA7%7YR-TCLadT`#}dhWjT zcCB08T5953i=2xJH$QiH=cDi?U*5hfU$By=Q@*-W zX{xO6gLS|VRV{IiC`m~yNwrEYN(E93Mh1o^x&{`yhQ=X=W>%(_RtARJ28LD!2Kpt{ foG2P{^HVa@DsgLw(>%NtsDZ)L)z4*}Q$iB}^>2i? literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_akalin_dust.png b/mods/technic-master/technic/textures/technic_akalin_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..052b0ac909cd8f4b86f83a0e07bc3cf77ab90702 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP;il_ zi(`mI@7tb@djnXo4etU^tRuV!_EmuAC8`SHtXBwzmqbjy;j)5Aac(5rEAQ5)mq^RI?Lm0on`vc z_lo&5C?y*(eZM6beRy$MkJIV3Rg+b@Gi8=UuG<>kChPrFRNF~}WBMW$lS4ahKV9ne kcB(_mCCjqcI~i&i?ABSaK6RUN3g}t}Pgg&ebxsLQ0Hc;z$N&HU literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_alatro_dust.png b/mods/technic-master/technic/textures/technic_alatro_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..172af25895a54106c6a82e54f7c03f27bb74a79a GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP;jxQ zi(`mI@7o@GK1N3g_xt9?Wv+i#itxD{QdN<1pAeA0@cN{JPG1v0Wv!_bB9os5bLVYX zU$cL@{FN(L7*6b8I74=;SLe2^dqN`Lx!K>=-#KgAtx~=Q_b#4IYSWi5Pu1yu`(gEe zf!RMj_3trX*uvIb&^@tl>z(8!&tz@+OMFc&t;~n&EeQ7ac-)*vD5yE n!XccqHYoj=q46!5v4UAH&Wbhh(prC@a~V8c{an^LB{Ts5KH6H& literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_arol_dust.png b/mods/technic-master/technic/textures/technic_arol_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..1a575ed6a05c6a24e9164c403189993e1150a814 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP;jcJ zi(`mI@7o@0zNP>X*5|PfpEek*>viH)jM`y*<%UG;OcAdsd(Lm&p!9-oM$x&G2aX(J zY4~ZLb8f5E`Wt5iMEqVqdtR<`dRdUQFhkXPo#&dl&rb#)PBiV~Ir4AU(;P6Rpf z?1?#&=Ja0as87Wn3pSWQ0f8k2q{~%WpZGe=N)PD&HiT~2l(*MQ9#s5o6N`f)b1|Vw!VUU3& x8-NXu8bD72VCeuvlVt!X0U;+On1R^T0suQ+i+y*Oy}AGZ002ovPDHLkV1i(5X}bUb literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_battery_box_side.png b/mods/technic-master/technic/textures/technic_battery_box_side.png new file mode 100644 index 0000000000000000000000000000000000000000..98a22d61d89b21fdd75e4b65f324826e65d7ca88 GIT binary patch literal 576 zcmV-G0>AxPrG5QV?0p4eks z%#2uogya*jLqH@TKSpAKSipkouw()E$V~u=8xTb@h!si%iZKphX1a=n>2{)Qs8y@` z^?R?nUd!{BFP#6V5CSpAEBos1hzL`gv%5D$RcR(QH?QBI8eO9vS2UBFW>N$2r24_^ z@d#A~pa>ygW*pQfgs-RUa2I#y`1qK`VgW#1*Hl#nz$-r@%)ju^?ra=ftYlL}0NC2v zLPQ85kg>9E37{}DM1>ku7yq>=YpzAuyvc$}CYopN!fH&nKZ@+!a#Hy+rph|Y| z?=TabpP%QocWY-Ng2osx0aca3U_jsZhzLbdWV^X!BT|S6?#}LV8Er2E7wZtT~gof&Tu%)xVHau)j{gb-15Z~9uZ-+T4kKB6bV9% zaZQj$l2RE$plKSKrpY8lQP3{C9I}*yB3VqSb9a9JUS9ei7X>c<6M(<*<@(UpWBt?s O00001HxB#Dyj%Jb^nDNko3e#D#GI3l=6mix1#Kn7H9h)D;gP zAsLJ-69O8>8HVn@bzSsy3$n3R)m5kKe)pUz**n;G{$qp?Fta=B>h6dLt7**kP8U^W zr8nfkz55LEKEve!E4?8ry&(WE2N#T97M&CAc{nOi!u)zPiHQ2_evGrEUozrj!s7Mzd$wskNIH0;wp7 z{XV!;RTZk*>I_3fP!R#(VR^#tC<7p+L|9rvRPhConc?m{)pMS2b!tj?B7lh09*jS; z$z#g0gv(1L1Xy6_dCs($@jg2y{y1e*)^K-JRY{9}QE3T0rMmipa6X^6K6zOuCn7{M zYa;8118|_72?31}jgjv1GSgzl_GAP3 zEjaaoZRyoCW_Og~?sZEdxEbmCnpBo;ysK%vZbs}AWnPO&`8L2Em72J^!=ytoUuBfi>5;VOfPqkqpge=3W3O8dq zowhoiDiQ=UL-r2#y@{lWbCCCmu|B)GfiXrdCO_+l7Z0!{aQAl6-MPG)+{HXcdi7q_Yk6^UV*JN(&f&ek^{!@yh;St5JbziDsuX$7;dsoj*JIT0Q{*{Co&zwu z^OO1M3RMLlbIuV$;A}EOKi_4_0yAT|TvAmP0He`};cy7Ro6ZCD(}d%&xKglxqD&D1 zpwsCfA~@$rSXG>JI|U&GM1-eRgD)>&5A2+yu4@K^0d3o&stM;Wn`rFxFuY@aS^^M4 zzWGyv3fop8Mm_jt_L-4L&(DDUIFC(b4MHZ!{2Zi3bA-`fhJw_uhE zV|YY_&1REux>_KYpDX1+M2M+$&QTNvMNuS@EX%0Z>lCsWuq;Z9sWUVF?Ctz!gZ+O3 Z@DGZh1ES5(ej@)Wnk16ovB4k_-iRPv3y>Mm}+% zqB>6(#}JO|sy(MU4?74PHIYB;RA8B>zLc$~+_de%k=>j1+2d7Js`thJ%8~Z4`6hdP z4#Sm7CC=>}&q^o0<`R-S-L!MD7Q>%%nFtmS^9ysfn=&hGHr*F`#_&K7%LWb`;qxkn z&Y>&1Zd$*axq>VI?YwjM4$3aEKH8JP+uOM62lE+Ohqo_(u+{@z!rP^osvtZ z_e}Dh{!%POqR34U-RpKqEas?wZm=YzLiu;WFU8GbZ8()Nlj2>E@cM*00A*cL_t(I%dOMBPQp+a z#_|6t6dTcML@KAd^qpOwefgXsx+-+xY+y!D$5} z#0&BPBEs#{Gg@n$ACPYkn|_4Wn#S`>K0rjcb35o>pND2AAMlB2{bf79uFLU8?YMq4 zma9pB;cTxiN+}A4!YnE_cCM7`cd5?L&}c`j)Rq9U!0B#X3q;Mfy6WY!!$TA$%QDu}#*uFBQN$^%~3w49Wl300000NkvXXu0mjf DM=i6z literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_bucket_corium.png b/mods/technic-master/technic/textures/technic_bucket_corium.png new file mode 100644 index 0000000000000000000000000000000000000000..82da7ca56b31211cbf3ee6502ef96c408decb4c6 GIT binary patch literal 256 zcmV+b0ssDqP)*(8UnH2#*?XVuTQ%0hXz9dIUnR&SMy&jVE#d`RQAIM2Ta7*d0000&+{3kMLDu;fhB&(nNO4GA%@?J+yQOo2qW?P&8Vj>Sy-SHih7!PL(hkyHj{WF8nyqceX T_MWl?+RfnU>gTe~DWM4ftyDle literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_carbon_plate.png b/mods/technic-master/technic/textures/technic_carbon_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..5da83b8826cc05df0803e69012f2b9b9c9deb51b GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar`0C208K_P~ceI*8b)H z`bX-Yx3oy4D7;>)wKbPvmIQ;tr=5~vR~7XYBW2kbI?8{r{=V6xSN?A2oO!0dFBF}B zX!F#%a|w%02kJZg3En)22KCb4=IcK~1dZUZ?l*W+jKgxApDLJd0*IZ@*w3NZq L)z4*}Q$iB}PB1-7 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_carbon_steel_dust.png b/mods/technic-master/technic/textures/technic_carbon_steel_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa8a17eddc97c253e8d2e2379dccf2b3b505bce GIT binary patch literal 416 zcmV;R0bl-!P)H zK~y-6t&=fN!f+79-@mko1RKDR(1pQ|)t!}%$xUZNjDvxliO;09khV0?*0hwiN69%5 zO-Mx)yyPwK<$k&3CsnfDZ~9$>mb!9S#eF>`$o5e$2I8i1K$ zy1@=IKYq!<;Kf>ih+rOp{1`fZ1R}z0@qQYBnel3Spd`hcMl%@7@F3B<4jSh zTw*x96Vtf|?OKJRC`CZOKVZu;z|5#tYbcdugkbU#JujzjW!uPws3nH>oZ^H_y*p)9FX27o9UlFMD- zc`f4cB-QGb)^_{kGiglITn9>}dvV<+A`23UG=>o)4EtDChSBJiqoW+Y-=@*1XrD8h zh)^h$Wj0e-)+y6zgki)m%>=I7Bo;d$n>|OVi1~bquIo%DW9s!A4d4R?w9yD@crN7t O0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00DVPL_t(I%e|7%YZGA*hM)QN z%kH-I5TQLu6thhbLSz$Gf)~NR%%lI9hZP!>wlqj6vNU=!IRx@^zpvw=G+2nKT5ygt z^F9pozM`r;qzn(N{|jg&iFVUe{|WFaO|{)_vs^6bWtsjJ;6<~k$BhPY9MkD`39Q}B z7kTP=N_BzW&Z zmCNDqj`+?6&uTTD&F2987>}iwWm>P-L4>t)e7U&bd@zu$E^X!}9LzGb(~uOTXVIKRJ=#Jy=wgsfd0uhB63PI74Vw zxZn}*J1susx$JUCRF&_Qs(!qlQ!x%~#2e?B5`Y&ZTJmI}vNMUs&DgsxDUIQ^^|)Z4 zieD4$t#^ty0I`lvXo$lAw=7{bCEhn2&Ai+fvW<=7&}ga3xwixXye&)lla&4h3VESH T3xPH700000NkvXXu0mjfkKy6z literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_chernobylite_block.png b/mods/technic-master/technic/textures/technic_chernobylite_block.png new file mode 100644 index 0000000000000000000000000000000000000000..a837c66c5781235e98ed32041c01124ce3ac2902 GIT binary patch literal 666 zcmV;L0%iS)P)K5@iET7)E&o`+6JAD6YjH^Gs6cg zAd@u_tBkpo@$BC^KE=3t zR7<5u*Vp+?sPjCa1S6tS{rOEBgvC|8Q?*1qW`4#X0MJ5VK!%{;K8t(rHcdG0xbDbS zEgZJ2B~AyjTzMWd0C3o-rkT-^Q^0=JSCaiZ!syyew9MQqoFMfKCmiQ-&@(-eLAURPI9QqDj2WlmP00kV}-RIrqs(Oh2e|Xa|SWW@{6#xJL07*qoM6N<$f+BH7 AasU7T literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_chromium_dust.png b/mods/technic-master/technic/textures/technic_chromium_dust.png new file mode 100644 index 0000000000000000000000000000000000000000..0e48069ca53666e8402988b3989a94e09f26d77f GIT binary patch literal 443 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)3rpeltw9T72dNP=vF< zBeIx*fm;}a85w5HkpK#^mw5WRvftqmVU*Xt+o)|&b|hVTjq?#bNbrsiqt;8Ib;c`@qo--eoMi$3Em*Ln_B z0tF>ljK92|^spj~_l81Lz2)5a{?oJ9EEhg5$37w1uxq@9{7{kDYAA h*S^ek(z4m<^$d$A?!6@D5~%_TLr+&fmvv4FO#qUrtup`s literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_bottom.png b/mods/technic-master/technic/textures/technic_cnc_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..e600cb1de24947b81b8bdc0111b8efa44becf544 GIT binary patch literal 2006 zcmV;{2Pyc8P){yZmA))XA8$k7>e}Zi^~&|*Y(24ND_c*?8teR>QtoT5eHo{I8*hEv z_Wtg(TkCnv>^1lEaq&C%Ii7S@53bW2RR^- zjk*#gXfub1e9in`6W>cOnaGzE|D~3`meSjGL>8A-&}0Q*0@`@KwWDVMB*2Wr#QH73 ze`R3hM`4rUZRpc&>N5)ysl4AG&@lFok2_f+ZDe6Tj(%Qyf4jYr3DZCKykrh1LQ-A; zkO5f%Rts4Z1kvV9)MQ6W%yi}Z7XTwJpqk*Y5cyU}c_Dr9beu=%qSYP#=2(}}gdEno zaou#bpk;)%3VlW|t%d8-DVUS&x_3fbW@UJPe*riTxM9N$#CIYrA_qWiXQcduGqbd? zW|`~CiON3G{QT{HD^;_x&&u@`@b3Krz-Fdb zF-_wLLjH+h0Zjg)q@WEVAzSS@p@B3bE;-)!gH6{ss35?u` z%K9Y{tR>7IUjQ}^Rd_282w<9qrwF}nREm` zSR71c6rO7bV5EU8x!*ScPi{1jV&ntqCsheLRBmR2hMBlVg-2CrDu~RKCM$vsXEM1U zxCuH1yOVNj-h-RfuvW_aGdKW$0r0Rw4Y#ZH`+t8&dP9I5rj5$q%9;btEjcrmmZ_iT z6?UD~&!=%o$9ca8s6>TGlhvZ}C}=ad>AZmY0&q~HMpalGY2^S@nBeNVU)<9d^od)) z9%pD^BU8HM?fu3B7 zZ!4CB)9u$4SrCjVHTCMiL#-Iax^Ztt%x1%~ZMzMK%DT;z=@1#q>V*3TmGcE46ZMRX znVJC=S2Mza+YT)U(Zkoa(j|#*rz37;Nox_NdzqDKc|vqV?X$DIziAnd&;NCBg> zJ0)y&p_Ok&q_I#^az*WLp?}kAD*-CiFIj;~BvC=Pg9L z1HvrYoMzVAZ53_BxYShn*^cE7gTZ<=kqeXxr|oB?Dk)OX>v{rkgF{uru}w@HHgf6O z>59@+andj|o_%1?H@v^tv;ebY^a2g9ZfGfCBzCnhp3lL=jV@?VKvB!o_=vLQTKBWe zvcl4);Wn|cbAxu?PQU_Y)Kj#1%*cwcvTVb3>IWKMonz z@I2u0h-!l``?=0&e`wGWDQ9}Jq#pnKO^G>fX~&w4osrUHO`(*1CbR;@t`W?SUZAaN zMpl3+TS2Gas|gKef(lC~(hqtKC9V;%uIXlx6%QaI0@i$V!i%XY_~%}Wy%);!q-T8V zhAYiR3cRU-EX;n2an?4WpxUT7EP6a5TASSwF%k6=>zwtVi6}>m$WNmckOw&@%ur~* z(3q;@9aZ)cA&1PQGq@ol1tHDK*=}^r2IL4J4yNcb0UUHDaJ1R7u+Xr5*Ml>w*XH5BiQ1{qLzq)O{S;wEfx zef;J@#K+rGc)Cr*IUfG)Xx8(}eGiH{C%sln@Xd7XI<4E8(rL;ep$~{;vQ314^xHi%raM*#H0l07*qoM6N<$f@Pk|5dZ)H literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_cylinder.png b/mods/technic-master/technic/textures/technic_cnc_cylinder.png new file mode 100644 index 0000000000000000000000000000000000000000..06da024b91b5839c9135c2c8b87fb6a53ee01ffd GIT binary patch literal 456 zcmV;(0XP1MP)lv6%>6+Xs-rb=2S|pb%5=fmEZV)>HuoPfj>3C9&qUM7H2wc z^&##F_woIwfX{}iU5J8h1uxce@XC}o2MFQzP}FRNn85+4KH$SE09HE$sG#6ED)~J? zKk3c`at*8m*A?(C=vNB}V8r?;C;`$6&8f%W0Q3M%@(#0*D<~+3VYZ>5IY3^$2Oyo4 zp@NsH_@@fC02V^quSgESaGpwgGr6{hxFOI|@D!Ik{dsT~fOKO(R}Z|$?UYm`pd7Jn z3dU?m2Ph~30@UsSnR?;>Hyzw*qX*Slqo4q$*ZSa)TLHUuw|Fm(=O)cTS{&IXV|<_& y;?jrkIEl~;P)SfqIXI4^-3EGGO$>MVJ=+^lMa9`J4O<-m00003ieY#{#}~Tsofn@i`E593TTW9uUA_69579(*d3>Anj(Pc~bO# zCRVgZE%pU8z+JH240_<8V7dT$;f4T`TS+|UlE=*rme_kR5g+B9Xy;w$5YTFFhhuLu z)c_Uux@4?iP6Dg~S!ge7kS^M;XmPc$M0=V;dul+pO$!`cTLO4>7nb6&04Cr}22<^M zHu?&1a{v-^bnc1$pyq)_EF{UI09S1A)}F`n(*Vc`5g(eYCci4415}u+9x+=)F(gy1 zT@Bu%r;ubB)1=cRV$Bb0ulXIobzSHE1O3yqlIC#2{Wm>>$%zVH-L(J!002ovPDHLk FV1leSym0^k literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_element_cross.png b/mods/technic-master/technic/textures/technic_cnc_element_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ad0b79ddafba3d275341800bd610a429ff2b4a GIT binary patch literal 415 zcmV;Q0bu@#P)>makflA+Lf$RqS z23QYh7vKyyDLh zBx_hX=%5IUZ2_J$o@Qm~&Zy=UeEcHBTrzTiH8}E32Mp@jO~nQ{TtKTF!C?XhaCm?T z-2Vdl_Pbm>E>F)S5kjkK`HMBK1+WoJ1$Z9D=F|)UZD$hQTxKdWHn&GaBP=f#f002ov JPDHLkV1kXQqt^fc literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_element_edge.png b/mods/technic-master/technic/textures/technic_cnc_element_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..e6104cf3b258057fe1cb99d52c780222d53540c7 GIT binary patch literal 409 zcmV;K0cQS*P)G}BwEvoe(^A$4Pn4F%< z5!eJa_RLIBJDz8PGeK zD8P*cp23jh#&_{!fq61OVs$-kp=Qk35=R{v#9JMECm|MMEIE_Y%q5gqh&id1U~z&! zjq_0+#g;&1+zmfb{~-Zb;JB!631S~Spv79(0)sZHE+%JQ>U!dIBE^~jr3jN*+!Mh9 luIuXe0{wfj@A!s4+CGrJX;{@Do!9^X002ovPDHLkV1i4boGJhS literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_element_straight.png b/mods/technic-master/technic/textures/technic_cnc_element_straight.png new file mode 100644 index 0000000000000000000000000000000000000000..1648b7b2a5d4702f3ba5c0dbfa7e834f78f61f8b GIT binary patch literal 412 zcmV;N0b~A&P)P~J!5VsBbS(asU&TTIE_AjG00tV+u z?Hkwx7FK2^XzkB4!I_{n0qga%5B^1hVXCL;UJGtkVnRtr6xsxs!)X$&3PfS)d3R}6 z1D4`)X_|mm6nA}^W)ZLj%)R|xeKP}F;!MEmu$UMnw;x}H30B92$94+zxaWafYB9Nh zdk!eU65KOD1+E|P4n@Dkl2U2=l^DS>rR@Vma6)p!1EmE6G}Xb+!CZo1zx&1Z12Q;d z(b@-Ch&y%!# z`6)$V(WynLM=|mTJCs=wBiBMNP3yXjyMca;55Qw0Wt42BK%rBb1rvgavVH!XCdMm$S!=y9#vAa(H(Cnb@dk|ql%g;DLfi7o?jXZ%tir|VS!TToR%s@wGd-+>oOIeFFs6AEBhHZTtOPh;gI zQp*Xx{?WyNs{va$`0VFE#8E&7PA@Pd2RNO;6HXtnz&#g;i)Z(-Yh;pix;Ebv&nric z->Og!kO>n3<6&(27k8-#ft-g{)?VDY5CtTML}eN2A;rK8CL~DRF#ZT)m+0Y+WAo4! jigQly0s4VVQl<45wk-ZGPM&bL00000NkvXXu0mjflC7KR literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_front.png b/mods/technic-master/technic/textures/technic_cnc_front.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc049004708b6f0c262a99e1818838300d2efd6 GIT binary patch literal 2000 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_full.png b/mods/technic-master/technic/textures/technic_cnc_full.png new file mode 100644 index 0000000000000000000000000000000000000000..d551a454feaf0b3adfcc86cec34da759c731207b GIT binary patch literal 372 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_onecurvededge.png b/mods/technic-master/technic/textures/technic_cnc_onecurvededge.png new file mode 100644 index 0000000000000000000000000000000000000000..46779fd6167b3b844183f90ba4997afbbb192ff6 GIT binary patch literal 507 zcmVPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$AGPjWzeE%1YST7KQjex!t)c`ptY#(l_YG4m89m_$Afg@m&(u;r=I4Vsx&=QxQ zyDmEm=!JuzBya|2bDuJdKw|h`qT6bV8CFs4+S;sh_pSocs z)|NKm+<=nwa-0iLf{XjQ0()`h2}*!5jfKXxj-zrR)T5i*EQX6fDPPhFk6#Q zKm?~+7poE#0@HfBo**##sZDX;xz`4!re{Z=l59CA8bNv;FBB& xmG9FHMDI@kD8&^C?)$!O1N|;@_TOv4?LT5tyL}w(&U*j=002ovPDHLkV1lmk#v%X! literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_pyramid.png b/mods/technic-master/technic/textures/technic_cnc_pyramid.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc3322e5f729cb43591f4b8a999e7ced0ecbf09 GIT binary patch literal 480 zcmV<60U!Q}P)l3-W5--?a|+v_q)+@9UO^U_W!X5*T0wBBW46A2;BF9 z^h1MyfMNb(Kw54e0l*x`ksR8VrUR(Ka^M$B6U+8Q8-OJk))NL3Ui&<-n3tgyKr4*i z$5X@e9A`rsfi*Y@NSGY>JkrEmPO|{4h4J^JynxXD(jx;ep z(-eRaIGz?y5T6Zb4*OW4d=jroB7joA5egISL&9O-K;B+7d7x6S5spwA>^(UY`4110 zyx;g2)=GOll8vXC{R*}2kpqF^!UMwv8a5)Soz|w85M`SlTJ!V#c1}JkR~!K;M5&I=;id+I|3p W0^oF6IUle90000Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$AGPjWzeEj=)?2wU^4=(x^fy^o#Z|JjBnb4(boUJZ z`1c;ij z=B2cuA6n*Ko-%ul?6JmonP;9^ShKXLAKT9Q^X)CxChmLoC;v++wPnsNkC_8Xo2IFa zX=>9rw(Ire-rTzHT^l)|l+tDn$gC+j2Y_|k0z};ap6RGZEx3Wn|W>=QyYhg z0Jm0;`UJ48L^n=t*+2@2KJ~5ddNu-#kt}oky|B(q?Z?h$na$1C%H~^}vr!G~u>x`; zN)MXb1Q>%l4%VzoTiJ7*xSsM8z-*fMj7B~Tt^fYLy}iFjv_|zSjoZGoLKenxX#2KD ziZ{xWhMs3rWFcMpcI*eylR@@NBftTY$YvqS0lZSyWqJar>mFrDY!Zvv(DaSN2x?Mp zeMz@Ktlvrrj97kL-%jpvjpt13&~<#1Apj(TS>(-J_!!{8GxuN%S$S|^r_P%fSrpkY z<$c#?4ye27%|V*;IHE+~zI|(|=ih#OE_234IVztAfSiepjW-x>YWCaN&hrRBxez%l z-T*bi4LAAx`SXAN2-;GsvQ6f(_JpC zuN>~W#Kv%fb^Q+rSNP4L%5)F_Tngz%dCj8ozRURmpc36K+cgp*Qf4bz*df)%W=1(v ziiL+J2=@^VNYrr@(2EKRy4(S=RgmWdy4=nyDWpydIv-&3PBs?Y@ON-vgV@8X6Y6xy z^iqb614B9hT8ZA2W$*KV`qt4hdJZcl-Ew2)_k;(`TvwtxV`lw;Ukp6~!3||=nRM3$ z&S+SV5_qwv=GHQk8V}J_RDlQme7kYK3*sI0ht+zr?ux~(a6$(R;QXG3)H>Gcs;<*N zy33!j=W#vS0$CR_yCdnR3UD*Yk|m4HM+*hi!6M6JGue=(hn=_Uhd5w)6QI^tA6SU0 z*82e~>Dgp8ht6D|7apKI=j|5S{T&>L(gNZsLk?F~rfGtqp=D||p$Zi;V9B9-x>-R& zDxu&BE14UU-=v$`?`U7J%2`FJpoJ2q9^>J@*6#BM&a2v90AMVpS*zv2gbi1sKS;Zp zR{LQ{dIIHfKA30B1yDQS{adq15YBH8D=(yTPS6J;pn3;)5b)EAy@BjjSS%3-=L4d- z-t>O6ayOM^^ssw&I3WXt@>mf>(BQW4q&|}>9*12XeN*bIf`0BtwgP!H63efi}t>stg(b&tZ?Q&DG55WR}3T< zh>OGrCaM_Y09F9zEb-(3>?{nT_<>hIKv<(&ufzF%NRc%maz$ zGO>xx%XbFHw~cI7-X~lagDoU0n2a(G*2@vHV{aJ=>|oxIAFAmAAW%`$-mzMDgY}~i z5}_09jz^3%88dMLtc#HyGda%~REshs_1+hpe2|#lw>0;b-UWEGwlY!6gXfEhEt7g4 zOvl}&gY~{(sAFW~Fd_&@WwX+3^n|t4`Y6+KJ`obZdnv@Aa)?#bvM06sF~|Bh$>2HIyn1UV!Z07*qo IM6N<$g7Jiq4gdfE literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_slope.png b/mods/technic-master/technic/textures/technic_cnc_slope.png new file mode 100644 index 0000000000000000000000000000000000000000..083ae18cead58a9184bd67530aeafe610e9d7298 GIT binary patch literal 437 zcmV;m0ZRUfP)4D zo3T!BIziXKRXD7*@%zu{fAK0@tcw97?sXuA8v(P&c@0uUs5Ajr?rl_6<~7)FM4OreXIS^Ssm1%g%ZJ`M@xCjT*G+9! foXV%WVb%8!Ki5#NA|S~n00000NkvXXu0mjf9OS!A literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_slope_edge.png b/mods/technic-master/technic/textures/technic_cnc_slope_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..785adf6531fb5a95b387869ed590d354d071666b GIT binary patch literal 419 zcmV;U0bKrxP)=13A3=}IIiuvm3S2Fm2Y?DFyD)N zV3N{y0Y~BhW&(P^YUxp&s>Gf+u49;h-Y^Z0O>hKCTiR+HoC&-tEB>rH%y>g#@P%^? zcb;Zdrk!3$iYxE=PC;jZ!g+BIwv}FeVk!i}MYK?iyB>&J^JXRRSd5VG9I(aueQy9t z)1)0jj>5m}0JfkQXu~-#9^t~DpXuy8SlwFJ)o%g)cpCOT+%M<~`~W~B_g~(faa{la N002ovPDHLkV1jjZu+9Jg literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_slope_edge_upsdwn.png b/mods/technic-master/technic/textures/technic_cnc_slope_edge_upsdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..5adb788b795553448a74f32234eb12a0b152343b GIT binary patch literal 486 zcmV@P)-G35m*7E zDXP~xv;o+O`wdL#^)j*o*a^e*RG{3O1>hixm$n*t+&?owW1KoLa_NNd=I!sm z6?^kqpjhe;!2wbQ(&;ivGYjOf>I8G+ZvYKQK+#1@I|PhfF?1%t9Bdef$+j|iVx`iW z0b9~U9DJz#IwW~&f;B_Ldkujeb}f*Xox=(PAtIZ$8U0ts{|@ZU5|Wj*h&&C*OOH^g z-%PiemNens3g98dSL-)PE2^}~LsD=`Wd__WKsrd7l7`Ibb>JROh>QAlxGVA=u|e>=5CKlk|uIGXR1piP47y2dEy cT~p(>FB3e%#bcOwwEzGB07*qoM6N<$f*QunI{*Lx literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_slope_inner_edge.png b/mods/technic-master/technic/textures/technic_cnc_slope_inner_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..906dd2548b63cd146bcb3374293ddb3a7543e1e0 GIT binary patch literal 497 zcmVjl1O?K=K^ASUKmfXf-`}Di^3={f`jk! z^i*ILmIcmmBCv{s>m%t&xFvuZ&K!f4Bs~e*$>CaAS(9Xu7Em8^d=c+lG)1r)P@b*Q z?t&ADmwTYrBkcJov$m0fKqzM+JwS`~`aA)&(&WHcV#zV6{bHWz4Cqg64&3*>zUht7 n=enX^_ul?!+?BuouD7-yOl{;`+yuDy00000NkvXXu0mjfjFa2c literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png b/mods/technic-master/technic/textures/technic_cnc_slope_inner_edge_upsdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae0e14ddd6400f190469173534ae2fb8e8f45ee GIT binary patch literal 605 zcmV-j0;2tiP)SC+y6v1=45!R_Tg|K!GA0^zOqx02;X32S?}ONCyy1 z4Fck&2Z12&Hb{``#%T_KNaHil=|elf;7wg6?%k_}w!qYQ^aj!E>r7Cf_XMNJ5b*Z^ z(WU|UTo%Pb^CFd*YmsTXFx{BI8Uz9+6m2p&v&0IJ z<~R=MbpaE|aaww2i3dpSp}-9r;bs7PtA;wLWNH=;28scrjY^qbh4x?wZZ`1NKTlYO zqkYab&B%4pvHVF?bF7Wn-tUL=U;vmB>z3GqbCnnv(YJ}0m6Z~#XcX#7(1YysIT!Bd z__}F(6G#sLIn5(Mdan-#DOG}nfXK9CEMv`5$;&+rXd$gNmZ6%`zY0VL!ddQI@~;93 zR?`gkL2E=i(vzt*$Va1?PvF|>f&yhp*>Ns;7^n>v1USHnMJz#^f4|8^&OVk&T0jlg zztabR;|L}IWvR6U`_qV3p-DiFM1U6S`uqi8JFnriDWkae+$a;go=m*BQkS%C+g5g> rTN=^rAK&pd&pB~cLj@T9qT>30-TN_gAA!CT00000NkvXXu0mjfP2CS$ literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_slope_lying.png b/mods/technic-master/technic/textures/technic_cnc_slope_lying.png new file mode 100644 index 0000000000000000000000000000000000000000..377769a7f2d0c28cf411134146fb6d5e9d13b89c GIT binary patch literal 548 zcmV+<0^9wGP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$AGPjWzeEE32oCLI7gvtt_B>i;!gOxBfdJV%cg%G9y zzQ;|gMnG`3WQ$-Ou+TFv3eGQDyIzu{9&irh<+sOfCX4H~)Ns77-EkMd7?^!m23p}_ z0{khLdO$J9e-#3HLEg>tL1qH(0hZ_b48SAcwi9Us@JJ|M#wP&n;*vz*9+#>liU4xs zTfxR$`%|%YUFZ{lfP-o@y=ag>=XjN8LSckKIji2c%stEaWyX^{f6gO}?VsugA9Z^L zXWiQYMZH56q00Yzx^`C=Gxlr@YPiDze`mR2u_Wn$o-D3akY$A)@RS$Kb(a|r zpss(|oG}Qv4%iix`k?EdI|iwqEif&+ literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_slope_upsdwn.png b/mods/technic-master/technic/textures/technic_cnc_slope_upsdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..b802b60db0e329dddc96884da31bd597d8e8c925 GIT binary patch literal 440 zcmV;p0Z0CcP)w5W*3X?{nhyK)`5p zwf!Zi)5T(Zcio+!wILAW;9QS10G43%w{hqokb|mSBf|~=H8^?c1wad!y!1@q3>+`b z25=^dKjI6(t6}Z3I|QCfUn%jb6rXV&f+J5yj{4vW;S#b7{H=y_^Q16#f~6VXikeXP zz@=Rd?7>t(P1$K`wbGgZ^Z4TLfJ-glyi``vDCRzOw3swC0QPXAQ9J@Im6MyCS&4h2 zyoThYHzh#~#$}f#H#I?;s$@{$WFL~1gxd#O*FmBQk@i-Z6Yg>#oj+?pz%2vf`I90s zZYdCV1={aiBv=|qG(9&7(y7U1g0)2153Cl`%=kT+@5SSPplx{r?*z38XxryLxbM5) i59s;j-SHRxXnO-cQtO1vAaX7M00003v?#Bj2nR*28_Y2?M-;+mSo0uB>$2druzw4i1^)78bZP}A1n4DioMaNqZJ|ABr@)inPvc>M{6 W_hHLH!dDsq0000?H^6s{au38*-x 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 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_cnc_twocurvededge.png b/mods/technic-master/technic/textures/technic_cnc_twocurvededge.png new file mode 100644 index 0000000000000000000000000000000000000000..3219a901a9d59300b06564f0e1fa84b81f8f1eec GIT binary patch literal 768 zcmV+b1ONPqP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy7<5HgbW?9;ba!ELWdKlNX>N2bPDNB8b~7$AGPjWzeErp|W5NgmFR0UKQfr8jd z5RKIw*5<|`?Sm>HXC74Kd^A*Wa^3^F%FzsvK~Xr^18*t5%(wSfV22(YASJ+psi#%^ zNHbvTd7$_)%oc)a3L2)=x0P?2Jh0LVw=B^0%)S!!(&AcG?((az8%w84NWm15UcG&3UB z>eNL6h4zImaZVu}R!gmAxGF$a?u`I(in$-5eML*u^WmBRvYG${D1iNTR%&gv#j)Ij z)vz4aBL!;Vnkg8^6GR@7#%1i!la(yq`B2^<^0im10a#Tl$D8mYcIx_Y5K<6 zc??B#)<)+hRYBAc?o`VdgE=5F9;yH!vLESVTvR3Ji!mLMOIcM#RhR<+@$>U zV+9psztRRx>`48=lywIpO)n(YokaavfkeS zfU2~nc)h*?0HQ196Om(l*!Pzhmoc>W)_Z+>`~6^w>|-bcP|g=snWlRppVEJuY}+$) z=)H|GTB}D_A>49|%k}!o9LCU;-T~lr`nHtybo&0`;b)Nq03zw`?#G-jA>88sXpuBc z_W)4q)wvUq6-m}cA|JvXqVxV{jDaECitOIsSUZ1y{z2ps(fgUm8e_&7#u!yGrl<5S zlCZUEZB&)R?z%n^*>(Lp=Z_c{004m2aw%(!ORXC-J7Y{KyR{ww&gUPDG2Y)WhkbwP zy%G82m+Sh(9I*G^T8(iLDXrDsd(IbQjJ0u|ABjA(%lV_$?Ktnhu;gS#*Mz^}00000 LNkvXXu0mjf!@f95 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_coal_alloy_furnace_front.png b/mods/technic-master/technic/textures/technic_coal_alloy_furnace_front.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d93dd031c72fdd84a1e1efe1024a6d7eec9871 GIT binary patch literal 681 zcmV;a0#^NrP)0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbPBS}O-R4C6S&OL7wM;HL$_j6}<&yIb9AUPFD3JOBwCRP4_ zgDDV_+ej!O1nk2$w|g`1$E3*f3m$y+=6cdeRCl}cMDn&Fp_|>`f8Ad`(^{DLv~3Z7 z+EzpqLIl84XLmC*W(Gj_sI_V-BY{*{M1(Vkdl#KbsdGe<>TfTvy!Xf?dS+&|l!wCs zApYJ)T2mZbW*b3ECMn|#Le5c z$Kw$ql(|PBbFKCL?X57MT0=r4rZO*eQULHwA_9Q-A3m&4PmK8P<|fQ`%hGxm5fM#y zadQI%fU25fAQ2))W-|--%!~*aV^SFzr4-rL@0lq~12H3F3}(*EX_{EXS_6Q2p1*zi z*xHGZq%ON~pGpBlVisn1S7s!N2x2Cp?Q}Z(;qn~7%<%g6KbGCusrR2>T(AfL41h`1 z%*-8n|G)Kl4FDh_K@qbqq95;9cc1IDuG@Ni0)Vsg3nUhi-V6W`28xnM0g~P}>pdb) z%|xWux%aj#%NPU3AW>CCRzi@BJ|c9gVNIDH|M~O#@fZ;RaQo#GGrxR&9T8?-r$Ws9 z{KZf6Zik55*T1~2M8wQv3>8t;%-p`+J>Gr3`0>iEXM{XG9!e=B+TGV}Tjm)6L_|aY z5dd0iV~j9MkB7$xDy1Io{%zaQ-9?0nh)6^tGu&$_=Vxb#7~!YWI@RSrQ)Ot6D>1)) P00000NkvXXu0mjfGBqTn literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_coal_alloy_furnace_front_active.png b/mods/technic-master/technic/textures/technic_coal_alloy_furnace_front_active.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc4e0ae7f72bcd6e68bb7491237b708ca6e995c GIT binary patch literal 697 zcmV;q0!ICbP)>7c&P+f2efad(%RvSfS+CC=N$ZS++WYnOxBc#1N=}rP zc{bB!o)D1<5dd=;ReSF}r38SgR!Wha!-0eoGjnne)y6X9Tt+h|kzXEPXlv$9bl!U} zIo}?S0QPAP^Vse8$HP_n`ROx}ArOAL*qd3XT7;SvW;L@2SKY76)LlJf5bCXVGjI>H z*DwA&olamTDK#@psg&}^?{7J!rB)6W`sH8N`}rYi zYs}0nuFBfA0|G!1*}XF)+FzNu*WPz;)!iQeK*S&%ZaHV3r|<60i2`wZlRcKA!-R$dR06;{H%)K{e`EWg{>R5(pny1q}0Bp{-NQs$S z?Eruf$U@8+h+Ca|Yi738&djBZt<}|P6%i0YEFywQ2!Y*Nn8{GAS4njD<)81TlbHd) zyQ|MBrN_@M&8+t(L#C9{!$&`k>op?I-#%)ch$y8L5yC7Y?mpif?haqKKU`>UZpQa_ z$DA{UjNsnTk|qS7r5DQ`TAlB2$QNbQMTd z&4{e>aR3lOQ$U!Rs2RxPa)=s*K0LE10${jD1V|AjkQpQ;_9hUqBBH9#b9UD}&v~9} zEea{p-8;6aqRZBN#8xw3>vSJ$PBl|AALI4UZ#C;~007;K?M)FhyGlerHU(XxmYD$8-j!(|Rb4=%TSU4W-Rpb^ zx3lrK<)|(d0cmFD izUSGL*lX@J-2Vg5!A+ehB!V~q0000UjNsnTk|qS7r5DQ`TAlB2$QNbQMTd z&4{e>aR3lOQ$U!Rs2RxPa)=s*K0LE10${jD1V|AjkQpQ;_9hUqBBH9#b9UD}&v~9} zEea{p-8;6aqRZBN#8xw3>vSJ$PBl|AALI4UZ#C;~007;K?M)FhyGlerHU(XxmYD$8-j!(|Rb4=%TSU4W-Rpb^ zx3lrK<)|(d0cmFD izUSGL*lX@J-2Vg5!A+ehB!V~q0000}CTIwg={Jb3}RrWLy)?7uT1E z|E~Q#!N@dstF!8C_t!UF7b@g_Pb`0MXHJWHqq*Rjp6pYHrheV;kSq6J&*1Zl)z26^ z@6A1<|Mg_TQf~plxJz$M8fH#>ahLIA`DKQ*W0!BUxwJfCe{%cinl+9t5xMu4GoI;r zzJ;N-=8>uPGDi277dck@`?OE;zg&`PJFDBfK5=72!R>7`&ZbGUF;>p&-jY-B`hLRJ zwT1F$&)cUi6**pbCdeyd8teV{MYfni=}m@d&jN6o{+X<9k-_H ztYwYQD-Dh*a4?CuGA8#(FnVde`~9zC))b+>#}3)Nx3>wlDehW#xNd*D0Fz70s#Pou ZHH__ZPV1bzu+<0@a-Ob!F6*2UngH!{u2=v7 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_composite_plate.png b/mods/technic-master/technic/textures/technic_composite_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..79b7b8d91095fa23472b8e18d48e6f10fa12cc9f GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar`0C208K_P~ceI#{QFK z-aFxMi{EZ(nQ_YDT6AdEZ3dBx3=XAt)DIWO`Nl1>+H{zKA+bGv!~D|sMNiM9reAyG ze0t{LeW$kzb8@D*+~J$yv9h_KC5V07$Hja(=S+=XJM2;Ia@dsp$6BuLgR_d7R2whQ OUItHBKbLh*2~7Z3bUv~G literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_back.png b/mods/technic-master/technic/textures/technic_constructor_back.png new file mode 100644 index 0000000000000000000000000000000000000000..f002363b7950cc0cf150796a159a99e0f5240cf3 GIT binary patch literal 638 zcmV-^0)hRBP)nMe!_Dk8A62D~2IN6TW~BW6&tD}XKv4y1imF1v ziNI9J3`7+(=j@HBP+6!7URAW#2!*bSs8f}kIJh=k44QxlWTK{=O0*!>!N(Y+!uR;X z5KabCijRhsqOO=IX9qZl3VUt#-iRB%_F{Zpm@2JxevQG;>xH$3su5??TEnam0EEaS z*QAe*yE^c6(0d0}uCH$pVT{3Ai>jhG#oal1xVVrk-tQNVKCw!aI0sc_jEk(KwT8Dw zM4+PleBMySUW+*w?v7R@8iG`jRa7Pjm^%qn70nxKP88*w!`U0}MhPeghXY;76Nm_L z0yCqxPHTjHs@giNY|_lCCK z=w+xG1w;ftpAQJkd1ETv^X9&9D8XBM($N6W%tV_#CZ0r4+>CkO2=MyzVy#JQjiRVZ zM1&;CO#IPUP&39gK!vpzRWRpdt%)G)z3F36m3-cB&fHWbes&-h1j*VPujdm*vG;nW zHKSW+&JSyD5T$>0_S|?@Qt)VeHuL8P9gl@)Z>kDrQ55~^L~>g?M+aaE0KW%|6ept08l3>1qD_FpU(#~b%707*qoM6N<$f+3a@*Z=?k literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_front_off.png b/mods/technic-master/technic/textures/technic_constructor_front_off.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f7856de5c154ea156030da2e4f6baf4b111fec GIT binary patch literal 635 zcmV->0)+jEP)|R z07@xD1QCI|6A_rZ(|cc+Rf!o`GJH5?D_k#EzJ32jZ=IA9J{=#<{dULQS+m4a2bKsy zN{QdA)rQaY5CK6TB5a2ZRaHWQKGv9H4Cb87IiFqyK|;tSGsfU}IO6WK+OWstu|^w? zCPhRL6?`}%vcif<-ZHH=4u=D+HAG|u`uh6H?RrC1dE6iP@RftvQy}N{@>Vu_?^s%` zrIfIk!5ov1{R4nn>(l%D`#b-)RF&E)hCm;k*RQX%-bk7lKFF4z0;ki7WUK$*t(C2C z`M6-JO0AVzD>>)oEfRB1-rn9g91oPO&{`vxjJs1x!P2s*V+?Z6m>GR^+#OMQ()aT6 zf|;R7X^%xB0+0GwB#H>Evt-MQvf)oI?)N*wN*sfTKt(aLC9J9-ph+1%m_GmD-OScL zbG4I=loArczV8cVWYO4bU$FGS7-I<}gTuctiLl>xPUjOrtSnk@lwA1y_#`5@UaxH1 zwipl=rL7YYlw3HTkM!RE`%EgU&zv$om-kvLW^2^Xzd!Nm2*Q5f8DmgNVT^$$4__deDMur#rEZc)$CzxNk* z#(|s@X2y?yeh_0sRY^Ia7LAk>&(F_19v-o1cll-!5uua}K+c(`-=DB(9G(sc(o?9l zQnrExBd?j=Zo2z-_d5fh^Dr|+g>f9wTrx36+?{n@(V(pBa_`<+yWcoHK6ln-CFk5p z#Jjxxv`0iZ9QXG@HgDatD9f@SDnyMPys}}#(5ajD6M4(LzP@77sI_vrTzGhR=rLO8 zo=uS^Y}>}|cEeIiXi#t{Yk{Goy{rqhRP<2^V^2q7Q|Wn5<3!m?Uzn6o>6>>xojdcvcz=JVwZa6 Y{}x1Ht8g|V4*&oF07*qoM6N<$g0!qNe*gdg literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk1_bottom_off.png b/mods/technic-master/technic/textures/technic_constructor_mk1_bottom_off.png new file mode 100644 index 0000000000000000000000000000000000000000..0c525578c14bbd8d6a00ffbed0154af19aac5745 GIT binary patch literal 638 zcmV-^0)hRBP)>IBc3QVM=!Z;k=m%L~>AYuuca6Q@7UXkRM&()ju97yFAn zj+SfOomwwpw@rTZ_#wCvtpiYo8J-+>Ll_<5?qJ4pwZh#gdjn6OJ;B}ZS}*B6u#&)_ zwu+krh6rruo&o3EEs~%Mk|V&ACpWqzki@th0nutB z%OEufZyet~F7gpfl@nVif)5H`6wkp*VtY|qazH-tl-M5H039=M^a2a!ZKkvvfqD1xqFG2cT52}6o2L(L422*QNfWZ2pE z6d{s1!!SS-V{g#K>G{v=$CS}~C#RB$)+nV+5;4Y$Ed+GyB%2bdfWZ^J23Cx59C0&# Y1G{GYe?)okeE;z4*HVlqU4ED{XX9rpV6 zc6yp%Pd?8vv>5p+Qj<`XTYzYE%V87*8gsDrr#h@X-TQ z1#R06W(7$B1lru9qJVI2-XqBP4bA`j6hyF`w-TJ_3gScwii(o85Mz%~e}v(zex71hwtQ#4 z*r%9rk!x_sO^b^VEf+!+w%)b_X6!AlV*)V->dQ++1xKOnM1(5hR#3sO4#eFtae@X~ zFL)`K7e@U7E)Wph%T=Hvf|gP!;)ryCUDPWaCx}v26=bKe4CbsZm%GDs!OVyuMM}=3 ylsbtB&ANsHCPt91pUASRmSV-cZc84EvVPL@m{{b;tXy3N9 zotb-G3@yxRCYhX^^PD56pFg>X5JJG+Ddsdy02c^QQpU`QO+6DD8&ndtsw02S7`0qs(@qW4EJ|vN7EVs2X#mk`deGvwG*N$4iq;gH)Av?`uDmv z>oDtt4FfG+h)u*&A?LEG>2Y26gb|1Jb0ZKukWh4Y{MlJ^KJU!UQieY<)*#04T z_Zj`|-a`v0m>Y_)Dw)CF0qyOmq7-Gg+hf)a>mJ;&Vx&cRBmhhoE!+J8QDSuq#HK++ zaEH}m$??fCO>9W3CFaK2m#?+Pb>i84QpZ9Cm{R6`20R(;aCv^Yfiu1xKdMm#m4N$t z=SCA72!eWrcl7dzY#C1l3-IFAbAEk4uMtv8Xp97}GseNNdR34D*)o=m5Cd1|SDTh9 z0};|h``@E`rtCq@q*(nbIP002ovPDHLk FV1kI(8}|SJ literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk1_side1_on.png b/mods/technic-master/technic/textures/technic_constructor_mk1_side1_on.png new file mode 100644 index 0000000000000000000000000000000000000000..eda98d8ab40c536f2a10a5cfd7e11e8efff699f2 GIT binary patch literal 687 zcmV;g0#N;lP)Y1qz{70Z}cm0JDs85Qu0FKmaB&?Z76pDOEuOnt*AhwgxSbg8(0#E@!&= zlutkZgfG7QjGM_(oX7!yWFTm@0^rx5{`q^2BqZVPxcl9L)EO-r%d-`YK+WkHNI4^o z_wM^W&tHDU*?dmF-LmdCy#DbL1lb*y^A#kKLnA9tOBwG6rn4zOzxss$h+w}va1%zB zfeWTe>`n&`+YK^-AUybQz2oX~gP8$=d$4-^fPTFj5eTq=LSue*#@l{NHY0!*&h~PH zCF8q)|D-O&&^NxFd~laRi$?A;!!QsQw>90b3t%?Oup4L(6Za>lNYqjZAP1vN&2M=h zJ$cMuzyHBEi}zqLA}kj(c31mr1OpGp5JRgh-+e-VwH~9Cv3h65zF&<#gyYRA$98uC z!0yf%O66Ju9xfkn zaei?d&gN=!uSN+|BI3q#r^_8AVF5@y{pcyxD^VJr;KPsK=hvUkM}$%emNO|vjR|mk zd>W`h^@>*~<;0uwH@7W~8Az1l2{R)QDI4LALbPzq3=QDkNSZL4&v<({0>P<>{{eeS VEDdrm9Z&!O002ovPDHLkV1lV_A`Jil literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk1_side2_off.png b/mods/technic-master/technic/textures/technic_constructor_mk1_side2_off.png new file mode 100644 index 0000000000000000000000000000000000000000..b33fcfb50be44bad9ca036e985a01efae49a1c6f GIT binary patch literal 654 zcmV;90&)F`P)1MS%D?@uzdCIM8eFNN`6`wJAxOXL~uk zG^sC^*4o*b*|CnFo_KL5rGx`#?_S|RZZl>gqzDC&)3$|RLK3AE+#TyDFbStSwK^^l zdJ(fobtjtxLhdLS1QAoBx)V2jy#4Towq28kJt)rI;*J;tRKT6=75b5K-yo;g^mhP1 zfBeGCFf-g8cjxHIA;6YhNIh_HuU$Qhh`Pt;r!P3%o3b~Vuv{!S|N4!1d;|h_C^<8V zLp&G(akIQ8BqQF#Uw*%2G#-M4fPT}b%`ICB5*7k7;eyFv%3^W5lQ7;NaQ$bFnE+91 zB@G&8hht;{oU6aT8BV5*n<00~$iVIa{>_)%uI9{Fx7;jmuwdL=T_cHLMl?eb!@+=- zf_cYm3jm;vfl_D8!}Z?ZITvbMh$&LM>?90F4S8L55=!OZ(X3lxsR(d)fb;$$^RIgy{*7*6$M@&ZQb?#rBUyxD{shgbJOh6DK zMb5v)oJ2q`pPl%sg_si4{prSxZtm>y!FE1CZ2CAA_pXw#2T}fX#$vs~3Md7lMQYCA zP8Cp`N|!)MNQRsp1B;!S*Y8g$rDD;r3?96TZ*k0QYe|(;b0*%kyCpTl2C7qYi)tVX o>berN`5$shTM3;q-M7!{U9Z;)ASDPyL4<-J%AYD)fhJ0kwCRzc zM-bU2&uhPX=cIVH*O}%@GnzAJ=A3Kyzj~l1QA$C;qo2P=KpiXYMk*N^U}78_$qh53 zwT2{oUck)|Q$z@vk!Bh9Oh{B0V3>p@hh*eZ2#I{%$4^gwWE`(3{S2D894^T@K>!j} z0rO0|X)rPC=6is@{`?zv$K8>HB<_8A3~V)!E!GUf z|N9k|M+;8>J;&VuBO)k^j_vUha|6VO|Nfz0tyy+GmsT-n5AgB)f_U{3+iZwoApQ0` zXCF>E*&dSIF`z2w7Yjx;ToW_rPUMplVzNJhKj=97_v-ZXX%Imvg@^zI01i!!qy&O+FoV`RD#mWJ#Uyg;D`nbI1s)E-lj%Mt zBbQ9=D=x5r)$I~8h@k5_YTsjKhJ}dn@qBiG5G|bDZUNz$syav|1;nk^L3E;!Y2LzZI ze%=%36*D6uIQjGuNp!Og5V>TmlnE&r(KiSvxr~VngpJgLse7~8;87AZM?n7Z{U@9C zhIjAZ0?_ZacyrtX2oj=sKm^yT74A;I-tqOzx8c`r*Bbz4lPSxqB_2+zjf0~(>&c)U z?(cDPwdUe_iMvzEWHb}>`sJIr&+>nkN05c+%7a@yOwXfwq-}fg54ns3NfPP>?EnA( M07*qoM6N<$f?e?tIRF3v literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk1_top_on.png b/mods/technic-master/technic/textures/technic_constructor_mk1_top_on.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8d6fb1627eda0769809a10bc40f2b46202747d GIT binary patch literal 644 zcmV-~0( zK~y-)m6E+~6hRP#zv`K}J@o>0_{{wB88}4DKcb6l5yUyQ9vb-Y(#*FAg63Ft}ceAQeyG@C(?i%5i~b$qUr-# zK;8C)M2_mX33KTB4a;^j;7O!p2+ zuJj5BVKoL>7K6G$wjhGOI<-3CLsO$&N#n8!vYDYO7_EpHcvq_pe||0S2>ccJ`|d4lVt5}|^@{gS z?>zw=pBy8=%y{+n4X?kx#mtBZPM$qQ63wguL@pUCWkO0ubQJ0000Bsgs@h^T3DDz zPgiC5&?8ntoQOkJN_mNhjIbNO+*DtAVn-x;f&kxwXI|Ibw?Kw4q?J%GaO#%#W;F3_A zj8TYJf4w55OlOTRoMG5RyJX(HezQ-b$TBdIEjeyZ_2BrzWH=fOc|{;aw?gq zl~T$?5o6e{A)r|!*_2QPbe?EqV8s}Q0XO4+(CrA^Ky)=E00000NkvXXu0mjfW-%xW literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk2_bottom_on.png b/mods/technic-master/technic/textures/technic_constructor_mk2_bottom_on.png new file mode 100644 index 0000000000000000000000000000000000000000..52d739bf1cfd0ef2c5381c59c6c832eea9bae8f0 GIT binary patch literal 694 zcmV;n0!jUeP)d zWD=(&76u{NLf-YvY){{N4ndD>2@z4r2`Z_oQ>7cPy%BxkB?JWjjel|D1UU#UC-Hya z5t!wI<;;h7&&Z{4@3T+n7Yl~dW2_{sBvw}kWQm&}-{SPz70zy-VL4Mu!H$*-1Z?-0 zoSdFuGEz>Q|GnYs$KUhKqaS(p^f|}FlB=r|%#3N;!@*5{=iRr!gx3Z@>3S>~X5u&< z@jO(vSY*WbKB-}jWRM2yo5BX15{2 z>6dH1`t3WueEcmZ>kfD4avTW{S_BTzz#@WZb1>n-gP$IdQl?X5r?(l#VU}Go4}X1l zXk(B=pg{LOzaL47YK}05#XuwY<%gd+9tH$lTwL(cr+4ty*wpP@fUy!1xm721>EO-h z+ZuQ8-KGh0PHcBOWFjz_<{GCi6U{LZF9s43GzG~LQ#j#H3ujm?2|+?c_={mlhcCDS z$pF}F&k2Ggqw6}T!PqLa;C%P&j`Bjg{1@dQn}c&iVAmpATIUF-F{-VouXUa6yEUN6ehmBm}&9{VxJ? z&P0i1?o1~WT#j6*jDQ$}6C6TFC^?SsVgNW0B&H37$!y9frvOF3G%=O}#gTyk+Zats zH0_jIcW?6R?{_$>W2L;uQ?npusW`>!ae-N8M@xso0mx7~WNaFTy zx0y|+b8iWgFouv{3&Qf2DYJk_}VQz`!M>5(yyIFKAx%O!hz z*V%aFWYw{E?Fyeieq#5BOMqkMv|BTlN2{9LqrV>cbk-t7v4Udc-J5rmG9pzIol_p% zuws<4Fs#?i8b|=kb(lf(fhR zuEIjVin0HEA0f<*7{Y0U_3p*d;(Lrq5NA>fFZ0&a#}6t_y_2Fwak j6K3s#<#=_AN}%dU z;?9S6XqQXMFcJaHBC}er>AQ}<`z;Udo`WE}!}0nSB#}b|qLj+7ch4|0q**;8h}jPN z-6hvym<(LdC~+7E?)~r!@=LM}^xc-ldd0>0mcHAu>w3Cv&kHZEZeAe30t%J&YQ@pf z5#RpxnEhyc{nBl^^DUN)@BaLqX(PtI^3CGp=0J@~ZZhLI5;oiPLuQH~1jZa>+h*8} z)T6}zC#OhEWg>tau;1gC&vkr?(JubsTXv)`U_x_JdQfqQVgY1v)u=jKkoJdI_$ zMu_SarNonmPpEZ5nnMh(cnHUV&sIM6nb0d|L;&H9+EJlkrFk3ao{&1yp#2D-k- za-zu%WgPHue*FHYxyBhx*k5)tEEry$vwLR<;o&5+s|x48w-?+0YRr-_B_gglcV0hv z6_T(3BrInppNLZN1aH0lCTBn2pWT*Hu$)OTV@!bK^J<_9lTY~Mq?~wk|IxLPD-I;e zVZh7?M9N0EqYyQGrf~%KO45RM-SW@n0SJa7{spm_H~>A=)I|UQ002ovPDHLkV1ibg BPC5Vp literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk2_side2_off.png b/mods/technic-master/technic/textures/technic_constructor_mk2_side2_off.png new file mode 100644 index 0000000000000000000000000000000000000000..f6407e78e578a001664e999753a3643ef688d4ba GIT binary patch literal 683 zcmV;c0#yBpP)JykPQ(MOC%zQvWi6dF?YKA z+I6zH-D>czESLSAQ^)r0gL5^BQVIetp8kk{+E?6-R5CQcMBg`(8)imp4N3U8fSVzP z6(M9s8fDxwAyHj`VG@=cl95XxB=WwGU!MO=-|r~15j3&ww&a{30Ew!Aai$#_OpGSu z;{_ky|Ao8b?npusW(I&lU~vE8eGo`7>{lZ*oZ#n2URm`A_M{KrR z-u?NGlRQJoNf^uP1*tgsApY&;TTX7wzzhS-Y)@iD1i559CCm*OoK5F+-5NhgxN&pJ zar(>8sLhz#Uv4MqO(o`bI99rgkKlolK~^TeurwLo+6}Ql^=>>Q)reag3M0{lWa^e6M$S zy+!P4ghH%0YeXO&g8yZdUtZAdHh2RoiR_uE6(qudCW6@eX_z@Cjvja()co}939SX5 z9j~CIA-+wx``#D`6HzO9+YcxJli379MD4LiRD;+B$@c%lMC$`XL$k6iKq|w1Z$ySSd~@$M*JcZ5^Eun5 zq1*SEL8?aV+LpI}z2ziMQE&prYP%#PCtjI*IoI zJSN0|2gl7B&;iMi3L!-9p5H||6FeY9yK9a$KK%73+?+J3==zS*XXdjRsjAp)H@trN znt(xwWD}dFCJ~M`UOa!r;%srCZ1_Ewa!?~w#Co?z6r?NgzeM@xbDI4Q&tNGKJyQA} zB#Hr96b1s#3^T{XF$0f-o9}+ON6rP0j`yIT0pBd#{SXWk6Q%EoZ8t~(7*EGgMCm)M q1bTzA9}<^@OysU$h*An6Mg9kiE-xXZ?WTM*oeC@KsXG$4i{-5omp z-n+NTMR$UXE6=hHRdvp((#(Nj+mKYA>!1$n6D6`g)#d3*&-EPNMUtgo< z$7KO+sDwn0=C}!S`1AG-OGX`?<$TWL?GDkn_-xM4KmI}~iHP9i^@rq10RoeRk{}70 zxVpZgwaO5Qqv#+asAJ{zo7X3`qADOnZsC{`<{-pkwm>ra{R6Z05(R9wPn@l0OuG)5 zND={%I9@?bAmQPReUB7;^6C2MHG&T=KSBz|emG`?kc&1}OaY$3aweIv-R%hA?)DG* zzGoZ;{=WMQNyI7nS{q@3dtl8QUY+Wd04yg2m>Jwxbl)&DB7!o>NTQo}fXF3drA$c4 zh_OLH$>sEs@qBI|2w*m!BOL>$IRf(A-+t$?Kk&tup93%sJ>DGmKmt<807*qoM6N<$g0fK|SO5S3 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk2_top_on.png b/mods/technic-master/technic/textures/technic_constructor_mk2_top_on.png new file mode 100644 index 0000000000000000000000000000000000000000..9762bd6b52bf93d999517df4f6a0a67b99d846c7 GIT binary patch literal 685 zcmV;e0#f~nP)yMHWd`aU%!@!KV@Q0elNz!S@IVZd`~O z^M{}z8At*$(>-?g_kH(Px#%`X$R=l5MOB@1>gdi_cY+8?DMSPy0B~q(Bqb1pgBi5Z zQ89*Xk4fYzi_DkXlr z`xEoU0s*VlicdegjhgR{1+<|O5;>aVCd}d4lT$1ib#xZ98Q(qnjmzqyT|QLP?N>Ox(JCi`FVbB&P8v7u^LBK^-gCZ(iTC6;%Ntatp_lFb5&# z(>apSuh01A>X#^Bvm7`)nsU%}$V8F|fW+<#Y61xlXY6~V;L1lQJFOACd;C69F!saF zBZOSEv0@7F43;y=jOA)Y0H;r$()T^%F!1v9Ig*II^R+g@0{6h0H@rI4D*;$e2rx6g zfA%v!y!Zn%BO)l1j3l~Q2Z&rUR?38wj2IgPlw9_S3?`E;n>GSL0MpqFX=gai5s)80 z{EO{+%O^KJ24Ea|ygBZ{KW)RY@2C>NYPrPS8P@~9|MCEUyjgDnm`x5iKRd_6X|-|m z&YZ6&UjT6FaKXjdn!i`)xI3jx_GW@UJU)q6S$<1+1X+l#{I9x?>KpM|uOG#~^3oh> T%E_YC00000NkvXXu0mjfO#~&2 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk3_bottom_off.png b/mods/technic-master/technic/textures/technic_constructor_mk3_bottom_off.png new file mode 100644 index 0000000000000000000000000000000000000000..606d97e22c6a2f1a5c69ddb2284d996921397e01 GIT binary patch literal 700 zcmV;t0z>_YP)RQgCGC^0!c|k zK~y-)os-LJlvxnPe^qtw{W{&z#77bzNrZt}Du@W8X5)yP`Rhk;BR)WfWW;D5ZFl;+ z-@Uh7bc2kz@@#5Ri>mYE9NE3O=UwE71aN+>pLYEK!EqLY@H=YmsD_A!z>{Z>2{Cf; z{3+dN#QNq0jfO_!($#fDjmLjIVe{G*4xS&NArNCEtc^!3<_n5fHa0gfH7pqCCo}Z) zGXQ6Ki_06A7{!FDl5-C$H{p*z?+`}`N&_Iogqor%$jX_jfC%Hs1XZOQkGTKvF2j(~ zVaVXJWFw#=sOXBAV5@}yx$kjzhD9dVvi!i*D6KGB8zDez4PQ;Yx=jIEZHNd%F1R~o zD1=}vW*K#X;0m=-Tcb+}0dDQ@(sdm%CAMzu;O>Zkh|p@K=8CGItu=-=&}v0R5i{I{ z!w>(0fQfK?^a*z%c4^7PlqL;}fncKG;37Cq9y0EYZhV<`_!fYT{o9n*sHNh~(G)Q% zRvdMAQcTpL;LREOj9DN_{SiPBLJWus2-G~F)hV?gFaCbvUFvxA`aPyb2!Yd+GjgAq ztgj=$bUI~wXA4v~`EtT|vc}&2O+K4b01?y79^zXAdnjsVwyZ__!gHfpT|i-G>)f(MW8QELU3z)TGU`bCf0Dw*C$ iUB{yDna}2^2;Tt(#S8a@$H{;I0000@ z-t*|AhxiaUdi)`27+9_rXmDt7TzO-OsN>OCO@{A@ljUXE02?5*~2 z>Tuq1zP{j_aSgy{d7rC$R~SM>RmpjRSKIiv?%yK}5o!m(hln~wRTzednV~8m!hEqn zRY~)KciwwIDH$y#gUQYt0Tn?-0YTOAVB7+N0C}1)Gs>9Bt?m>!b<|!NW&;BB-mzEp zQ#Xg@oZdPjLdg{~qn3*Ij`1R+Cg4q>bz1MF7!lyk;ayTngc!MT=N4v$2#5&1HCk?{ z3fg<8^g?e96-AuGO!)2DF$g#jPJaIbGa;l1fI6j1#|4jfqF`Vm7)CA`vrd{{<@>W2 zDDc6x6}5L-ZCE!n1{@7n4R2<|5NV}i-6&JWIZvz;ap;)sWc%O|6%c5-pv|bQB2PYf zVkstm{^=K-I=uJ1T%VDr%woAjfX!yZ&09A>h4ty0`C`Vw;cZL=ZM9QtW!h%G`tv#7 z?IvA6xXG8N$9!>m%=LS3a&qz)DJH%x=j5^AqQ|M=1p@=`l@?}v{p>0Gd1UqCSC)Nu z>+gR2ftN9H_H@Hx8F5P?rbymS_})7%dN$`5d_Eg6KfvO3;j(|iIBqWKtDA1g3F9-R?87PE3h$nz+2UL`C=;w^|i+uiq)B00000NkvXXu0mjf DylYD4 literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk3_side1_off.png b/mods/technic-master/technic/textures/technic_constructor_mk3_side1_off.png new file mode 100644 index 0000000000000000000000000000000000000000..84dd7eb74f59f5c7ced3e75ab6befa837c022f42 GIT binary patch literal 727 zcmV;|0x127P)L=X{F6;6#WZh$)bArd}>N?OGl`JO+V)I1KpLp!@SL_V&j7 zbo_+A>v7H@vUWE!Y#oQ?qUK#0Ze58W7~_xkdHw2dL~DX;n9ru9;efX%Q|7Y;i`ksn zbk6o@aE_p5&7;6{@|>MdZt(i$3jlTxt}#2A;=E(=<`sT(v`qf&fy-3}Aaj=LOeX8O z06fs~q1^iyqdT`*E*6ZhUT6E@CadL&i+h*Qq723#abbL!JlbctRh=UgEgNTH{?C+@ z6Cr1$^i-n}^?c6m#a#qYQ?w}EX*qw;cRgV2h;V5q^sKPpy=S#L<;u0|^u1EF z@cH3Qd<=*g&U^5VzU>fz;0WS5e)M>a&@>HS-T#8p_UlL?U>J411cB%xy(qy25My%m z{C`UYM5yNroO2jL(Sj94L@1^dR}h0%SHzg8h83&&6fl}j_z$0u9g*Z}Taf?&002ov JPDHLkV1hOtQs)2w literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk3_side1_on.png b/mods/technic-master/technic/textures/technic_constructor_mk3_side1_on.png new file mode 100644 index 0000000000000000000000000000000000000000..2741d2d100235ccf550af969fe8a124a0ac53011 GIT binary patch literal 762 zcmVf3n@87}cZW7l6to5z6i`~;=RRL$Do>h9{^Cmh!8!vSS5bAf5e69 zgghuAd9Gc5hY&mkOUVTzmNZHD6!_@YO+ttq+&KWir5H(7;_i!MeyJ)x&)fX@+h3p{ zM#e-{L z0f!hA*y&pSIeyBeOM5&xe8|ub7-J9_(^VB6acGt+&c-m~B*JdjvUlY&&!4?O$_i&% z>cyNeshFM2sTWI@i<-r}=E81uUcr<+_L*qrtKT0polbdBzvTYQ8C6xWIGJOt;m76~ z-{zWcHYYUo`jtUU5dh(w3K1xP%6J#RuUk_@g#XKp#b9Y1x8L5U`TIFHC$G~5OWQ1X zp0Ln>7ytcQ;kO$tqaUCB6!3Q*F+OESGLs4buJ95b!+_`&tBZ>fZOniO(2VY)( zlSdDa5F-de(SkMR^ujT9KAWEp=B%}>*Bidr-eT|-v1InIy@mA-QN>sb)-ZJaIJ7f3 zu^fJXZ>-R^Eg#%^kK7F-l5;4^YSn;%H=aQX&NvX|=-{U_kkc1LSk+66F(^VV8O;R| sA!{LpF literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk3_side2_off.png b/mods/technic-master/technic/textures/technic_constructor_mk3_side2_off.png new file mode 100644 index 0000000000000000000000000000000000000000..75a503180e00e214f70129fa9e58f716958f55a7 GIT binary patch literal 715 zcmV;+0yO=JP)AIGxUlV5C9Dx&zHJISZ zUF7)a1KliQoiJ`D>>uo%FL?IkImQ@_F{mo4iiiN9ML}S4Hs$N-CrFvAo7>b?g=5~s z&HbCyKF}Ww=-QUpB}Bkift)g8geQMJWpitj!^6K3ple&)lKjK_j~J}=K?DIrWPwB| zrQp0Hc*nbw_j6PLVlYbzYa2aA!-nywp&5<&|8z*`_h?2#oN19V;nT;@T;9IAm=NHC zh-b}|X82`UvVQp*qthY1UXSCWV^HP#&Mt2cUqVa(lw8gc0O0I*r4d18d2nHM%B%mX zuFetk2Q{g?gfRjLB^NGT`H}ZWCtTUuB}isG9<#f5i#N|+uoPmoAkH#tKMdx+i$Q@& z)3Cm=foj3pijWh{mm$m8<&w{B{N?w%SYvTMU}Ua*6#`-{UF?W$$MdHzaMtnp!wI0I zm@e4(;4$kP>nni;$fYdM=qgPAzB&Ze#oY@o9Q<*Qq#05{0T(>vLdh8wA;-i&um9uP z)(*}Yn$a27TI9x0J35PC+?>swgFR3om4s76ED;of52z|BB~Y-z(N3qhHm-6--LHwW xju<~3RVo$I63upRUd z5huP7YHdVRI!SAT4~X}kCGDL4QuW7`@V0>`qLYlRq@`Vz`5-gP$0#G zF@p6DCzg~GF=nh0M1-6(s*0&R7!j1dyboXu^=N>#o}x;2f^`m2MXVtVDyl(EQN@7*rKiMMMD5 zq98CoTCjKhBXEw*cR!=9DjaSO#J@aU7ovq4d)EaVu`hO zWukGtnhQJUL4{NjP7Sd{PzXMts-%=a!3IaWSm4^&qX5*ynz-zUvBMfm5-6o$#juET j#2Ruc2uj;7vEK1N>d+zvmExNn00000NkvXXu0mjf@Ul*L literal 0 HcmV?d00001 diff --git a/mods/technic-master/technic/textures/technic_constructor_mk3_top_off.png b/mods/technic-master/technic/textures/technic_constructor_mk3_top_off.png new file mode 100644 index 0000000000000000000000000000000000000000..c71675289896a1bcbfb92860183d4fa9b44b49d2 GIT binary patch literal 687 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