From d7708b15287d5a06cdc39e9c2a6738c43a800997 Mon Sep 17 00:00:00 2001 From: OscarDSanchezJ <15836576+OscarDSanchezJ@users.noreply.github.com> Date: Sun, 23 Feb 2025 20:58:00 -0400 Subject: [PATCH 1/2] Update texture contribution change texture of Simple Generator, Matter extractor, and High Furnace i'm new testing and for in contribute in github --- mods/sbz_chem/elements.lua | 2 +- mods/sbz_chem/textures/hpef_front.png | Bin 304 -> 681 bytes mods/sbz_chem/textures/hpef_front_off.png | Bin 182 -> 346 bytes mods/sbz_chem/textures/hpef_top.png | Bin 107 -> 220 bytes mods/sbz_power/batteries.lua | 1 + mods/sbz_power/emittrium_reactor.lua | 2 +- mods/sbz_power/extractor.lua | 4 +- mods/sbz_power/generator.lua | 12 +- mods/sbz_power/sbz_chem/alloy_furnace.lua | 107 +++++ mods/sbz_power/sbz_chem/centrifuge.lua | 231 ++++++++++ mods/sbz_power/sbz_chem/compressor.lua | 120 ++++++ mods/sbz_power/sbz_chem/crusher.lua | 154 +++++++ mods/sbz_power/sbz_chem/crystal_grower.lua | 148 +++++++ mods/sbz_power/sbz_chem/decay_accel.lua | 94 ++++ mods/sbz_power/sbz_chem/decay_chains.lua | 21 + mods/sbz_power/sbz_chem/elements.lua | 303 +++++++++++++ mods/sbz_power/sbz_chem/fluids.lua | 92 ++++ mods/sbz_power/sbz_chem/hpef.lua | 112 +++++ mods/sbz_power/sbz_chem/init.lua | 15 + mods/sbz_power/sbz_chem/mod.conf | 2 + mods/sbz_power/sbz_chem/pebble_enhancer.lua | 67 +++ mods/sbz_power/sbz_chem/radiation.lua | 400 ++++++++++++++++++ mods/sbz_power/sbz_chem/reactor.lua | 269 ++++++++++++ .../sounds/050597_ice-crusher-38522.ogg | Bin 0 -> 14978 bytes .../sounds/simple_alloy_furnace_running.ogg | Bin 0 -> 19545 bytes mods/sbz_power/sbz_chem/textures/block.png | Bin 0 -> 237 bytes .../sbz_chem/textures/centrifuge.ase | Bin 0 -> 2773 bytes .../sbz_chem/textures/centrifuge.png | Bin 0 -> 637 bytes .../sbz_chem/textures/centrifuge_side.png | Bin 0 -> 133 bytes .../sbz_chem/textures/compressor.ase | Bin 0 -> 1599 bytes .../sbz_chem/textures/compressor.png | Bin 0 -> 393 bytes .../sbz_chem/textures/compressor_side.png | Bin 0 -> 106 bytes .../sbz_chem/textures/crusher_side.png | Bin 0 -> 180 bytes .../sbz_chem/textures/crusher_top.png | Bin 0 -> 795 bytes .../sbz_chem/textures/decay_accel.png | Bin 0 -> 132 bytes .../sbz_chem/textures/decay_accel_front.png | Bin 0 -> 171 bytes .../textures/decay_accel_front_on.ase | Bin 0 -> 2373 bytes .../textures/decay_accel_front_on.png | Bin 0 -> 846 bytes .../sbz_chem/textures/flowing_chemical.ase | Bin 0 -> 10839 bytes .../sbz_chem/textures/flowing_chemical.png | Bin 0 -> 974 bytes .../textures/flowing_chemical_source.png | Bin 0 -> 712 bytes .../sbz_chem/textures/fluid_cell.png | Bin 0 -> 173 bytes mods/sbz_power/sbz_chem/textures/fuel_rod.png | Bin 0 -> 152 bytes .../sbz_chem/textures/hpef_front.aseprite | Bin 0 -> 1188 bytes .../sbz_chem/textures/hpef_front.png | Bin 0 -> 681 bytes .../sbz_chem/textures/hpef_front_off.png | Bin 0 -> 346 bytes mods/sbz_power/sbz_chem/textures/hpef_top.png | Bin 0 -> 220 bytes mods/sbz_power/sbz_chem/textures/ingot.png | Bin 0 -> 260 bytes mods/sbz_power/sbz_chem/textures/powder.png | Bin 0 -> 186 bytes mods/sbz_power/sbz_chem/textures/radon.png | Bin 0 -> 77 bytes .../sbz_chem/textures/reactor_bottom.png | Bin 0 -> 168 bytes .../sbz_chem/textures/reactor_side.png | Bin 0 -> 106 bytes .../sbz_chem/textures/reactor_top_off.png | Bin 0 -> 166 bytes .../sbz_chem/textures/reactor_top_on.png | Bin 0 -> 166 bytes .../textures/simple_alloy_furnace.png | Bin 0 -> 862 bytes .../sbz_power/sbz_chem/textures/xray_side.png | Bin 0 -> 289 bytes mods/sbz_power/sbz_chem/textures/xray_top.png | Bin 0 -> 140 bytes mods/sbz_power/switching_station.lua | 1 + .../textures/simple_charge_generator.png | Bin 460 -> 1296 bytes .../textures/simple_charge_generator_off.png | Bin 514 -> 322 bytes .../textures/simple_matter_extractor.png | Bin 348 -> 1087 bytes 61 files changed, 2148 insertions(+), 9 deletions(-) create mode 100644 mods/sbz_power/sbz_chem/alloy_furnace.lua create mode 100644 mods/sbz_power/sbz_chem/centrifuge.lua create mode 100644 mods/sbz_power/sbz_chem/compressor.lua create mode 100644 mods/sbz_power/sbz_chem/crusher.lua create mode 100644 mods/sbz_power/sbz_chem/crystal_grower.lua create mode 100644 mods/sbz_power/sbz_chem/decay_accel.lua create mode 100644 mods/sbz_power/sbz_chem/decay_chains.lua create mode 100644 mods/sbz_power/sbz_chem/elements.lua create mode 100644 mods/sbz_power/sbz_chem/fluids.lua create mode 100644 mods/sbz_power/sbz_chem/hpef.lua create mode 100644 mods/sbz_power/sbz_chem/init.lua create mode 100644 mods/sbz_power/sbz_chem/mod.conf create mode 100644 mods/sbz_power/sbz_chem/pebble_enhancer.lua create mode 100644 mods/sbz_power/sbz_chem/radiation.lua create mode 100644 mods/sbz_power/sbz_chem/reactor.lua create mode 100644 mods/sbz_power/sbz_chem/sounds/050597_ice-crusher-38522.ogg create mode 100644 mods/sbz_power/sbz_chem/sounds/simple_alloy_furnace_running.ogg create mode 100644 mods/sbz_power/sbz_chem/textures/block.png create mode 100644 mods/sbz_power/sbz_chem/textures/centrifuge.ase create mode 100644 mods/sbz_power/sbz_chem/textures/centrifuge.png create mode 100644 mods/sbz_power/sbz_chem/textures/centrifuge_side.png create mode 100644 mods/sbz_power/sbz_chem/textures/compressor.ase create mode 100644 mods/sbz_power/sbz_chem/textures/compressor.png create mode 100644 mods/sbz_power/sbz_chem/textures/compressor_side.png create mode 100644 mods/sbz_power/sbz_chem/textures/crusher_side.png create mode 100644 mods/sbz_power/sbz_chem/textures/crusher_top.png create mode 100644 mods/sbz_power/sbz_chem/textures/decay_accel.png create mode 100644 mods/sbz_power/sbz_chem/textures/decay_accel_front.png create mode 100644 mods/sbz_power/sbz_chem/textures/decay_accel_front_on.ase create mode 100644 mods/sbz_power/sbz_chem/textures/decay_accel_front_on.png create mode 100644 mods/sbz_power/sbz_chem/textures/flowing_chemical.ase create mode 100644 mods/sbz_power/sbz_chem/textures/flowing_chemical.png create mode 100644 mods/sbz_power/sbz_chem/textures/flowing_chemical_source.png create mode 100644 mods/sbz_power/sbz_chem/textures/fluid_cell.png create mode 100644 mods/sbz_power/sbz_chem/textures/fuel_rod.png create mode 100644 mods/sbz_power/sbz_chem/textures/hpef_front.aseprite create mode 100644 mods/sbz_power/sbz_chem/textures/hpef_front.png create mode 100644 mods/sbz_power/sbz_chem/textures/hpef_front_off.png create mode 100644 mods/sbz_power/sbz_chem/textures/hpef_top.png create mode 100644 mods/sbz_power/sbz_chem/textures/ingot.png create mode 100644 mods/sbz_power/sbz_chem/textures/powder.png create mode 100644 mods/sbz_power/sbz_chem/textures/radon.png create mode 100644 mods/sbz_power/sbz_chem/textures/reactor_bottom.png create mode 100644 mods/sbz_power/sbz_chem/textures/reactor_side.png create mode 100644 mods/sbz_power/sbz_chem/textures/reactor_top_off.png create mode 100644 mods/sbz_power/sbz_chem/textures/reactor_top_on.png create mode 100644 mods/sbz_power/sbz_chem/textures/simple_alloy_furnace.png create mode 100644 mods/sbz_power/sbz_chem/textures/xray_side.png create mode 100644 mods/sbz_power/sbz_chem/textures/xray_top.png diff --git a/mods/sbz_chem/elements.lua b/mods/sbz_chem/elements.lua index 493275d8..895e0641 100644 --- a/mods/sbz_chem/elements.lua +++ b/mods/sbz_chem/elements.lua @@ -260,7 +260,7 @@ sbz_api.register_element("silicon", "#5ba082", "Silicon %s (Si)", { part_of_crusher_drops = false, part_of_enhanced_drops = true, fluid = 1 }) -- alloys -sbz_api.register_element("bronze", "#87461d", "Bronze %s (CuSn)", { part_of_crusher_drops = false }) +sbz_api.register_element("bronze", "#CD7F32", "Bronze %s (CuSn)", { part_of_crusher_drops = false }) sbz_api.register_element("invar", "#808080", "Invar %s (FeNi)", { part_of_crusher_drops = false }) sbz_api.register_element("titanium_alloy", "#B0C4DE", "Titanium Alloy %s (TiAl)", { part_of_crusher_drops = false }) diff --git a/mods/sbz_chem/textures/hpef_front.png b/mods/sbz_chem/textures/hpef_front.png index 68ff9aabf485d3f9909f28b3bbd8cd7c20fddfb2..ea3470be7b88a4a891d1f33ae4f4d08ed2a154fd 100644 GIT binary patch delta 657 zcmV;C0&e}V0;vU%B!2;OQb$4nuFf3k0007GNklQLUd&wD?Tn7SzUg^=UT^L+2QOP)`jdlw$9K0W0Ex(sl9D}O^eo8#nYI5i=i%>i(7 zG-T=1PZon8s(@+9Mg?lI_u(@DAHTc>z|LROf!_u{sFZ5}EU&GG4V3z$4x8KI+foJI z++Uzlu8Au5&n_XI&GGu>L;9l*)vY0p<#XlhE92!@KAYR8^hX_DJh`il7ghO{a!n@> z+I0Y0yG>fVO@9Ce?K+O-Q{5WsOVI{WgLYjfNws#H+E|@b8>F*2`lAkx<+HJJ2*Ae5 zA+B4%bqjh8z_EP#qfUGUrTiGzEl|pjLu=AV-AKd0vr_;xie0^?jvK`;rTkdOgeq9` zmP6Mqjih93=yw2+xpUii4<1Vy20M?}*@+C3T8}okdVk~I)YRAtF1_EMD;Xlb#t>4Nft2C_oV9bK*wyVE%LC6&=|sf? z*^!bFkvx!R3ns^DA`jw}@W52UgJeF?268@_rm6FR954W5E{K{BjBmlSQ7XQvV#1oRuv_(|((f_HoX015yANkvXXu0mjfU^g{@ delta 277 zcmV+w0qXv#1+W5;B!BlwL_t(oh3%NZ4Z<)CMcs-)N)MT!i!cLXfK0*wsH3n5m+Zg- za6pklVmo#cArAhRs!IQhQzgGvr{LWSI&=U4I9?x3=HT52km`Kn3)(N!*Zr(9W6#Xg zK%6a~F@JV0MicY8Y_KjH3Sj}!9K}HjKyI!<$R$MGPfvCn1%E_SeiZ{S69p+Y5`b=J zs&`_p>Pr+?z-^W)Ab8hY!I&jj9?+%!R~`iK^m#DkIClk#M3x7Z2LP4_C}4PhP?Na9 zP<`H|y#WcZJkZJV!192sKywsx$Tzh;gQ^wPm2W8xr z_?~Mkak5$f5Jw?#6atW}7Wh_1FiEx6v>^&nM0vzfsEnnkGLW8pE2|obh9akw;J=Wf zCmU2IxbZrTf;b|lat{XgL+vcS*BXp&>(^Ky+gdWX8_gTVwFxdh*C&Yq{s3c&S2;^1 RlWG6}002ovPDHLkV1l_|k8}V4 delta 154 zcmcb`w2g6sN`0-Ti(`mIZ}Oh_72oDJG95T{;J|?eH|o1}&VJ{Hn`lGxihy6am<54IjQ3uf%S_}cv*?kE17R< td|VCZF{sqCjcQW4o}c#fR$~AXfD;p_P>X+LHe>(*002ovPDHLkV1kWDRT2OI delta 77 zcmcb^m_0$o-N@6$F+^ix@}Bq=#~ip45)%>%;?BD-d9}B3{tOSJd5w*UA%|D6Wo3e7 fZb<*=tl(vEe$6&Zu>GkC0}yz+`njxgN@xNA supply then + meta:set_string("infotext", "Not enough power") + return power_needed, false + else + meta:set_string("infotext", "Smelting...") + minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6 }, { pos = pos }) + + if inv:room_for_item("output", selected_item) then + inv:add_item("output", selected_item) + inv:remove_item("input", input_1) + inv:remove_item("input", input_2) + else + meta:set_string("infotext", "Output inventory full") + return 0 + end + + return power_needed + end + end, + input_inv = "input", + output_inv = "output" +}, { + tiles = { + { name = "simple_alloy_furnace.png", animation = { type = "vertical_frames", length = 0.7 } } + }, + light_source = 3, +}) + +minetest.register_craft({ + output = "sbz_chem:simple_alloy_furnace", + recipe = { + { "sbz_power:simple_charged_field", "sbz_resources:antimatter_dust", "sbz_power:simple_charged_field" }, + { "sbz_resources:matter_blob", "sbz_resources:emittrium_circuit", "sbz_resources:matter_blob" }, + { "sbz_power:simple_charged_field", "sbz_resources:matter_blob", "sbz_power:simple_charged_field" } + } +}) diff --git a/mods/sbz_power/sbz_chem/centrifuge.lua b/mods/sbz_power/sbz_chem/centrifuge.lua new file mode 100644 index 00000000..167d8679 --- /dev/null +++ b/mods/sbz_power/sbz_chem/centrifuge.lua @@ -0,0 +1,231 @@ +unified_inventory.register_craft_type("centrifugeing", { + description = "Seperating", + icon = "centrifuge.png^[verticalframe:12:1", + width = 1, + height = 1, + uses_crafting_grid = false, +}) + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if listname == "dst" then + return 0 + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if to_list == "dst" then return 0 end + return count +end + +-- sand recipes +-- sand => 50% Silicon 2, 10% Gold, 100% white sand +unified_inventory.register_craft { + output = "sbz_chem:silicon_powder 2", + type = "centrifugeing", + chance = 50, -- 50% + items = { + "sbz_resources:sand" + } +} +unified_inventory.register_craft { + output = "sbz_chem:gold_powder", + type = "centrifugeing", + chance = 10, -- 10% + items = { + "sbz_resources:sand" + } +} +unified_inventory.register_craft { + output = "sbz_resources:white_sand", + type = "centrifugeing", + items = { + "sbz_resources:sand" + } +} + +-- white sand => 100% dark sand, 5% silver + +unified_inventory.register_craft { + output = "sbz_resources:dark_sand", + type = "centrifugeing", + items = { + "sbz_resources:white_sand" + } +} + +unified_inventory.register_craft { + output = "sbz_chem:silver_powder", + chance = 5, + type = "centrifugeing", + items = { + "sbz_resources:white_sand" + } +} + +-- dark sand => 100% black sand, 1% silver + +unified_inventory.register_craft { + output = "sbz_resources:black_sand", + type = "centrifugeing", + items = { + "sbz_resources:dark_sand" + } +} + +unified_inventory.register_craft { + output = "sbz_chem:silver_powder", + chance = 1, + type = "centrifugeing", + items = { + "sbz_resources:dark_sand" + } +} + +-- gravel => 10% cobalt, 10% titanium, 10% lithium, 100% 1 pebble, 75% pebble, 50% pebble, 25% pebble, 5% pebble, 1% pebble +unified_inventory.register_craft { + output = "sbz_chem:cobalt_powder", + chance = 10, + type = "centrifugeing", + items = { + "sbz_resources:gravel" + } +} +unified_inventory.register_craft { + output = "sbz_chem:lithium_powder", + chance = 10, + type = "centrifugeing", + items = { + "sbz_resources:gravel" + } +} +unified_inventory.register_craft { + output = "sbz_chem:titanium_powder", + chance = 10, + type = "centrifugeing", + items = { + "sbz_resources:gravel" + } +} + +for k, v in ipairs { + 100, 75, 50, 25, 1 +} do + unified_inventory.register_craft { + output = "sbz_resources:pebble", + chance = v, + type = "centrifugeing", + items = { + "sbz_resources:gravel" + } + } +end + +sbz_api.register_stateful_machine("sbz_chem:centrifuge", { + description = "Centrifuge", + tiles = { + "centrifuge.png^[verticalframe:12:1", + "centrifuge_side.png", + "centrifuge_side.png", + "centrifuge_side.png", + "centrifuge_side.png", + "centrifuge_side.png", + }, + groups = { matter = 1 }, + -- paramtype2 = "4dir", + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_put = allow_metadata_inventory_put, + + input_inv = "src", + output_inv = "dst", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("dst", 16) + + meta:set_string("formspec", [[ +formspec_version[7] +size[8.2,9] +style_type[list;spacing=.2;size=.8] +list[context;dst;3.5,0.5;4,4;] +list[context;src;1,2;1,1;] +list[current_player;main;0.2,5;8,4;] +listring[current_player;main]listring[context;src]listring[current_player;main]listring[context;dst]listring[current_player;main] + ]]) + end, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig, + autostate = true, + action = function(pos, _, meta, supply, demand) + local power_needed = 16 + local inv = meta:get_inventory() + + if demand + power_needed > supply then + meta:set_string("infotext", "Not enough power") + return power_needed, false + else + meta:set_string("infotext", "Working...") + + local src = inv:get_list("src") + + local decremented_input = ItemStack(src[1]) + local recipe_outputs = unified_inventory.get_usage_list(src[1]:get_name()) + local outputs = {} + + for _, v in pairs(recipe_outputs or {}) do + if v.type == "centrifugeing" then + if not v.chance or math.random() <= v.chance / 100 then + outputs[#outputs + 1] = ItemStack(v.output) + end + end + end + + if #outputs == 0 then + meta:set_string("infotext", "Invalid/no recipe") + return 0 + end + + + for k, v in ipairs(outputs) do + if not inv:room_for_item("dst", v) then + meta:set_string("infotext", "Full") + -- undo + for kk, vv in ipairs(outputs) do + if kk >= k then break end + inv:remove_item("dst", vv) + end + return 0 + else + inv:add_item("dst", v) + end + end + + decremented_input:take_item(1) + + + inv:set_stack("src", 1, decremented_input) + minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6, pos = pos }) + return power_needed + end + end, +}, { + tiles = { + { name = "centrifuge.png", animation = { type = "vertical_frames", length = 0.6 } }, + "centrifuge_side.png", + "centrifuge_side.png", + "centrifuge_side.png", + "centrifuge_side.png", + "centrifuge_side.png", + }, + light_source = 14, +}) + +core.register_craft { + output = "sbz_chem:centrifuge_off", + recipe = { + { "sbz_chem:iron_ingot", "sbz_chem:iron_ingot", "sbz_chem:iron_ingot" }, + { "sbz_power:simple_charged_field", "sbz_resources:emittrium_circuit", "sbz_power:simple_charged_field" }, + { "sbz_chem:copper_ingot", "sbz_chem:bronze_ingot", "sbz_chem:copper_ingot" } + } +} diff --git a/mods/sbz_power/sbz_chem/compressor.lua b/mods/sbz_power/sbz_chem/compressor.lua new file mode 100644 index 00000000..7d964392 --- /dev/null +++ b/mods/sbz_power/sbz_chem/compressor.lua @@ -0,0 +1,120 @@ +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if listname == "dst" then + return 0 + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if to_list == "dst" then return 0 end + return count +end + + +sbz_api.register_stateful_machine("sbz_chem:compressor", { + description = "Compressor", + tiles = { + "compressor_side.png", + "compressor_side.png", + "compressor_side.png", + "compressor_side.png", + "compressor_side.png", + "compressor.png^[verticalframe:11:1", + }, + groups = { matter = 1 }, + paramtype2 = "4dir", + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_put = allow_metadata_inventory_put, + + input_inv = "src", + output_inv = "dst", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 4) + inv:set_size("dst", 4) + + meta:set_string("formspec", [[ +formspec_version[7] +size[8.2,9] +style_type[list;spacing=.2;size=.8] +list[current_player;main;0.2,5;8,4;] +list[context;src;1.5,1;2,2;] +listring[] +list[context;dst;4.5,1;2,2;] +listring[current_player;main] +listring[context;dst] + ]]) + end, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig, + autostate = true, + action = function(pos, _, meta, supply, demand) + local power_needed = 20 + local inv = meta:get_inventory() + + if demand + power_needed > supply then + meta:set_string("infotext", "Not enough power") + return power_needed, false + else + meta:set_string("infotext", "Compressing...") + + local src = inv:get_list("src") + + local out, decremented_input, index + for i = 1, 4 do + local recipe_outputs = unified_inventory.get_usage_list(src[i]:get_name()) + local out_inner = ItemStack("") + local input = ItemStack("") + + for _, v in pairs(recipe_outputs or {}) do + if v.type == "compressing" then + out_inner = ItemStack(v.output) + input = ItemStack(v.items[1]) + break + end + end + if not out_inner:is_empty() and (src[i]:get_count() >= input:get_count()) then + out, decremented_input = out_inner, ItemStack(src[i]) + decremented_input:take_item(input:get_count()) + index = i + break + end + end + if out == nil then + meta:set_string("infotext", "Invalid/no recipe") + return 0 + end + + if not inv:room_for_item("dst", out) then + meta:set_string("infotext", "Full") + return 0 + end + + inv:set_stack("src", index, decremented_input) + inv:add_item("dst", out) + minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6, pos = pos }) + return power_needed + end + end, +}, { + tiles = { + "compressor_side.png", + "compressor_side.png", + "compressor_side.png", + "compressor_side.png", + "compressor_side.png", + { name = "compressor.png", animation = { type = "vertical_frames", length = 0.7 } }, + }, + light_source = 10, +}) + + +minetest.register_craft({ + output = "sbz_chem:compressor", + recipe = { + { "sbz_power:simple_charged_field", "sbz_resources:emittrium_circuit", "sbz_power:simple_charged_field" }, + { "sbz_resources:matter_blob", "sbz_resources:matter_plate", "sbz_resources:matter_blob" }, + { "sbz_power:simple_charged_field", "sbz_resources:emittrium_circuit", "sbz_power:simple_charged_field" } + } +}) diff --git a/mods/sbz_power/sbz_chem/crusher.lua b/mods/sbz_power/sbz_chem/crusher.lua new file mode 100644 index 00000000..8607b947 --- /dev/null +++ b/mods/sbz_power/sbz_chem/crusher.lua @@ -0,0 +1,154 @@ +for k, v in pairs(sbz_api.crusher_drops) do + unified_inventory.register_craft { + output = v, + type = "crushing", + items = { + "sbz_resources:pebble" + } + } +end + +core.register_craftitem("sbz_chem:enhanced_pebble", { + description = "Enhanced Pebble", + inventory_image = "enhanced_pebble.png", +}) + +for k, v in pairs(sbz_api.crusher_drops_enhanced) do + unified_inventory.register_craft { + output = v, + type = "crushing", + items = { + "sbz_chem:enhanced_pebble" + } + } +end + +-- stone -> 2 gravel +-- gravel -> 2 sand +-- centrifuging sand: 90% chance of 4 Silicon, 10% chance of 1 gold +unified_inventory.register_craft { + output = "sbz_resources:gravel 2", + type = "crushing", + items = { + "sbz_resources:stone" + } +} + +unified_inventory.register_craft { + output = "sbz_resources:sand 2", + type = "crushing", + items = { + "sbz_resources:gravel" + } +} + +sbz_api.register_stateful_machine("sbz_chem:crusher", { + description = "Crusher", + tiles = { + "crusher_top.png^[verticalframe:4:1", + "crusher_side.png" + }, + groups = { matter = 1 }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("output", 16) + + meta:set_string("formspec", [[ +formspec_version[7] +size[8.2,9] +style_type[list;spacing=.2;size=.8] +list[context;output;3.5,0.5;4,4;] +list[context;input;1,2;1,1;] +list[current_player;main;0.2,5;8,4;] +listring[current_player;main]listring[context;input]listring[current_player;main]listring[context;output]listring[current_player;main] +]]) + end, + info_power_consume = 5, + autostate = true, + action = function(pos, node, meta, supply, demand) + local power_needed = 5 + local inv = meta:get_inventory() + + local itemname = inv:get_stack("input", 1):get_name() + + local recipe_outputs = unified_inventory.get_usage_list(itemname) + + + local possible_outputs = {} + + for k, v in pairs(recipe_outputs or {}) do + if v.type == "crushing" then + possible_outputs[#possible_outputs + 1] = v.output + end + end + + if #possible_outputs == 0 then + meta:set_string("infotext", "Inactive") + return 0 + end + + if demand + power_needed > supply then + meta:set_string("infotext", "Not enough power") + return power_needed, false + end + + meta:set_string("infotext", "Crushing...") + inv:remove_item("input", itemname) + minetest.sound_play({ name = "050597_ice-crusher-38522", gain = 0.4 }, { pos = pos }) + + local selected_item = possible_outputs[math.random(1, #possible_outputs)] + + + if inv:room_for_item("output", selected_item) then + inv:add_item("output", selected_item) + else + meta:set_string("infotext", "Output inventory full") + return 0 + end + if itemname == "sbz_resources:pebble" then + if inv:contains_item("output", "sbz_chem:empty_fluid_cell") then + inv:remove_item("output", "sbz_chem:empty_fluid_cell") + if inv:room_for_item("output", "sbz_chem:water_fluid_cell") then + inv:add_item("output", "sbz_chem:water_fluid_cell") + else + minetest.add_item(pos, "sbz_chem:water_fluid_cell") + end + end + end + + return power_needed + end, + input_inv = "input", + output_inv = "output", + --[[ + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if listname == "output" then + if stack:get_name() == "sbz_chem:empty_fluid_cell" then + return stack:get_count() + else + return 0 + end + end + return stack:get_count() + end + --]] +}, { + tiles = { + { name = "crusher_top.png", animation = { type = "vertical_frames", length = 0.5 } }, + "crusher_side.png" + }, + light_source = 3, +}) + + +minetest.register_craft({ + output = "sbz_chem:crusher", + recipe = { + { "sbz_power:simple_charged_field", "sbz_resources:antimatter_dust", "sbz_power:simple_charged_field" }, + { "sbz_resources:matter_blob", "sbz_resources:stone", "sbz_resources:matter_blob" }, + { "sbz_power:simple_charged_field", "sbz_resources:matter_blob", "sbz_power:simple_charged_field" } + } +}) diff --git a/mods/sbz_power/sbz_chem/crystal_grower.lua b/mods/sbz_power/sbz_chem/crystal_grower.lua new file mode 100644 index 00000000..bd2e3fe2 --- /dev/null +++ b/mods/sbz_power/sbz_chem/crystal_grower.lua @@ -0,0 +1,148 @@ +unified_inventory.register_craft { + type = "crystal_growing", + output = "sbz_resources:warp_crystal", + items = { "sbz_bio:warpshroom 9" } +} + +core.register_craftitem("sbz_chem:uranium_crystal", { + description = "Uranium Crystal", + inventory_image = "uranium_crystal.png", +}) + +unified_inventory.register_craft { + type = "crystal_growing", + output = "sbz_chem:uranium_crystal", + items = { "sbz_chem:uranium_ingot 4" } +} + +core.register_craftitem("sbz_chem:thorium_crystal", { + description = "Thorium Crystal", + inventory_image = "thorium_crystal.png", +}) +unified_inventory.register_craft { + type = "crystal_growing", + output = "sbz_chem:thorium_crystal", + items = { "sbz_chem:thorium_ingot 4" } +} + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if listname == "dst" then + return 0 + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if to_list == "dst" then return 0 end + return count +end + + +sbz_api.register_stateful_machine("sbz_chem:crystal_grower", { + description = "Crystal Grower", + info_extra = "Be aware, consumes high amounts of power!", + tiles = { + "crystal_grower_side.png", + "crystal_grower_side.png", + "crystal_grower_side.png", + "crystal_grower_side.png", + "crystal_grower_side.png", + "crystal_grower.png^[verticalframe:17:1", + }, + groups = { matter = 1 }, + paramtype2 = "4dir", + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_put = allow_metadata_inventory_put, + + input_inv = "src", + output_inv = "dst", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 4) + inv:set_size("dst", 4) + + meta:set_string("formspec", [[ +formspec_version[7] +size[8.2,9] +style_type[list;spacing=.2;size=.8] +list[current_player;main;0.2,5;8,4;] +list[context;src;1.5,1;2,2;] +listring[] +list[context;dst;4.5,1;2,2;] +listring[current_player;main] +listring[context;dst] + ]]) + end, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig, + autostate = true, + action = function(pos, _, meta, supply, demand) + local power_needed = 120 + local inv = meta:get_inventory() + + if demand + power_needed > supply then + meta:set_string("infotext", "Not enough power") + return power_needed, false + else + meta:set_string("infotext", "Growing...") + + local src = inv:get_list("src") + + local out, decremented_input, index + for i = 1, 4 do + local recipe_outputs = unified_inventory.get_usage_list(src[i]:get_name()) + local out_inner = ItemStack("") + local input = ItemStack("") + + for _, v in pairs(recipe_outputs or {}) do + if v.type == "crystal_growing" then + out_inner = ItemStack(v.output) + input = ItemStack(v.items[1]) + break + end + end + if not out_inner:is_empty() and (src[i]:get_count() >= input:get_count()) then + out, decremented_input = out_inner, ItemStack(src[i]) + decremented_input:take_item(input:get_count()) + index = i + break + end + end + if out == nil then + meta:set_string("infotext", "Invalid/no recipe") + return 0 + end + + if not inv:room_for_item("dst", out) then + meta:set_string("infotext", "Full") + return 0 + end + + inv:set_stack("src", index, decremented_input) + inv:add_item("dst", out) + minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6, pos = pos }) + return power_needed + end + end, +}, { + tiles = { + "crystal_grower_side.png", + "crystal_grower_side.png", + "crystal_grower_side.png", + "crystal_grower_side.png", + "crystal_grower_side.png", + { name = "crystal_grower.png", animation = { type = "vertical_frames", length = 2 } }, + }, + light_source = 14, +}) + + +minetest.register_craft({ + output = "sbz_chem:crystal_grower", + recipe = { + { "sbz_resources:stone", "sbz_meteorites:antineutronium", "sbz_resources:stone" }, + { "sbz_resources:reinforced_matter", "sbz_meteorites:neutronium", "sbz_resources:reinforced_matter" }, + { "sbz_resources:stone", "sbz_chem:titanium_block", "sbz_resources:stone" }, + } +}) diff --git a/mods/sbz_power/sbz_chem/decay_accel.lua b/mods/sbz_power/sbz_chem/decay_accel.lua new file mode 100644 index 00000000..3026f675 --- /dev/null +++ b/mods/sbz_power/sbz_chem/decay_accel.lua @@ -0,0 +1,94 @@ +sbz_api.register_stateful_machine("sbz_chem:decay_accel", { + description = "Decay Accelerator", + tiles = { + "decay_accel.png", + "decay_accel.png", + "decay_accel.png", + "decay_accel.png", + "decay_accel.png", + "decay_accel_front.png", + }, + groups = { matter = 1 }, + info_extra = "It doesn't just accelerate decay, it may throw in some neutrons.", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("output", 16) + + meta:set_string("formspec", [[ +formspec_version[7] +size[8.2,9] +style_type[list;spacing=.2;size=.8] +list[context;output;3.5,0.5;4,4;] +list[context;input;1,2;1,1;] +list[current_player;main;0.2,5;8,4;] +listring[current_player;main]listring[context;input]listring[current_player;main]listring[context;output]listring[current_player;main] +]]) + end, + info_power_consume = 64, + autostate = true, + action = function(pos, node, meta, supply, demand) + local power_needed = 64 + local inv = meta:get_inventory() + + local itemname = inv:get_stack("input", 1):get_name() + + local recipe_outputs = unified_inventory.get_usage_list(itemname) + + + local possible_outputs = {} + + for k, v in pairs(recipe_outputs or {}) do + if v.type == "decay_accelerating" then + possible_outputs[#possible_outputs + 1] = v.output + end + end + + if #possible_outputs == 0 then + meta:set_string("infotext", "Inactive") + return 0 + end + + if demand + power_needed > supply then + meta:set_string("infotext", "Not enough power") + return power_needed, false + end + + meta:set_string("infotext", "Active") + + local selected_item = possible_outputs[math.random(1, #possible_outputs)] + + + if inv:room_for_item("output", selected_item) then + inv:remove_item("input", itemname) + inv:add_item("output", selected_item) + return power_needed + else + meta:set_string("infotext", "Output inventory full") + return 0 + end + end, + input_inv = "input", + output_inv = "output", +}, { + tiles = { + "decay_accel.png", + "decay_accel.png", + "decay_accel.png", + "decay_accel.png", + "decay_accel.png", + { name = "decay_accel_front_on.png", animation = { type = "vertical_frames", length = 1 } }, + }, + light_source = 14, +}) + + +minetest.register_craft({ + output = "sbz_chem:decay_accel_off", + recipe = { + { "sbz_chem:uranium_crystal", "sbz_resources:matter_blob", "sbz_chem:thorium_crystal" }, + { "sbz_resources:reinforced_matter", "", "sbz_resources:reinforced_matter" }, + { "sbz_resources:phlogiston_circuit", "sbz_meteorites:neutronium", "sbz_resources:phlogiston_circuit" } + } +}) diff --git a/mods/sbz_power/sbz_chem/decay_chains.lua b/mods/sbz_power/sbz_chem/decay_chains.lua new file mode 100644 index 00000000..1db7a571 --- /dev/null +++ b/mods/sbz_power/sbz_chem/decay_chains.lua @@ -0,0 +1,21 @@ +--[[ +Recipes for the decay accelerator +Currently, just used to make plutonium +If you want to add more, feel free to do so :D +]] + +unified_inventory.register_craft_type("decay_accelerating", { + description = "Decay Accelerating", + icon = "decay_accel_front.png", + width = 1, + height = 1, + uses_crafting_grid = false, +}) + +unified_inventory.register_craft { + output = "sbz_chem:plutonium_powder", + type = "decay_accelerating", + items = { + "sbz_chem:uranium_powder" + } +} diff --git a/mods/sbz_power/sbz_chem/elements.lua b/mods/sbz_power/sbz_chem/elements.lua new file mode 100644 index 00000000..895e0641 --- /dev/null +++ b/mods/sbz_power/sbz_chem/elements.lua @@ -0,0 +1,303 @@ +unified_inventory.register_craft_type("crushing", { + description = "Crushing", + icon = "crusher_top.png^[verticalframe:4:1", + width = 1, + height = 1, + uses_crafting_grid = false, +}) + +unified_inventory.register_craft_type("alloying", { + description = "Alloying", + icon = "simple_alloy_furnace.png^[verticalframe:13:1", + width = 2, + height = 1, + uses_crafting_grid = false, +}) + +unified_inventory.register_craft_type("compressing", { + description = "Compressing", + icon = "compressor.png^[verticalframe:11:1", + width = 1, + height = 1, + uses_crafting_grid = false, +}) + +unified_inventory.register_craft_type("crystal_growing", { + description = "(Crystal) Growing", + icon = "crystal_grower.png^[verticalframe:17:1", + width = 1, + height = 1, + uses_crafting_grid = false, +}) + +sbz_api.crusher_drops = {} +sbz_api.crusher_drops_enhanced = {} +sbz_api.unused_chem = {} + +sbz_api.register_element = function(name, color, description, def) + def = def or {} + local disabled, part_of_crusher_drops, radioactive = def.disabled, def.part_of_crusher_drops, def.radioactive + if disabled == nil then disabled = false end + local disabled_group = disabled and 1 or nil + core.register_craftitem("sbz_chem:" .. name .. "_powder", { + groups = { chem_element = 1, powder = 1, not_in_creative_inventory = disabled_group, chem_disabled = disabled_group, radioactive = radioactive }, + description = string.format(description, "Powder"), + inventory_image = "powder.png^[colorize:" .. color .. ":150" + }) + core.register_craftitem("sbz_chem:" .. name .. "_ingot", { + groups = { chem_element = 1, ingot = 1, not_in_creative_inventory = disabled_group, chem_disabled = disabled_group, radioactive = radioactive }, + description = string.format(description, "Ingot"), + inventory_image = "ingot.png^[multiply:" .. color --[[.. ":150"]], + + }) + + core.register_node("sbz_chem:" .. name .. "_block", unifieddyes.def { + groups = { + chem_element = 1, + chem_block = 1, + not_in_creative_inventory = disabled_group, + chem_disabled = disabled_group, + matter = 1, + level = 2, + explody = 100, + radioactive = radioactive, + }, + description = string.format(description, "Block"), + tiles = { "block.png^[colorize:" .. color .. ":150" }, + sounds = sbz_api.sounds.metal() + }) + + + -- fluid + if def.fluid then + core.register_node(("sbz_chem:%s_fluid_source"):format(name), { + description = description:format("Fluid Source"), + drawtype = "liquid", + tiles = { + { name = ("flowing_chemical_source.png^[multiply:%s"):format(color), backface_culling = false, }, + { name = ("flowing_chemical_source.png^[multiply:%s"):format(color), backface_culling = true, } + }, + inventory_image = minetest.inventorycube(("flowing_chemical_source.png^[multiply:%s"):format(color)), + use_texture_alpha = "blend", + groups = { + liquid = 3, + habitat_conducts = 1, + transparent = 1, + liquid_capturable = 1, + water = 0, + not_in_creative_inventory = disabled_group, + chem_disabled = disabled_group, + chem_fluid = 1, + chem_fluid_source = 1, + chem_element = 1, + radioactive = (radioactive or 0) * 2, + hot = 50, + }, + post_effect_color = color .. "7F", + paramtype = "light", + walkable = false, + pointable = false, + buildable_to = true, + liquidtype = "source", + liquid_alternative_source = ("sbz_chem:%s_fluid_source"):format(name), + liquid_alternative_flowing = ("sbz_chem:%s_fluid_flowing"):format(name), + drop = "", + liquid_viscosity = 7, + liquid_renewable = false, + sbz_node_damage = { + matter = 5, -- 5hp/second + }, + light_source = 14, + liquid_range = 2, + chem_block_form = "sbz_chem:" .. name .. "_block" + }) + + local animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 8, + } + + minetest.register_node(("sbz_chem:%s_fluid_flowing"):format(name), { + description = description:format("Fluid Flowing"), + drawtype = "flowingliquid", + tiles = { { name = ("flowing_chemical_source.png^[multiply:%s"):format(color), } }, + special_tiles = { + { + name = ("flowing_chemical.png^[multiply:%s"):format(color), + backface_culling = false, + animation = animation, + }, + { + name = ("flowing_chemical.png^[multiply:%s"):format(color), + backface_culling = true, + animation = animation, + } + }, + use_texture_alpha = "blend", + groups = { + liquid = 3, + habitat_conducts = 1, + transparent = 1, + not_in_creative_inventory = 1, + water = 0, + hot = 10, + chem_disabled = disabled_group, + chem_fluid = 1, + chem_fluid_source = 0, + radioactive = radioactive + }, + post_effect_color = color .. "7F", + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + buildable_to = true, + liquidtype = "flowing", + liquid_alternative_source = ("sbz_chem:%s_fluid_source"):format(name), + liquid_alternative_flowing = ("sbz_chem:%s_fluid_flowing"):format(name), + drop = "", + liquid_viscosity = 7, + sbz_node_damage = { + matter = 3, -- 3hp/second + }, + liquid_renewable = false, + light_source = 14, + liquid_range = 2, + chem_block_form = "sbz_chem:" .. name .. "_block", + + }) + + sbz_api.register_fluid_cell(("sbz_chem:%s_fluid_cell"):format(name), { + description = description:format("Fluid Cell"), + groups = { + chem_disabled = disabled_group, + chem_fluid_cell = 1, + chem_fluid_source = 0, + not_in_creative_inventory = disabled_group, + } + }, ("sbz_chem:%s_fluid_source"):format(name), color) + end + if not disabled then + stairs.register("sbz_chem:" .. name .. "_block") + minetest.register_craft({ + type = "cooking", + output = "sbz_chem:" .. name .. "_ingot", + recipe = "sbz_chem:" .. name .. "_powder", + }) + unified_inventory.register_craft { + type = "crushing", + output = "sbz_chem:" .. name .. "_powder", + items = { "sbz_chem:" .. name .. "_ingot" } + } + + unified_inventory.register_craft { + type = "compressing", + output = "sbz_chem:" .. name .. "_block", + items = { "sbz_chem:" .. name .. "_powder 9" } + } + unified_inventory.register_craft { + type = "compressing", + output = "sbz_chem:" .. name .. "_block", + items = { "sbz_chem:" .. name .. "_ingot 9" } + } + + unified_inventory.register_craft { + type = "crushing", + output = "sbz_chem:" .. name .. "_powder 9", + items = { "sbz_chem:" .. name .. "_block" } + } + + if part_of_crusher_drops == nil or part_of_crusher_drops == true then + sbz_api.crusher_drops[#sbz_api.crusher_drops + 1] = "sbz_chem:" .. name .. "_powder" + sbz_api.crusher_drops_enhanced[#sbz_api.crusher_drops_enhanced + 1] = "sbz_chem:" .. name .. "_powder" + elseif def.part_of_enhanced_drops == true then + sbz_api.crusher_drops_enhanced[#sbz_api.crusher_drops_enhanced + 1] = "sbz_chem:" .. name .. "_powder" + end + else + sbz_api.unused_chem[#sbz_api.unused_chem + 1] = "sbz_chem:" .. name + end +end + +minetest.after(0, function() + for k, v in pairs(sbz_api.unused_chem) do + local powder = v .. "_powder" + local ingot = v .. "_ingot" + if unified_inventory.get_recipe_list(powder) then + minetest.log( + "This chemical: " .. + powder .. + " is disabled, and shouldn't have any use.. right... but it has!!! \n details: " .. + dump(unified_inventory.get_recipe_list(powder))) + end + if unified_inventory.get_recipe_list(ingot) then + minetest.log( + "This chemical: " .. + ingot .. + " is disabled, and shouldn't have any use.. right... but it has!!! \n details: " .. + dump(unified_inventory.get_recipe_list(ingot))) + end + end +end) + +sbz_api.register_element("gold", "#FFD700", "Gold %s (Au)", + { part_of_crusher_drops = false, part_of_enhanced_drops = true }) +sbz_api.register_element("silver", "#C0C0C0", "Silver %s (Ag)", + { part_of_crusher_drops = false, part_of_enhanced_drops = true }) +sbz_api.register_element("iron", "#B7410E", "Iron %s (Fe)", { fluid = 1 }) +sbz_api.register_element("copper", "#B87333", "Copper %s (Cu)") +sbz_api.register_element("aluminum", "#A9A9A9", "Aluminum %s (Al)") +sbz_api.register_element("tin", "#D2B48C", "Tin %s (Sn)") +sbz_api.register_element("nickel", "#88c6cc", "Nickel %s (Ni)", { fluid = 1 }) +sbz_api.register_element("cobalt", "#0047AB", "Cobalt %s (Co)", + { part_of_crusher_drops = false, part_of_enhanced_drops = true, fluid = 1 }) +sbz_api.register_element("titanium", "#4A2A2A", "Titanium %s (Ti)", + { part_of_crusher_drops = false, part_of_enhanced_drops = true }) +sbz_api.register_element("lithium", "#c8a4db", "Lithium %s (Li)", + { part_of_crusher_drops = false, part_of_enhanced_drops = true }) +sbz_api.register_element("silicon", "#5ba082", "Silicon %s (Si)", + { part_of_crusher_drops = false, part_of_enhanced_drops = true, fluid = 1 }) +-- alloys + +sbz_api.register_element("bronze", "#CD7F32", "Bronze %s (CuSn)", { part_of_crusher_drops = false }) +sbz_api.register_element("invar", "#808080", "Invar %s (FeNi)", { part_of_crusher_drops = false }) +sbz_api.register_element("titanium_alloy", "#B0C4DE", "Titanium Alloy %s (TiAl)", { part_of_crusher_drops = false }) + +-- RADIOACTIVE TECH + +sbz_api.register_element("thorium", "#d633af", "Thorium %s (Th)", + { part_of_crusher_drops = false, radioactive = 1, part_of_enhanced_drops = true }) +sbz_api.register_element("uranium", "#47681e", "Uranium %s (U)", + { part_of_crusher_drops = false, radioactive = 2, part_of_enhanced_drops = true }) +sbz_api.register_element("plutonium", "#1d2aba", "Plutonium %s (Pu)", { part_of_crusher_drops = false, radioactive = 5 }) + +-- disabled tech +sbz_api.register_element("lead", "#6E6E6E", "Lead %s (Pb)", { disabled = true }) +sbz_api.register_element("zinc", "#7F7F7F", "Zinc %s (Zn)", { disabled = true }) +sbz_api.register_element("platinum", "#E5E4E2", "Platinum %s (Pt)", { disabled = true }) +sbz_api.register_element("mercury", "#B5B5B5", "Mercury %s (Hg)", { disabled = true }) +sbz_api.register_element("magnesium", "#DADADA", "Magnesium %s (Mg)", { disabled = true }) +sbz_api.register_element("calcium", "#F5F5DC", "Calcium %s (Ca)", { disabled = true }) +sbz_api.register_element("sodium", "#F4F4F4", "Sodium %s (Na)", { disabled = true }) + +-- disabled alloys +sbz_api.register_element("white_gold", "#E5E4E2", "White Gold %s (AuNi)", + { disabled = true, part_of_crusher_drops = false }) +sbz_api.register_element("brass", "#B5A642", "Brass %s (CuZn)", { disabled = true, part_of_crusher_drops = false }) + +core.register_abm { + label = "Freeze liquid metals (group:cold>=1 contacting them)", + nodenames = { "group:chem_fluid" }, + neighbors = { "group:cold" }, + interval = 6, + chance = 6, + catch_up = false, + action = function(pos, node) + if core.get_item_group(node.name, "chem_fluid_source") == 0 then + core.set_node(pos, { name = "sbz_resources:stone" }) + elseif core.registered_nodes[node.name].chem_block_form then + core.set_node(pos, { name = core.registered_nodes[node.name].chem_block_form }) + end + end, +} diff --git a/mods/sbz_power/sbz_chem/fluids.lua b/mods/sbz_power/sbz_chem/fluids.lua new file mode 100644 index 00000000..7a2b942b --- /dev/null +++ b/mods/sbz_power/sbz_chem/fluids.lua @@ -0,0 +1,92 @@ +sbz_api.sources2fluid_cells = {} +sbz_api.fluid_cells2sources = {} +local empty_cell = "sbz_chem:empty_fluid_cell" + +function sbz_api.register_fluid_cell(name, def, source_name, cellcolor) + sbz_api.sources2fluid_cells[source_name] = name + sbz_api.fluid_cells2sources[name] = source_name + def.liquids_pointable = true + def.groups = def.groups or {} + def.groups.chem_element = 1 + if cellcolor then + def.inventory_image = "fluid_cell.png^[fill:1x4:6,5:" .. cellcolor + end + def.on_place = function(itemstack, user, pointed) + if pointed.type ~= "node" then return end + local _, pos = minetest.item_place_node(ItemStack(source_name), user, pointed) + if pos then + itemstack:take_item() + if itemstack:is_empty() then return ItemStack(empty_cell) end + local inv = user:get_inventory() + if inv:room_for_item("main", empty_cell) then + inv:add_item("main", empty_cell) + else + minetest.add_item(user:get_pos(), empty_cell) + end + return itemstack + end + minetest.item_place(ItemStack("sbz_resources:matter_dust"), user, pointed) -- this is to handle callbacks - idealist + end + minetest.register_craftitem(name, def) +end + +-- Empty +minetest.register_craftitem(empty_cell, { + description = "Empty Fluid Cell (Empty)", + inventory_image = "fluid_cell.png", + liquids_pointable = true, + groups = { chem_element = 1 }, + on_place = function(itemstack, user, pointed) + if pointed.type ~= "node" then return end + local node = minetest.get_node(pointed.under) + local fluid_cell = sbz_api.sources2fluid_cells[node.name] + if fluid_cell then + minetest.remove_node(pointed.under) + itemstack:take_item() + if itemstack:is_empty() then return ItemStack(fluid_cell) end + local inv = user:get_inventory() + if inv:room_for_item("main", fluid_cell) then + inv:add_item("main", fluid_cell) + else + minetest.add_item(user:get_pos(), fluid_cell) + end + return itemstack + end + minetest.item_place(ItemStack("sbz_resources:matter_dust"), user, pointed) + end +}) + +minetest.register_craft({ + output = empty_cell, + recipe = { + { "", "sbz_resources:pebble", "" }, + { "sbz_resources:pebble", "", "sbz_resources:pebble" }, + { "", "sbz_resources:pebble", "" } + } +}) + +sbz_api.register_fluid_cell("sbz_chem:water_fluid_cell", { + description = "Water Fluid Cell (H₂O)", +}, "sbz_resources:water_source", "#87CEEB") +--[[ +-- Water (H₂O) +minetest.register_craftitem("sbz_chem:water_fluid_cell", { + description = "Water Fluid Cell (H₂O)", + inventory_image = "fluid_cell.png^[fill:1x4:6,5:#87CEEB", + on_place = function(itemstack, user, pointed) + local _, pos = minetest.item_place_node(ItemStack("sbz_resources:water_source"), user, pointed) + if pos then + itemstack:take_item() + if itemstack:is_empty() then return ItemStack(empty_cell) end + local inv = user:get_inventory() + if inv:room_for_item("main", empty_cell) then + inv:add_item("main", empty_cell) + else + minetest.add_item(user:get_pos(), empty_cell) + end + return itemstack + end + minetest.item_place(ItemStack("sbz_resources:matter_dust"), user, pointed) + end +}) +--]] diff --git a/mods/sbz_power/sbz_chem/hpef.lua b/mods/sbz_power/sbz_chem/hpef.lua new file mode 100644 index 00000000..0d34996d --- /dev/null +++ b/mods/sbz_power/sbz_chem/hpef.lua @@ -0,0 +1,112 @@ +-- theese allow_metadata_* functions were taken from the mtg furnace +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if listname == "dst" then + return 0 + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if to_list == "dst" then return 0 end + return count +end + + +sbz_api.register_stateful_machine("sbz_chem:high_power_electric_furnace", { + description = "High Power Electric Furnace", + tiles = { + "hpef_top.png", + "hpef_top.png", + "hpef_top.png", + "hpef_top.png", + "hpef_top.png", + "hpef_front_off.png", + }, + groups = { matter = 1 }, + paramtype2 = "4dir", + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_put = allow_metadata_inventory_put, + + input_inv = "src", + output_inv = "dst", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 4) + inv:set_size("dst", 4) + + meta:set_string("formspec", [[ +formspec_version[7] +size[8.2,9] +style_type[list;spacing=.2;size=.8] +list[current_player;main;0.2,5;8,4;] +list[context;src;1.5,1;2,2;] +listring[] +list[context;dst;4.5,1;2,2;] +listring[current_player;main] +listring[context;dst] + ]]) + end, + after_place_node = pipeworks.after_place, + autostate = true, + action = function(pos, node, meta, supply, demand) + local power_needed = 15 + local inv = meta:get_inventory() + + if demand + power_needed > supply then + meta:set_string("infotext", "Not enough power") + return power_needed, false + else + meta:set_string("infotext", "Smelting...") + + local src = inv:get_list("src") + + local out, decremented_input, index + for i = 1, 4 do + local out_inner, decremented_input_inner = minetest.get_craft_result({ + method = "cooking", + width = 1, + items = { src[i] }, + }) + if not out_inner.item:is_empty() then + out, decremented_input = out_inner, decremented_input_inner + index = i + break + end + end + if out == nil then + meta:set_string("infotext", "Invalid/no recipe") + return 0 + end + + if not inv:room_for_item("dst", out.item) then + meta:set_string("infotext", "Full") + return 0 + end + + inv:set_stack("src", index, decremented_input.items[1]) + inv:add_item("dst", out.item) + minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6, pos = pos }) + return power_needed + end + end, +}, { + tiles = { + "hpef_top.png", + "hpef_top.png", + "hpef_top.png", + "hpef_top.png", + "hpef_top.png", + { name = "hpef_front.png", animation = { type = "vertical_frames", length = 0.7 } }, + }, + light_source = 10, +}) + +minetest.register_craft({ + output = "sbz_chem:high_power_electric_furnace", + recipe = { + { "sbz_power:simple_charged_field", "sbz_resources:matter_dust", "sbz_power:simple_charged_field" }, + { "sbz_resources:matter_blob", "sbz_resources:emittrium_circuit", "sbz_resources:matter_blob" }, + { "sbz_power:simple_charged_field", "sbz_resources:matter_blob", "sbz_power:simple_charged_field" } + } +}) diff --git a/mods/sbz_power/sbz_chem/init.lua b/mods/sbz_power/sbz_chem/init.lua new file mode 100644 index 00000000..413e0ae6 --- /dev/null +++ b/mods/sbz_power/sbz_chem/init.lua @@ -0,0 +1,15 @@ +local modpath = minetest.get_modpath("sbz_chem") + +dofile(modpath .. "/fluids.lua") +dofile(modpath .. "/elements.lua") +dofile(modpath .. "/radiation.lua") +dofile(modpath .. "/centrifuge.lua") +dofile(modpath .. "/crusher.lua") +dofile(modpath .. "/alloy_furnace.lua") +dofile(modpath .. "/hpef.lua") +dofile(modpath .. "/compressor.lua") +dofile(modpath .. "/crystal_grower.lua") +dofile(modpath .. "/reactor.lua") +dofile(modpath .. "/pebble_enhancer.lua") +dofile(modpath .. "/decay_chains.lua") +dofile(modpath .. "/decay_accel.lua") diff --git a/mods/sbz_power/sbz_chem/mod.conf b/mods/sbz_power/sbz_chem/mod.conf new file mode 100644 index 00000000..d261ab0d --- /dev/null +++ b/mods/sbz_power/sbz_chem/mod.conf @@ -0,0 +1,2 @@ +name = sbz_chem +depends = sbz_base, sbz_power, sbz_resources, unified_inventory, stairs \ No newline at end of file diff --git a/mods/sbz_power/sbz_chem/pebble_enhancer.lua b/mods/sbz_power/sbz_chem/pebble_enhancer.lua new file mode 100644 index 00000000..801ad78a --- /dev/null +++ b/mods/sbz_power/sbz_chem/pebble_enhancer.lua @@ -0,0 +1,67 @@ +sbz_api.register_stateful_machine("sbz_chem:pebble_enhancer", { + description = "Pebble Enhancer", + info_extra = "Shiny, potentially radioactive pebbles.", + tiles = { + "pebble_enhancer_top.png", + "pebble_enhancer_side.png" + }, + groups = { matter = 1, weak_radioactive = 80 }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("output", 16) + + meta:set_string("formspec", [[ +formspec_version[7] +size[8.2,9] +style_type[list;spacing=.2;size=.8] +list[context;output;3.5,0.5;4,4;] +list[context;input;1,2;1,1;] +list[current_player;main;0.2,5;8,4;] +listring[current_player;main]listring[context;input]listring[current_player;main]listring[context;output]listring[current_player;main] +]]) + end, + info_power_consume = 128, + autostate = true, + action = function(pos, node, meta, supply, demand) + local power_needed = 128 + local inv = meta:get_inventory() + + local itemname = inv:get_stack("input", 1):get_name() + + if demand + power_needed > supply then + meta:set_string("infotext", "Not enough power") + return power_needed, false + end + + if itemname == "sbz_resources:pebble" and inv:room_for_item("output", "sbz_chem:enhanced_pebble") then + inv:remove_item("input", itemname) + inv:add_item("output", "sbz_chem:enhanced_pebble") + meta:set_string("infotext", "Enhancing...") + return power_needed + end + meta:set_string("infotext", "Inactive") + return 0 + end, + input_inv = "input", + output_inv = "output", +}, { + tiles = { + { name = "pebble_enhancer_top_on.png", animation = { type = "vertical_frames", length = 0.5 } }, + "pebble_enhancer_side.png" + }, + light_source = 14, +}) + + + +minetest.register_craft({ + output = "sbz_chem:pebble_enhancer", + recipe = { + { "sbz_chem:uranium_crystal", "sbz_chem:uranium_crystal", "sbz_chem:uranium_crystal", }, + { "sbz_resources:matter_blob", "sbz_resources:phlogiston_circuit", "sbz_resources:matter_blob" }, + { "sbz_chem:thorium_crystal", "sbz_chem:thorium_crystal", "sbz_chem:thorium_crystal", } + } +}) diff --git a/mods/sbz_power/sbz_chem/radiation.lua b/mods/sbz_power/sbz_chem/radiation.lua new file mode 100644 index 00000000..a99e9dc2 --- /dev/null +++ b/mods/sbz_power/sbz_chem/radiation.lua @@ -0,0 +1,400 @@ +--[[ + This file contains code from https://github.com/minetest-mods/technic/blob/3bece9cec5807a73dc764bdf43ad0d1d3441904e/technic/radiation.lua#L202 + The code has been modified. + License: + Minetest Mod: technic + Copyright (C) 2012-2022 RealBadAngel and contributors + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +]] + +--[[ +#DOCS +implements functions to groups: radioactive, weak_radioactive +weak_radioactive is 100 times weaker than the radioactive group +the radiation group's strength is the same as technic's radiation strength +]] + +--[[ +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 meter 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. +--]] + +local rad_resistance_node = {} +local rad_resistance_group = { + charged_field = 512, +} + +local cache_radiation_resistance = {} + +local function node_radiation_resistance(node_name) + local resistance = cache_radiation_resistance[node_name] + if resistance then + return resistance + end + local def = minetest.registered_nodes[node_name] + if not def then + cache_radiation_resistance[node_name] = 0 + return 0 + end + resistance = def.radiation_resistance or + rad_resistance_node[node_name] + if not resistance then + resistance = 0 + for g, v in pairs(def.groups) do + if v > 0 and rad_resistance_group[g] then + resistance = resistance + rad_resistance_group[g] + end + end + end + resistance = math.sqrt(resistance) + cache_radiation_resistance[node_name] = resistance + return resistance +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), which is +the maximum distance one can get from the node center 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 from a node at which an unshielded +player will be damaged by 1 HP/s. Or, equivalently, it is the square +root of the damage rate in HP/s that an unshielded player one node +away will take. + +Shielding is assessed by adding the shielding values of all nodes +between the source node and the player, ignoring the source node itself. +As in reality, shielding causes exponential attenuation of radiation. +However, the effect is scaled down relative to real life. A node with +radiation resistance value R yields attenuation of sqrt(R) * 0.1 nepers. +(In real life it would be about R * 0.69 nepers, by the definition +of the radiation resistance values.) The sqrt part of this formula +scales down the differences between shielding types, reflecting the +game's simplification of making expensive materials such as gold +readily available in cubes. The multiplicative factor in the +formula scales down the difference between shielded and unshielded +safe distances, avoiding the latter becoming impractically large. + +Damage is processed at rates down to 0.2 HP/s, which in the absence of +shielding is attained at the distance specified by the "radioactive" +group value. Computed damage rates below 0.2 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 abdomen_offset = 1 +local rad_dmg_cutoff = 0.2 + +local function apply_fractional_damage(o, dmg) + local dmg_int = math.floor(dmg) + -- The closer you are to getting one more damage point, + -- the more likely it will be added. + if math.random() < dmg - dmg_int then + dmg_int = dmg_int + 1 + end + if dmg_int > 0 then + local new_hp = math.max(o:get_hp() - dmg_int, 0) + o:set_hp(new_hp) + return new_hp == 0 + end + return false +end + +local function calculate_base_damage(node_pos, object_pos, strength) + local shielding = 0 + local dist = vector.distance(node_pos, object_pos) + + for ray_pos in Raycast(node_pos, vector.multiply(vector.direction(node_pos, object_pos), dist), false, false) do + ray_pos = ray_pos.under + local shield_name = minetest.get_node(ray_pos).name + shielding = shielding + node_radiation_resistance(shield_name) * 0.025 + end + + local dmg = (strength * strength) / + (math.max(0.75, dist * dist) * math.exp(shielding)) + + if dmg < rad_dmg_cutoff then return end + return dmg +end + +local function calculate_damage_multiplier(object) + local ag = object.get_armor_groups and object:get_armor_groups() + if not ag then + return 0 + end + if ag.immortal then + return 0 + end + if ag.light then + return 0.01 * ag.light + end + return 0 +end + +local function calculate_object_center(object) + if object:is_player() then + return { x = 0, y = abdomen_offset, z = 0 } + end + return { x = 0, y = 0, z = 0 } +end + +local function dmg_object(pos, object, strength) + local obj_pos = vector.add(object:get_pos(), calculate_object_center(object)) + local mul + -- we need to check may the object be damaged even if armor is disabled + mul = calculate_damage_multiplier(object) + if mul == 0 then + return + end + + local dmg = calculate_base_damage(pos, obj_pos, strength) + if not dmg then + return + end + dmg = dmg * mul + apply_fractional_damage(object, dmg) +end + +local rad_dmg_mult_sqrt = math.sqrt(1 / rad_dmg_cutoff) +local function dmg_abm(pos, node) + local strength = + minetest.get_item_group(node.name, "radioactive") + + (minetest.get_item_group(node.name, "weak_radioactive") / 100) + local max_dist = strength * rad_dmg_mult_sqrt + for _, o in pairs(minetest.get_objects_inside_radius(pos, + max_dist + abdomen_offset)) do + if (o:is_player()) and o:get_hp() > 0 then + dmg_object(pos, o, strength) + end + end +end + +if minetest.settings:get_bool("enable_damage") then + minetest.register_abm({ + label = "Radiation damage", + nodenames = { "group:radioactive" }, + interval = 1, + chance = 1, + action = dmg_abm, + }) + minetest.register_abm({ + label = "Radiation damage (Weak, mostly radon)", + nodenames = { "group:weak_radioactive" }, + interval = 1, + chance = 3, + action = dmg_abm, + }) +end + + +-- RADON!!! +core.register_node("sbz_chem:radon", { + description = "radon", + drawtype = "glasslike", + paramtype = "light", + drops = "", + tiles = { "radon.png" }, + light_source = 10, + use_texture_alpha = "blend", + diggable = false, + groups = { not_in_creative_inventory = 1, habitat_conducts = 1, explody = 10000, weak_radioactive = 50, }, + sunlight_propagates = true, + post_effect_color = "#6abe3032", + walkable = false, + buildable_to = true, + pointable = false, + is_ground_content = true, + air = true, + air_equivalent = true, -- deprecated + floodable = true, +}) + +-- 20% chance of going away each move if not surrounded by radioactivity +core.register_abm({ + label = "Radon gas move", + nodenames = { "sbz_chem:radon" }, + neighbors = { "air", "group:airlike" }, + interval = 1, + chance = 1, + action = function(spos, node) + local should_go_away_with_chance = true + local air_nodes = sbz_api.filter_node_neighbors(spos, 1, function(pos) + local nn = core.get_node(pos).name + if core.get_item_group(nn, "radioactive") > 0 or core.get_item_group(nn, "weak_radioactive") > 0 then + should_go_away_with_chance = false + end + if core.get_item_group(nn, "airlike") == 1 or nn == "air" then + return pos + end + end, false) + local num_airnodes = #air_nodes + if num_airnodes == 0 then return false end + local swap_pos = air_nodes[math.random(1, num_airnodes)] + if (not should_go_away_with_chance) or (math.random() <= 0.20) then -- 20% + core.swap_node(swap_pos, node) + end + core.remove_node(spos) + end +}) + +core.register_abm({ + label = "Radon gas/water spawn (by group:radioactive)", + nodenames = { "group:radioactive" }, + interval = 1, + chance = 1, + action = function(spos, node) + local radioactive_group = core.get_item_group(node.name, "radioactive") + local num_radon = 0 + if radioactive_group >= 5 then + num_radon = math.floor(radioactive_group / 5) + else + if math.random() >= (radioactive_group / 5) then + num_radon = 0 + else + num_radon = 1 + end + end + if num_radon == 0 then return end + + local target_nodes = sbz_api.filter_node_neighbors(spos, 1 + math.floor(radioactive_group / 10), function(pos) + local nn = core.get_node(pos).name + if core.get_item_group(nn, "airlike") == 1 or nn == "air" then + return { pos = pos, type = "air" } + end + if nn == "sbz_resources:water_source" then + return { pos = pos, type = "water" } + end + end, false) + if #target_nodes == 0 then return end + for i = 1, num_radon do + local data = target_nodes[math.random(1, #target_nodes)] + local node_to_place + if data.type == "air" then + node_to_place = "sbz_chem:radon" + elseif data.type == "water" then + node_to_place = "sbz_chem:radioactive_water" + end + core.set_node(data.pos, { name = node_to_place }) + end + end +}) + +local water_color = "#6abe3032" --alpha: 0x32 + +core.register_node("sbz_chem:radioactive_water", { + description = "bad water, unhealthy even", + drawtype = "liquid", + tiles = { + { name = "water.png^[multiply:" .. water_color .. "^[opacity:200", backface_culling = false }, + }, + use_texture_alpha = "blend", + groups = { liquid = 3, habitat_conducts = 1, not_in_creative_inventory = 1, weak_radioactive = 80 }, + light_source = 14, + post_effect_color = water_color, + paramtype = "light", + walkable = false, + pointable = false, + buildable_to = true, + drop = "", + liquid_viscosity = 1, + drowning = 6, +}) + +core.register_abm({ + label = "Radioactive water move", + nodenames = { "sbz_chem:radioactive_water" }, + neighbors = { "air", "sbz_resources:water_source", "sbz_chem:radioactive_water" }, + interval = 2, + chance = 1, + action = function(spos, node) + local uppos = vector.new(spos.x, spos.y + 1, spos.z) + local upnode = core.get_node(uppos) + if upnode.name == "air" or core.get_item_group(upnode.name, "airlike") > 0 or upnode.name == "sbz_bio:algae" then + core.set_node(spos, { name = "sbz_resources:water_source" }) + core.set_node(uppos, { name = "sbz_chem:radon" }) + return + end + + local positions = { + { -1, 1, -1 }, + { 0, 1, -1 }, + { -1, 1, 0 }, + + { 1, 1, 1 }, + { 0, 1, 1 }, + { 1, 1, 0 }, + } + + for i = 1, 8 do + local vec + if i ~= 1 then + vec = vector.add(vector.copy(spos), vector.new(unpack( + positions[math.random(1, #positions)] + ))) + else + vec = vector.add(vector.copy(spos), vector.new(0, 1, 0)) + end + + if core.get_node(vec).name == "sbz_resources:water_source" then + core.set_node(spos, { name = "sbz_resources:water_source" }) + core.after(0, function() + core.set_node(vec, node) + end) + return + end + end + end +}) diff --git a/mods/sbz_power/sbz_chem/reactor.lua b/mods/sbz_power/sbz_chem/reactor.lua new file mode 100644 index 00000000..ed993f29 --- /dev/null +++ b/mods/sbz_power/sbz_chem/reactor.lua @@ -0,0 +1,269 @@ +-- Fuel rods + +core.register_craftitem("sbz_chem:thorium_fuel_rod", { + groups = { chem_element = 1, fuel_rod = 1, radioactive = 1 }, + description = "Thorium Fuel Rod", + inventory_image = "fuel_rod.png^[multiply:#d633af" +}) + +unified_inventory.register_craft { + type = "compressing", + output = "sbz_chem:thorium_fuel_rod", + items = { "sbz_chem:thorium_block 8" } +} + +core.register_craftitem("sbz_chem:uranium_fuel_rod", { + groups = { chem_element = 1, fuel_rod = 2, radioactive = 3 }, + description = "Uranium Fuel Rod", + inventory_image = "fuel_rod.png^[multiply:#47681e" +}) + +unified_inventory.register_craft { + type = "compressing", + output = "sbz_chem:uranium_fuel_rod", + items = { "sbz_chem:uranium_block 8" } +} + +core.register_craftitem("sbz_chem:plutonium_fuel_rod", { + groups = { chem_element = 1, fuel_rod = 3, radioactive = 5 }, + description = "Plutonium Fuel Rod", + info_extra = "Not for noobs...", + inventory_image = "fuel_rod.png^[multiply:#1d2aba" +}) +unified_inventory.register_craft { + type = "compressing", + output = "sbz_chem:plutonium_fuel_rod", + items = { "sbz_chem:plutonium_block 8" } +} + + +local tier2power = { + [1] = 800, + [2] = 2200, + [3] = 4800, +} + +local explosion_particle_def = { + time = 1, + amount = 9000, + radius = 1, + drag = 0.2, + glow = 14, + exptime = { min = 2, max = 10 }, + size = { min = 3, max = 6 }, + texture = "reactor_explosion_particle.png^[multiply:lime", + attract = { + kind = "point", + strength = { min = -20, max = 0 } + }, + acc = { x = 0, y = -3, z = 0 }, -- "gravity" + collisiondetection = true, +} + +sbz_api.register_stateful_generator("sbz_chem:nuclear_reactor", { + description = "Nuclear Reactor", + tiles = { + "reactor_top_off.png", + "reactor_bottom.png", + "reactor_side.png", + "reactor_side.png", + "reactor_side.png", + "reactor_side.png", + }, + groups = { matter = 1, fluid_pipe_connects = 1, fluid_pipe_stores = 1, ui_fluid = 1, explody = 2 }, + + input_inv = "rods", + output_inv = "rods", + on_construct = function(pos) + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("rods", 6) + meta:set_int("rod_timer", 0) + meta:set_int("rod_tier", 0) + meta:set_string("liquid_inv", minetest.serialize({ + max_count_in_each_stack = 100, -- 100 buckets + [1] = { + name = "sbz_resources:water_source", -- forced to be water + count = 0, + can_change_name = false, + }, + })) + meta:set_string("formspec", "formspec_version[7]size[10.2,10.8]" .. + sbz_api.bar(0, 0, 0.2, 0.2, " Water Sources", + "Reactor Water Storage", "Don't let it get too low.") .. [[ +list[context;rods;6.2,0.2;2,3;] +list[current_player;main;0.2,5.4;8,4;] +listring[] + ]]) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + return pipeworks.after_place(pos) + end, + on_liquid_inv_update = function(pos, lqinv) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "formspec_version[7]size[10.2,10.8]" .. + sbz_api.bar(lqinv[1].count, lqinv.max_count_in_each_stack, 0.2, 0.2, " Water Sources", + "Reactor Water Storage", "Don't let it get too low.") .. [[ +list[context;rods;6.2,0.2;2,3;] +list[current_player;main;0.2,5.4;8,4;] +listring[] + ]]) + end, + autostate = true, + action = function(pos, _, meta, supply, demand) + local inv = meta:get_inventory() + local lqinv = core.deserialize(meta:get_string("liquid_inv")) + + local rodtimer = meta:get_int("rod_timer") + + if rodtimer <= 0 then -- no rods, attempt to get some from inventory + if lqinv[1].count == 0 then + meta:set_string("infotext", "No water and no fuel rods") + return 0 + end + local rodstack = ItemStack("") + if inv:contains_item("rods", "sbz_chem:thorium_fuel_rod 6") then + rodstack = inv:remove_item("rods", "sbz_chem:thorium_fuel_rod 6") + elseif inv:contains_item("rods", "sbz_chem:uranium_fuel_rod 6") then + rodstack = inv:remove_item("rods", "sbz_chem:uranium_fuel_rod 6") + elseif inv:contains_item("rods", "sbz_chem:plutonium_fuel_rod 6") then + rodstack = inv:remove_item("rods", "sbz_chem:plutonium_fuel_rod 6") + end + + if rodstack:is_empty() then + meta:set_string("infotext", "Need fuel rods.") + return 0 + end + local tier = core.get_item_group(rodstack:get_name(), "fuel_rod") + -- mercy on noobs + if tier == 3 and count_nodes_within_radius(pos, "sbz_resources:water_source", 5) < ((9 * 9 * 9) - 1) / 2 then + inv:add_item("rods", rodstack) + meta:set_string("infotext", + "Not enough water near the reactor, either put water near your reactor or don't use plutonium fuel rods.") + return 0 + end + meta:set_string("rod_tier", tier) + meta:set_string("rod_timer", 3 * 60 * 60) -- 6 fuel rods will last 3 hours + end + -- alright, from that if statement, while it doesn't look obvious at first, we are sure we have a rod active in some way + rodtimer = meta:get_int("rod_timer") + local tier = meta:get_int("rod_tier") + + -- 1 water every tick i guess... for all fuel rods... sure + -- so check water + if lqinv[1].count <= 0 then + -- attempt to explode + if tier == 1 then -- but thorium ones don't explode so just don't make them do anything.. so it just pauses + meta:set_string("infotext", "Out of water, but you have thorium fuel rods so the reactor didn't explode.") + return 0 + end + -- explode + local owner = minetest.get_meta(pos):get_string("owner") + minetest.sound_play({ name = "distant-explosion-47562", gain = 0.4 }) -- we gotta get better sfx + local strength = 1 + if tier == 3 then strength = 2 end + sbz_api.explode(pos, 20 * strength, 0.9 * strength, false, owner) + explosion_particle_def.pos = pos + explosion_particle_def.attract.origin = pos + minetest.add_particlespawner(explosion_particle_def) + return 10000 -- yeah sure why not + end + + if tier == 3 then + -- must be somewhat submerged in water.. + -- 50% of nodes in a r=2 area around the reactor must be water sources, around the reactor, the check gets performed in a r=5 area + -- basically just put it in a pond you should be good and don't let radiated water kill your reactor + if count_nodes_within_radius(pos, "sbz_resources:water_source", 5) < ((5 * 5 * 5) - 1) / 2 then + -- i know... duplicating explosion code... cringe bad yeah yeah + local owner = minetest.get_meta(pos):get_string("owner") + minetest.sound_play({ name = "distant-explosion-47562", gain = 0.4 }) -- we gotta get better sfx + sbz_api.explode(pos, 20 * 2, 0.9 * 2, false, owner) + explosion_particle_def.pos = pos + explosion_particle_def.attract.origin = pos + minetest.add_particlespawner(explosion_particle_def) + return 10000 + end + end + -- great... now + -- render formspec BEFORE consuming water + meta:set_string("formspec", "formspec_version[7]size[10.2,10.8]" .. + sbz_api.bar(lqinv[1].count, lqinv.max_count_in_each_stack, 0.2, 0.2, " Water Sources", + "Reactor Water Storage", "Don't let it get too low.") .. [[ +list[context;rods;6.2,0.2;2,3;] +list[current_player;main;0.2,5.4;8,4;] +listring[] + ]]) + -- consume water + lqinv[1].count = lqinv[1].count - 1 + meta:set_string("liquid_inv", core.serialize(lqinv)) + + + + meta:set_int("rod_timer", rodtimer - 1) + meta:set_string("infotext", + "Working, used: " .. math.floor((100 - (rodtimer / (3 * 60 * 60) * 100)) / 100) * 100 .. "%") + return tier2power[tier] + end, +}, { + tiles = { + "reactor_top_on.png", + "reactor_bottom.png", + "reactor_side.png", + "reactor_side.png", + "reactor_side.png", + "reactor_side.png", + }, + -- can do some evil chain explosion logic but wont :> + groups = { matter = 1, radioactive = 10 }, + diggable = false, + light_source = 14, +}) + +-- the scary +local xray_demand = 1800 +sbz_api.register_stateful_machine("sbz_chem:xray", { + description = "X-ray emitter", + tiles = { + "xray_top.png", + "xray_top.png", + "xray_side.png", + }, + groups = { matter = 1, }, + autostate = true, + action = function(pos, _, meta, supply, demand) + if supply < demand + xray_demand then + meta:set_string("infotext", + "Needs 1800 power. Maybe because of that this might be a little... dangerous... hmm.... no i'm sure it's nothing...") + return 0, false + end + meta:set_string("infotext", "On") + return xray_demand, true + end, +}, { + groups = { matter = 1, radioactive = 30 }, + tiles = { + "blank.png^[invert:rgba^[colorize:cyan:255", + "blank.png^[invert:rgba^[colorize:cyan:255", + "blank.png^[invert:rgba^[colorize:cyan:255", + }, + light_source = 14, +}) + +core.register_craft { + output = "sbz_chem:xray_off", + recipe = { + { "sbz_chem:plutonium_block", "sbz_chem:plutonium_block", "sbz_chem:plutonium_block", }, + { "sbz_chem:plutonium_block", "sbz_resources:phlogiston_circuit", "sbz_chem:plutonium_block", }, + { "sbz_chem:plutonium_block", "sbz_chem:plutonium_block", "sbz_chem:plutonium_block", }, + } +} + +core.register_craft { + output = "sbz_chem:nuclear_reactor_off", + recipe = { + { "sbz_power:solid_charged_field", "sbz_resources:phlogiston_circuit", "sbz_power:solid_charged_field" }, + { "sbz_resources:phlogiston_circuit", "sbz_resources:storinator_neutronium", "sbz_resources:phlogiston_circuit" }, + { "sbz_power:solid_charged_field", "sbz_resources:phlogiston_circuit", "sbz_power:solid_charged_field" } + } +} diff --git a/mods/sbz_power/sbz_chem/sounds/050597_ice-crusher-38522.ogg b/mods/sbz_power/sbz_chem/sounds/050597_ice-crusher-38522.ogg new file mode 100644 index 0000000000000000000000000000000000000000..395eba44825634f9532b6bb2f5f020d0ac069677 GIT binary patch literal 14978 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

-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 VyZ+!pF#840%&qSYssPB=w*a;JqpJV_ literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/block.png b/mods/sbz_power/sbz_chem/textures/block.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2ca3583570cfce607efe4c703fe73d2238fc47 GIT binary patch literal 237 zcmV8eOr>!eEr!p|vIC_|ZBXU}>8(Y((sBs%^WsG>qTqvzDX_zq9EHV^2 z%ZiAGOVpukiL6t1)8P`lpg0VuBP|)k5nvk`MutK%0?x1k(z9QOg6@xQ|7_(u>60(% zX@AfAzF*F1pGDMjR8EiLV#$Yyw%{|p7EW*flO69%G&amkrS>2tl)azI{ykG9TExbJ zYa-NOdYl3*UH?4z%iD{=t|RH-VB=wM{I&`_^lKt$yvT#k?B50^WJH5W3E`kp9R~`6 z3FLLVz}L532MtvsSk&m=r?m8f_Mh&8A{J5Ai8Ekfei4{qG=iJfCxP$A?*YG3D#5M| z2CyTq4lMofC2&s`FTRC}{M~(amxxkO2Z}%i(1$z3VGU*YLKddbgd+rD2Q_#>3Px@n zQG^IApn!aYBN?&CL?F__++nQW15JblNoZYaZdwkj@cgwh4fh7HlRp+Qrpe_#DBC}> z|M=#RP!g~HJ%ct?9vnL`Z(SmPYAkgiG$bUESG|+nzqX?!lhI5#@91MJW%-%;)yMOb zy0sb3S2`*P)LMJI0x--HC!M!eVRXzF7ykl~y2Kfd4%@wFbsb-J1}(WBp+ zWiIa8R-=ncWnxu+3#!WQ7MK*Dy>YA0MwNMVt>N+7CU3ZFr`-J?ILK0x{&kSeoY1DX4#zN2S~B*Ojxowb?3C-&s;p?~OUU;CT)fQQq0bYi6CsQPQp$ z6e{Ar%iPg-!}Q4ELlJ#kGxU#(6xhG`*bJ6e?bQx`Tfb9Qw}7W&t~qt6t-Yd$G5zt$ zxQ``}KKL!N_@XyD|Kh*uyvm`=O4*eVv?eh5iMrg4qgw|=+vo2aVwXD|SNjDT*u8Z3 zjJ21$-$vE?TOr3r1ckBHvBX;1A~&6{87TT8sFk3Xixu)gv@Y@Op+ru!ixh6s9oKM?jQPxIp_`l-W|Dh*Ob&gp6gLsuIJ;`*d a<9E!9sj1wj*94t!nZq}7=>S}9)l=|rDHp=F_80gj+8SXai%IBvSrDb1yLpUXb0p3>}PBsG_CT#Ehv8Z zZFpa7{-=-6_is$l3jn;m#-j!wjy0aA{Q9K=rXo9cK5uqWn1LQx)qCSQH=1#^|dn?dY0N49&UiTXK2AH}{77oXHw83pE5FXfK&%Y}ZK|BDOa4nXr zaXe^;%gh8d$n!OTYpD8wVi{fJJ)H{-7Oc z)5M&ba}kv)k;JJp173qr^&05&LLX3qc%av0(*D4;@em#e52%42Xr5jN?+?sKPd+bb zlVBbI&GUbM9`tQ_ECa@a_F~@eyufxQP6N}(C*i@L=0Q7^dA>%GZK;v>ywH9X$TTkx zk~r->jC&12)N8O<=dO7l7+K1+Rhh7la3+Di9vn`d|G8x`<|TQX8_E2lp4W(dhmHz)$hQ1L47?0w(D% zNPj{43&SKlkp6<#AVl-`7up)dgEmZzopr07+*rbN~PV literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/compressor.ase b/mods/sbz_power/sbz_chem/textures/compressor.ase new file mode 100644 index 0000000000000000000000000000000000000000..79388731406baae20dacead7a3a050c4cc8f2460 GIT binary patch literal 1599 zcmcC#V_jR)Ik_s?e70~Vc&%mIh zU;-pvHEe)nnx!F-><_aBlJ^VMfaJ{uX+ZMb;aNcP_a`$TIrC`%kj&a=03^+)3=Ff^ zZU>Srb?rbhGb;;7Mur6e$ug%dAi2iK2uR)xPX?0Lt9Jp({^?#ovMb-@%e1!kl`1iFHOoxvxuGPOv-&>hHORe;F;XM)fS z;FM4?=l9=}Z~o_VZJgA^89C$DFV9kaGdpHx<~W;G^%bv|tNi5&`L&#dnZaiMkAeiC z&R-uH;ZYa>e4w)r z|2JB$XVBY|nAGy6`O3q?M{e}<^Oyg|uUe@AWl!QXQMt m-{2<3iwC8*4=-!z89~&vi%`N#KuZkN&P1TZg`7#Ll=lJ2`|F1Q literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/compressor.png b/mods/sbz_power/sbz_chem/textures/compressor.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f6692f1bb25a8567f3ecf72e19611a426b09d2 GIT binary patch literal 393 zcmV;40e1e0P)LIUVq&6@uD zpss{$8pF1cZr6}J0C_NIV5>g>%JSnp&oGe(ZXyr7{&JlP6z2rXk285d9<&Km$0;HY z$OB#E0eJwB2eTv~56A<6JQy^v6@Nc~2S6bY$OC}?FZf}wJW$93@}Oq`@chAV8u0u9 ndC(?M9jA!r6KSA}=M#YkBB29Wo{S%700000NkvXXu0mjfx$dTu literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/compressor_side.png b/mods/sbz_power/sbz_chem/textures/compressor_side.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa699ee4600716e81c5c7c669994bf6473be761 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr`&KfBv3)W6#Xm(AwD8 z=otH6K5|xmTvAfPq9bK&Y;A$eZoCqv3|tbLXU{PlJj$6G{4K`>sF}gj)z4*}Q$iB} Dy5S!k literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/crusher_side.png b/mods/sbz_power/sbz_chem/textures/crusher_side.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a78b9db7a72674ed4971ca57ae748b9cb574a0 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr}70PaY=zIPbuiz#_Ro zCA&T8$ocsDk`5BG8#WgjH5l;Rsjlf@Jj@U?D{)YAi!xh*%I9>?^b%)k1k!JAXPdUz{V>odtpN3bb$WzvmvkO`nzcWRy czopr0NlMiXaE2J literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/crusher_top.png b/mods/sbz_power/sbz_chem/textures/crusher_top.png new file mode 100644 index 0000000000000000000000000000000000000000..9fadd2882084fb524cb7ff062c5430dd8233236e GIT binary patch literal 795 zcmV+$1LXXPP)h-!W*tI(GE56;di)`v*X_5pyn=qgt&dLPDVst*o4z0(N)b6SAF1B&gMDiI8YCO4qNf zkrP6>{G1Af0yUdW5fY2VCWmopIk%auzm~q?cUHDd_ z3PH9x=6&@7AjxFX_b~3pxq~^nd0Gc^10)~d50Hm_<$z^^c1B0?lL+(__;5TPcU)kC zSbgyJ-43@XcsIoAgY}J@l+9)}p>V(Oorpe=AVwcxq1xPd;`qP@ zDHd1t{eVY&qtOr{kgVndcRSl4JnozjDwUnd7RJj3x3dYNjyo*}_aBt3kU&0=Ac1^f zg7}Si-%3;=e#?b6-qmK}MH3Kpp>hw_|7<_NxVw1a>TEvX5g&;}JP^?byj<`*gBxP? z!OK@qC;Kx>TzzLyA)*f?h|vdlzLziEaC~5cEG?bYeZa~>=}HicJIx2YT;PQR?QDba zxN}0-+xtMn;ZS>5@Pnx1PRqgTH``W7ARkDOKt3=*{6@TQC8`j=B>Ar`%FCvW6DpdjEnf0AWW zM8wi5DSYl5&*n)wOc!X;nZT;&>m$4IY8n~@RQ}9ZGW*KxYZnikzBc*VPr*8tiWIM%NxkodG@o)YURiO@T=lE} VtSNS8en8t9JYD@<);T3K0RWW$KS%%o literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/decay_accel_front_on.ase b/mods/sbz_power/sbz_chem/textures/decay_accel_front_on.ase new file mode 100644 index 0000000000000000000000000000000000000000..1e18a3d66268f08aafa52ddb22de567836a7f6a0 GIT binary patch literal 2373 zcmcJRdrVVj7>7>>YsZ3g8AgiRXfabDZgQI)M8g3L#>-euMT}0%)lMp7$htAva=19? z1Y*mm!t9bVVU$Kp1n0&@1ZgA7l;NNoRA>gnZ7qxnvqIP7p?g0F(DXkpJ58T+nkM}{ z-}}AiJ&ke0u;Fh!uovLP!DtwUrNVpZ;4EGKFIReqv`x7#rapiaZ_Yw0+d0#YVVgK_ z0Au`j0)^qhKxzCA;BTk50QFTupjmSXNdChGe)-1%py*Z*@J)FJaDQ4LkiY*`V93sJ zAdZWHL5T&xcQQtRDGECT#S86g3tiA2C7@qFM%(Z#^}kPx8$ za0;;hlNO+~Vjr;h{UEyt*5ZmPj1~urfE9o~xPv%YgEIJnESQ2OID#P9ff{&$6c~XH zaYIyxfP)73Hkym|p^_pi(>rrH*jQ+L8% zM@nvydt=*;X20!^ID2Mr*fvF5+}P9bdD*G76gr)LlU3`XAfj{1x+76+ zLrxN_hM_0;PpVs$FH+TJ)et4GW%K(2TgbiLJARlxSU`I;CcARZN#M*%1oDwUJ?qH2 zZB&!xvLe5p{m>`bvPnVfJ)4dr69XkTGMWqHC`~t2bBFzUFEha8WuR*Qd?l3(xQ!Ja zQ=huvBvQB%k*M45?(Y7q<3374+%|A;t`fd&Mq!?%YLK@lu+baJA0OxrC5fYqW|fu@ zH7RwInhmoxTK3gmW`m>D*JD4Ps&tb2eA!aoELKO@?BAYYcl?TCaqfpr^HLFDhnb?j zQ_2M5(EA2nsUQ`dP}5}NYMXk3;A@zNt)4IC>fXj{Y7@jW<(IN$6Dn61>{{@H@ip-p zMqcx~HlR!K+=bd^8wesVwo;HTtZH@CyVk5+Pkoz-2aHI}1bj?MpO!p2|448W(F!#o+a@*TalBV zJTN5fX)|US&0Q)l1!}cJ_zeS3WF2`vH+fWg(IlyKu2-2;f1z=(yxSl8Yfq=vD8)(F zQa2MARe)NaWw?=jJdhij+3YAbFvKe+jy5UflNzsCEp&Vz)3%5N2muFB#&dNwPlj;V^*k$btrDO}YI2z0uPQijz2Gd(fctFuo ovJ6t5{iO9^|KjvT&mr`8#&MZ(t4!N%z{dzt^Wsf-RFXaZA0KmKaR2}S literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/decay_accel_front_on.png b/mods/sbz_power/sbz_chem/textures/decay_accel_front_on.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff38e628a8e3fa59af051ea8fc4843d879180fb GIT binary patch literal 846 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 literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/flowing_chemical_source.png b/mods/sbz_power/sbz_chem/textures/flowing_chemical_source.png new file mode 100644 index 0000000000000000000000000000000000000000..937c450dfc0341a90059770f2966261ec11514ea GIT binary patch literal 712 zcmV;(0yq7MP)C~f)L9}7>b;JF`J-_|>I{+a@&WAH8X1e7g^6~M3(T3x(r>ZKh z<4DPXE;NgVx|u^Mte%&=et#pyz!WFKF>&Y*$j5F61u&X%nlQ>RzpGiacg))c=PHy^ zEW3_=e97clo}1Qg*KF-9@Ph*27;>zY~Z5UtQg^UwA>m9soPJdjFe_qM}No){7( z-&|uVh!V6>NL@R+t|R8eZu`P{xF8q9;q!nvOAa>#sVt>rL{$~ZNHTR1JB9<5N%e;#1t_`sH`CNHeoJ>>o9OR5BMn%l&9}|+NPnhf^`=8_Qy9; z%4nl$+c}%(4fA$>TOlVDOSXS*N#)2iPQ(z{{S-94`0qEw`B$| zH?pbyJi~_BgR%JvL#AM4+nP5yi16s-8>FVdQ&MBb@0PfK{ApigX literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/fuel_rod.png b/mods/sbz_power/sbz_chem/textures/fuel_rod.png new file mode 100644 index 0000000000000000000000000000000000000000..1d2dc252d987607e1b5d9aec88e8dafa403c9d38 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar`%NC)si}81T3)uK2&Z z^vwln7N-Ss=QpqOJ)qRVze)8zzsr-?1?Q*eTKbiLzaZywcJWjJuUv-A-jxlrg0rH9 zPYB6OZ2GQv@3`=1ZN`RK`=b+o@?R2}_}kxtF@?c#fwrZFBhV@aPgg&ebxsLQ0G?Jg A_y7O^ literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/hpef_front.aseprite b/mods/sbz_power/sbz_chem/textures/hpef_front.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..6ff5eeb69b267647c691f45ee795e44261b8044f GIT binary patch literal 1188 zcmcJNe@GKi0LPy(3&L1L&=hN@=}HK@Eiq=x18EieL1kkRNoo^gD<;Y+v2}H|TFBKF z47O`gB4rU1sy`|UMJPhZ{wbna&=0adgotiPtkv=QE>U6l=X}R~?mh00&*$B{n<_#+ z-zp@_aWSNT5YmQwZZLDx1(~Iw%*d))>w8#=nHj4#*GUN}XKFz6dK1`g)Po`C7VuN2 z4jk`m2Y)=f3jRseg3`C$pl6r`H%Gjn)x8mHv{rxylM&=NAIP?x1rK_wIR!r9GX z6W9Ur(T;FbBN@GjMJY1Th(OdK4PA&r5puFEl%fI&@IwwWv~WTQ8&u_46Qc%a1`^0p z($MNUa=5GGn77T3bs;nTmM)rplK=le_qC_ZcYe|O^D#jXHi-7qsqeH~U#|qF`r|@E zd!w$YD?N4Yd1R$+L=!btE2BM~l3?X(hmvEAliPXSp|D#=-2sR4_;s;9Bex#<8j96y zvn!Dat%W6WQHgX3x{O>fd*Y|C&T|VR+E#7VLDS LQderoPt^PaoOP4L literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/hpef_front.png b/mods/sbz_power/sbz_chem/textures/hpef_front.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3470be7b88a4a891d1f33ae4f4d08ed2a154fd GIT binary patch literal 681 zcmV;a0#^NrP)Px%V@X6oR9J=Wn7?ZiVHn3htrCbd860jfS-ik;A#}N5k-8+EI-4S{Qp7*NNkr=4 zqJoRbRGdR84i3Rh9HN1OWXMv4DuhJHR%)Sm8R}5px6gY&l9;+E_l1z-&GUTkxl5i; zo_iM_tv)^F0=f)vd@Dmbo8#nYI5i=i%>i(7G-T=1PZon8s(@+9Mg?lI_u(@DAHTc> zz|LROf!_u{sFZ5}EU&GG4V3z$4x8KI+foJI++Uzlu8Au5&n_XI&GGu>L;9l*)vY0p z<#XlhE92!@KAYR8^hX_DJh`il7ghO{a!n@>+I0Y0yG>fVO#lY%I*#R2-5Tmk(FRh3 zc3me)wRW4@Se;ZGq_a8tqYjScv$1jrz{biUu3Nx$3wjN}v3&ZYPJ9KW{213QP|A-( zYtl&FNW;LhQvfuIUA?A`8^tcA{8-0?Dp>QDL)R^hq-1R9cL0#NbK7_i9!nVpJCE1d zi42okk2bh^N0AntQnh%U`!Lw78j?V`S*DcT}cFE+gYdXy|A4CB~4H&`Lga-)^3Px$6iGxuR5*>LlD}%gU=+oF+9IUbj2V(l8S(%fb;?*=Tc~p>K7dn)VrQi;b(78+ zGKao^eFy2_l=uKz5VEv`+>dfbI-lp)^qRmmosn)@YBD>FdYuNv{7J~ z4giN;O809|yLc&tCb5=4e#YS&0GnhBfaltZxJkC^doUcA4f1$gmd6qRA5Sej*UqI} zA6qa?hxgghHJGIMR>sx$Tzh;gQ^wPm2W8xr_?~Mkak5$f5Jw?#6atW}7Wh_1FiEx6 zv>^&nM0vzfsEnnkGLW8pE2|obh9akw;J=WfCmU2IxbZrTf+DAK4+i%`?JU068jNo1 s*H|FiS~9pB%^StF2`)a@Cy4?60Aq?*IZGvzY5)KL07*qoM6N<$f;{b!bN~PV literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/hpef_top.png b/mods/sbz_power/sbz_chem/textures/hpef_top.png new file mode 100644 index 0000000000000000000000000000000000000000..556efce20a7f2c57e7dab07ec2427013e50f9a4b GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|rg^$JhGgTe~DWM4fK}A<2 literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/ingot.png b/mods/sbz_power/sbz_chem/textures/ingot.png new file mode 100644 index 0000000000000000000000000000000000000000..50fb0288624733ae220a03351e14d3767869c9a8 GIT binary patch literal 260 zcmV+f0sH=mP)6Hhq|7$5LX?AY;^0s4ce}Xnq7?10Y@w#i5;hKVnrySVdrsfp_xt(0zu^C| zc1~#RoG>e2$P)teIxPU~{SknESIgAIDrRA955aP6zB>}4$3ox4DkfQ(HUM(1R=(f; zcU<`Vq^L4;-2h-V9VUfejfG@DYt$(KbKSrXo=k@A+>uiT03pzns@%jbY#>0^asyv@9doxv}$+w z)oYRw%d+oF@J?o7n9$<1?eD|1z1LJsE~FVVd!BHrZ*67NTpDuAg`x!i4{an^LB{Ts5W{*d( literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/radon.png b/mods/sbz_power/sbz_chem/textures/radon.png new file mode 100644 index 0000000000000000000000000000000000000000..0335b7b822f1fa5b18a7947fededa78f7e68c317 GIT binary patch literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nR5lbP0l+XkKtl~KO literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/reactor_side.png b/mods/sbz_power/sbz_chem/textures/reactor_side.png new file mode 100644 index 0000000000000000000000000000000000000000..414dfc6a1eee8bb3924ebbf9cb37840998c84ecc GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr`&KAwdQ|&pR+CBqk&z z2Zn^vy85}Sb4q9e E0HKZ_ApigX literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/reactor_top_off.png b/mods/sbz_power/sbz_chem/textures/reactor_top_off.png new file mode 100644 index 0000000000000000000000000000000000000000..d3208c9fead4701fc6b1e84eea8d1a24c65f314b GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr`&KAwdQ|&pR+CBqk&z ze3RWkNsST*fWYAFOQx=rYj(^cc6ya+lkRl0^6X*!VBqlG z*y@1l`9lX9IC5hcw*N8Is$>ke5%yu{S^To0v61U#!^BH(co>|Vm2VY%dG!crF@vY8 KpUXO@geCxo3_N}S literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/reactor_top_on.png b/mods/sbz_power/sbz_chem/textures/reactor_top_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f040f0d7b45a542bd2f5254a48710e391ae61e GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr`&KAwdQ|&pR+CBqk&z ze3RWkNsST*fS_ROMON3K-F5t2^3!dEJ>MN=V!OvsA+g}M zr0j!9>4^yrEoOQR(f=f-?rG4T$GMET?PAG+0}ibv2Rt&%*ciIaRfH_L|M&teX7F_N Kb6Mw<&;$Tx2|8u~ literal 0 HcmV?d00001 diff --git a/mods/sbz_power/sbz_chem/textures/simple_alloy_furnace.png b/mods/sbz_power/sbz_chem/textures/simple_alloy_furnace.png new file mode 100644 index 0000000000000000000000000000000000000000..83f65ac1711a91321718a5eb834737446094d678 GIT binary patch literal 862 zcmV-k1EKthP)Px&7)eAyRA_c95oRboTeh1uibW&|B>FF45~<0sywQH&F+Gj~|XLcYK<MR^3TD1PNInE*jud)zdhL9+nE*^4EyN5 ze>bVhBu(1@fST`c4s#M;zIcT+ZCjggc78e?&g_qY@#q!jAUB-Zhz;h>!NP-u2eUC9 zyR-*`Vc&YoV(2%LBspj_mN2@#!}awI_2a>?kL8tR{QUJJ77u=p{!He48xtO{*2e|1 zb3Pjh6qiV#WW#!(1;sWC4`L|L1jeIFbqUiR*xc&QrjaDcLI3M_D+``Ie~QuV9Ud*! zV)5Yfr*G0afHh%jdvkgv+L{pdE-f3@11%_Qf`PK|z+-k6F|J%`4}z{-O;N2YBJu!$ zwF#03fZKh7^C4(KVLi}-!X_9f55)tY;p{y-Hv#={raf?3xk?3?=z0v1c>vg%kn;er zHzEAY#CkBlI}|no6lV|C*An%A!O4SChqL$WJXyJ_LVMs7s(`8A7@-FMZ-Vkl1nf*G z&jas02nLF?2Wi^I+4*UH?aX>0Kq-GXd(X~c`iVX%EKv09AyN+j&IGLo0B=HtJ@76d zt_x)=jPXD;Wpit1)&l{G^Kh1WDED%+txMz{FwY?)_5dh0!RP_Nneb3N2;K@~Jdi-i z4rkT_=_!xPaE`nwD^jip>^ljOdjObCDD(g*HX#xZ;%kLj_Y<>cne`x^9?E>0vLfYq zVDo-b1v~)sCQu##W)s5C&Q2c0*9xn~^M!aoarQv!q4*?M!1i6mig*C1O`tsh^d^L# zot-?0uN77e54;Q94=5*BN800`&yvUGz2ypd0OU=Wc%XYLY&I$r!q3i59>muQ`%gUZ oEo0B&@0SE~DCN2cX7-#02mysR58FhkOfV nKs%xl!6jHSVD5tM@BfaUE)G)9y#Z|=00000NkvXXu0mjfIIUcv!q a1_o7cHl?czpY#BYXYh3Ob6Mw<&;$Tym@5eY literal 0 HcmV?d00001 diff --git a/mods/sbz_power/switching_station.lua b/mods/sbz_power/switching_station.lua index a4cd4c3c..81de1ed7 100644 --- a/mods/sbz_power/switching_station.lua +++ b/mods/sbz_power/switching_station.lua @@ -297,6 +297,7 @@ minetest.register_node("sbz_power:switching_station", { local meta = minetest.get_meta(pos) meta:set_string("infotext", "Loading....") end, + info_extra = "If you put 2 of them next to eachother a funny happens", }) minetest.register_craft({ diff --git a/mods/sbz_power/textures/simple_charge_generator.png b/mods/sbz_power/textures/simple_charge_generator.png index 9727ce0909a75ec8ef014b4482ea5d6a41356b29..6e84a5181a05cc8f3d190bee2326bfb180adcd19 100644 GIT binary patch delta 1290 zcmV+l1@-#O1CR=k7k@wq0ssI2oF8Dp00001b5ch_0Itp)=>Px(%1J~)R7i=PmQP3{ zcNE9JznQ3%uw`SqmeHO4qfQ$(%0epGUILK~wJT|9B5Mn!6xvgv_0S%AP(%zgExiQ6 zQ-#u-pt%G=$RUtREtQB>S=o`T?r269Chn#U#SN2R4{!2wR)2I$c1|;IzVqhId*9FR zH|+c2cL9KN4$kYGgEKHDF$M<4&c+$@NRsrRvoo7nj>Sg+0Pwf_(KxKKMJFWa-rr|G zj@ z*#5r9wrxu6Z-4g-U3RuWDJcToc>|M}RIl6advmFI)vHa#W~O2@s#lv!&C@L^m4UJ3 zouNu-fXW3x>dmz+0R01f)7eR*>g10m!oEK@4PQ?VHUq!w|jZ235sBuSMpd8APP)~)uG9E9xJQ;{8mCnbihjqw3Imu+>6Aqngx7h~)?h!}eXlw5HEZvt z=Wvz>cRlW^Uc`gy)u>C^*@98kFXZ8~FFqy13U8w^OY>Ycp&Rj$7-WyZPau+ z1FZhON+;*@@M3G6<>CL$*Yt9KQNKAjx9j402@>`5d>*I__c;mPD3v^nv211;Krz2f zEplcA?5vnHB6?>wv;6HlA%}-zemfKiQr6s3ApnJ>(M0%4xfKBN2t|UtRPqQO+%2Nq zB7Z0*YumQNgX-19_M>{WxH1-3##FCHOOp`P>$YP)G?pz=9~jR7#MQBkxgg@yeR-&- zyVTZpt-qt^*7e$>R-pz^sn~;Ew@WAH;QM{A^CR%6Eu*Rjph%J|$?_>c;v|{~lhhrw%9bq4r`A9o)IPzD z>eY5uOtQw|@!nx(@6;OE%(AeC$V!ePYaC|wV(}4PDqY9}fOGHwUUq*d=C?&d&VML` z$3l^y!vm4vc0YZOn-IEuGtlngoJSMkofT7jVm7lJLXbKmexk5~z_7x%HlO3cy=S_E zf)m@eJ@vXxgQWIlGs|yZjm8zn8icYCyz1tGvXWZxAmYxB!@09~gd#y&HQYQL7|-Zc zvG@qJ0WYyn%R}8apIr78^V@6de}4e@Tl)754+oWp5AN&LqndKF!}sL)lm{w_Di%Df z9^@!aGjVtji-J|Q$cU>4Id>KzkPO4wAKWe=-MK$E4iC-`-wFU2RbA}aUA`N|{5Dy` zsOrX&{xMl26bTmd+iv&M;U>gb(rKw|nuq@YuQqNFiskrM00000NkvXXt^-0~g5(i@ AjsO4v delta 447 zcmbQhb%uF@c)b7zGXn#IhAw|FkYX$ja(7}_cTVOdkh3emC&V=@G$cGMEFwHSGAt-E zJUB8UA}Ty2DguZ?qk$+Ah{B?y!eXMrW1=Erq9bBKC^9xCG7f~I;$nd)Ixa3cJ~lcY zNXEs)$HyjsP+USnTw;7|eIk%bj8964PXdyO2}wynl$e~7oSKrH5#*oc)RpDjnH3V0 z6CRoy5mw~VQtS#ut;KGwC2p-PE>113&aJL4ZEmh@?m*<$4n!XAonD?@-d-ELUMm2- zalq5XF+}3B?YTg&!ww>>7pm{ynRSIjG--i+)4K!m_22iimOm(Wy%nUAI%{U-`TmY{ z*7o-cgce_2Af(*F&%5|%;W{a|ZqF$bwr=TdSR-|*;djxBBl|vFIXLy0&Gt`hHlv@^Jifnfmg`p;?gpM4%NA?wfA*1$ zp*=TJ{?K=p2iiwdEo%Q*_;V)Az5Q#$o75XonQIM10v+o;Q?yeSC2@UUASr*R`48)i XtBG5AHPn@XzG3im^>bP0l+XkKq(its diff --git a/mods/sbz_power/textures/simple_charge_generator_off.png b/mods/sbz_power/textures/simple_charge_generator_off.png index 42a3542a6ce65c2c9aa466df806e3aabe1cb40c3..f54562a746605350e9e369efdbffdbeeb34679ed 100644 GIT binary patch delta 306 zcmV-20nPq`1i}K48Gix*005AYXf^-<00DDSM?wIu&K&6g008_+L_t(2k(H7$a)U4s zMgLz^rlZ28T9+<$fF#z?a1dW3lT6M+!*B#9T@K)a87e9|x3DRc!7^4d<1Kgp)Blo| zZ!gaPpsG+^RG|bZBnWcbCyj`lce|!;%gW>L3IaO}{P4%muYd2&IKWNaZu+Og-l%F> z`Pd=W#m%zv90oJbb230O7=^Md^S#vB!r9`UBxsy5sjSDvGV4F}8)^0J`q5bgll*Dw`f;6>mA^)cQw1i#*!+pAh-9&27MJo--V3+)?xY^Y0>9FVf@%6Fgdvv{j0G*Ghz**N^`2YX_07*qoM6N<$ Ef*PTgKmY&$ literal 514 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf-TV61)}JJn*c&_2?=qD@v(_OGBG|WAwCI6CMF~$0a0RdN^)vSaz>DUmQz=jb7xjaP)>Mg zZbVp-OG~jU5VaP&wU)TGwzxR8xH`AGy0p2uwz&h5TRRYWxOaMac6ob=2}#V~qqPR; z5&M!Lzu^CrfyFA5X911c>gnPbA~Dsq@1{_b0gvlySMEh&ixs@P7cf~Zw!3)h-~ail zsTY42sg)a@bc|H%+O?9~aD$Vin!s|y3G+N#SqvN9?P6zl?QvmcC>GoN^UmfRVFmZn zGmVS3ao?T2OEGY=+w|hw&$%LmvmW2;D>R&Tm-ltJL8-IAFa0aidGZgf7=IO|vOeVea!>hTLPr1d*K0jgR;@Cc?)2>Gf%D?G XFQ`tL6mUox=m7>#S3j3^P62257k@wq0ssI2oF8Dp00001b5ch_0Itp)=>Px&`AI}UR7i>Cmceft zM-;}t*#)~8$R@A`wIwC7U@hZRGN~$DRXNmkqH1x}TY9y9%PlAV0$;+V9IDboYx_TF z4#1&@s*$D2TwJMAv1Fs9Ng5*@iiN>OZp=;(&kW-Qqe_u_Xn*H4%zQJ;%zM9iA6uE9 z0|3SpMO9UmF~&LXbUK#R0q3@H%d#8*4sT2Xs5RQU=AsS&U31w+07NSl1&q}i?OLO~ zy0)InZIOu7B+ccvR@c^P0XSC_MFl`Zv$v)I{I>J#S*3n-+^$yl#UKedxI2x|`!sGS!t36(?xHqOS#j-m6qJgc}XfrUy=^O#@ z{o}{F=4v&Y{km4OscSA0SeB(Q#sI|b-4oFnxHkznxPQVq2e7%Z4Imf{Bu!J6CQUOK z3`baOFUsW<>kym$`Als#2dRh=9+sCDOXVW1>G2@c7x9qJWM^+p^?3Mr z_Cvu#ERuLte+eKKN&H;=iFk;|XCU+N@XN2ouBCF(*3mWBcdKiVc}OQs4CNu6G~bMe zZ2gzvJdmKr!`#$oB08~1!q%xZ+9c@lKnYAd$bW|xJdmKrLoAY5U0WZ*1AUDtO#Niy z+QB6)6dpfmjXo+onw+}f@wi8v&Jm~c+PnJLTh6b(`Bpr0{$}gHz=MN$5Er++v?z1iXpuyC`KDFWaYXX&I_i-zgzq_&;%y5Xnr0hsvXg}pwAypVqm zs1K=p0bL$!01*$VeBm4q1kjL{PMYU<$op%82U~g*44)aSwB-RY}O9ar6mdY2-@$gY5Og!`>N<5H2@=L$YiRkp#xLTu4f-u4L x0TK@v)(09I?w0`A{SsLRn_rTX;9v1ee*;$IYuZ1d-=Y8j002ovPDHLkV1mIG4Ltw= delta 334 zcmdnbaffMwc)b7zGXn#IhAw|FkYX$ja(7}_cTVOdkW&}n6XL3*V4|jMrlxG6u56~R zY_6_irmkYHu4eA-s+U5>KZtXzi;oj-x z+2!rESVrt4&?!BhE{-7*m#3aPE!LzU!1mzfywpg=2Mr1nxc2?$R!f+7dDG3B?wx-V zdSnlYu+9FOz~OpTbBX8MgO}J^MQ&_(!omD6gx_)P-N<(duT+cD d-hcBu`$Z4QFMGXK&j31%!PC{xWt~$(69A=ufPer1 From 4595219a585340a7ea936963075f12b04cebb586 Mon Sep 17 00:00:00 2001 From: OscarDSanchezJ <15836576+OscarDSanchezJ@users.noreply.github.com> Date: Wed, 7 Jan 2026 10:59:31 -0400 Subject: [PATCH 2/2] Now Texture news New texture, and resolve conflict of folder i'm not see --- mods/sbz_chem/textures/compressor.ase | Bin 1599 -> 2543 bytes mods/sbz_chem/textures/compressor.png | Bin 393 -> 1074 bytes mods/sbz_chem/textures/compressor_side.png | Bin 106 -> 321 bytes mods/sbz_power/sbz_chem/alloy_furnace.lua | 107 ----- mods/sbz_power/sbz_chem/centrifuge.lua | 231 ---------- mods/sbz_power/sbz_chem/compressor.lua | 120 ------ mods/sbz_power/sbz_chem/crusher.lua | 154 ------- mods/sbz_power/sbz_chem/crystal_grower.lua | 148 ------- mods/sbz_power/sbz_chem/decay_accel.lua | 94 ---- mods/sbz_power/sbz_chem/decay_chains.lua | 21 - mods/sbz_power/sbz_chem/elements.lua | 303 ------------- mods/sbz_power/sbz_chem/fluids.lua | 92 ---- mods/sbz_power/sbz_chem/hpef.lua | 112 ----- mods/sbz_power/sbz_chem/init.lua | 15 - mods/sbz_power/sbz_chem/mod.conf | 2 - mods/sbz_power/sbz_chem/pebble_enhancer.lua | 67 --- mods/sbz_power/sbz_chem/radiation.lua | 400 ------------------ mods/sbz_power/sbz_chem/reactor.lua | 269 ------------ .../sounds/050597_ice-crusher-38522.ogg | Bin 14978 -> 0 bytes .../sounds/simple_alloy_furnace_running.ogg | Bin 19545 -> 0 bytes mods/sbz_power/sbz_chem/textures/block.png | Bin 237 -> 0 bytes .../sbz_chem/textures/centrifuge.ase | Bin 2773 -> 0 bytes .../sbz_chem/textures/centrifuge.png | Bin 637 -> 0 bytes .../sbz_chem/textures/centrifuge_side.png | Bin 133 -> 0 bytes .../sbz_chem/textures/compressor.ase | Bin 1599 -> 0 bytes .../sbz_chem/textures/compressor.png | Bin 393 -> 0 bytes .../sbz_chem/textures/compressor_side.png | Bin 106 -> 0 bytes .../sbz_chem/textures/crusher_side.png | Bin 180 -> 0 bytes .../sbz_chem/textures/crusher_top.png | Bin 795 -> 0 bytes .../sbz_chem/textures/decay_accel.png | Bin 132 -> 0 bytes .../sbz_chem/textures/decay_accel_front.png | Bin 171 -> 0 bytes .../textures/decay_accel_front_on.ase | Bin 2373 -> 0 bytes .../textures/decay_accel_front_on.png | Bin 846 -> 0 bytes .../sbz_chem/textures/flowing_chemical.ase | Bin 10839 -> 0 bytes .../sbz_chem/textures/flowing_chemical.png | Bin 974 -> 0 bytes .../textures/flowing_chemical_source.png | Bin 712 -> 0 bytes .../sbz_chem/textures/fluid_cell.png | Bin 173 -> 0 bytes mods/sbz_power/sbz_chem/textures/fuel_rod.png | Bin 152 -> 0 bytes .../sbz_chem/textures/hpef_front.aseprite | Bin 1188 -> 0 bytes .../sbz_chem/textures/hpef_front.png | Bin 681 -> 0 bytes .../sbz_chem/textures/hpef_front_off.png | Bin 346 -> 0 bytes mods/sbz_power/sbz_chem/textures/hpef_top.png | Bin 220 -> 0 bytes mods/sbz_power/sbz_chem/textures/ingot.png | Bin 260 -> 0 bytes mods/sbz_power/sbz_chem/textures/powder.png | Bin 186 -> 0 bytes mods/sbz_power/sbz_chem/textures/radon.png | Bin 77 -> 0 bytes .../sbz_chem/textures/reactor_bottom.png | Bin 168 -> 0 bytes .../sbz_chem/textures/reactor_side.png | Bin 106 -> 0 bytes .../sbz_chem/textures/reactor_top_off.png | Bin 166 -> 0 bytes .../sbz_chem/textures/reactor_top_on.png | Bin 166 -> 0 bytes .../textures/simple_alloy_furnace.png | Bin 862 -> 0 bytes .../sbz_power/sbz_chem/textures/xray_side.png | Bin 289 -> 0 bytes mods/sbz_power/sbz_chem/textures/xray_top.png | Bin 140 -> 0 bytes 52 files changed, 2135 deletions(-) delete mode 100644 mods/sbz_power/sbz_chem/alloy_furnace.lua delete mode 100644 mods/sbz_power/sbz_chem/centrifuge.lua delete mode 100644 mods/sbz_power/sbz_chem/compressor.lua delete mode 100644 mods/sbz_power/sbz_chem/crusher.lua delete mode 100644 mods/sbz_power/sbz_chem/crystal_grower.lua delete mode 100644 mods/sbz_power/sbz_chem/decay_accel.lua delete mode 100644 mods/sbz_power/sbz_chem/decay_chains.lua delete mode 100644 mods/sbz_power/sbz_chem/elements.lua delete mode 100644 mods/sbz_power/sbz_chem/fluids.lua delete mode 100644 mods/sbz_power/sbz_chem/hpef.lua delete mode 100644 mods/sbz_power/sbz_chem/init.lua delete mode 100644 mods/sbz_power/sbz_chem/mod.conf delete mode 100644 mods/sbz_power/sbz_chem/pebble_enhancer.lua delete mode 100644 mods/sbz_power/sbz_chem/radiation.lua delete mode 100644 mods/sbz_power/sbz_chem/reactor.lua delete mode 100644 mods/sbz_power/sbz_chem/sounds/050597_ice-crusher-38522.ogg delete mode 100644 mods/sbz_power/sbz_chem/sounds/simple_alloy_furnace_running.ogg delete mode 100644 mods/sbz_power/sbz_chem/textures/block.png delete mode 100644 mods/sbz_power/sbz_chem/textures/centrifuge.ase delete mode 100644 mods/sbz_power/sbz_chem/textures/centrifuge.png delete mode 100644 mods/sbz_power/sbz_chem/textures/centrifuge_side.png delete mode 100644 mods/sbz_power/sbz_chem/textures/compressor.ase delete mode 100644 mods/sbz_power/sbz_chem/textures/compressor.png delete mode 100644 mods/sbz_power/sbz_chem/textures/compressor_side.png delete mode 100644 mods/sbz_power/sbz_chem/textures/crusher_side.png delete mode 100644 mods/sbz_power/sbz_chem/textures/crusher_top.png delete mode 100644 mods/sbz_power/sbz_chem/textures/decay_accel.png delete mode 100644 mods/sbz_power/sbz_chem/textures/decay_accel_front.png delete mode 100644 mods/sbz_power/sbz_chem/textures/decay_accel_front_on.ase delete mode 100644 mods/sbz_power/sbz_chem/textures/decay_accel_front_on.png delete mode 100644 mods/sbz_power/sbz_chem/textures/flowing_chemical.ase delete mode 100644 mods/sbz_power/sbz_chem/textures/flowing_chemical.png delete mode 100644 mods/sbz_power/sbz_chem/textures/flowing_chemical_source.png delete mode 100644 mods/sbz_power/sbz_chem/textures/fluid_cell.png delete mode 100644 mods/sbz_power/sbz_chem/textures/fuel_rod.png delete mode 100644 mods/sbz_power/sbz_chem/textures/hpef_front.aseprite delete mode 100644 mods/sbz_power/sbz_chem/textures/hpef_front.png delete mode 100644 mods/sbz_power/sbz_chem/textures/hpef_front_off.png delete mode 100644 mods/sbz_power/sbz_chem/textures/hpef_top.png delete mode 100644 mods/sbz_power/sbz_chem/textures/ingot.png delete mode 100644 mods/sbz_power/sbz_chem/textures/powder.png delete mode 100644 mods/sbz_power/sbz_chem/textures/radon.png delete mode 100644 mods/sbz_power/sbz_chem/textures/reactor_bottom.png delete mode 100644 mods/sbz_power/sbz_chem/textures/reactor_side.png delete mode 100644 mods/sbz_power/sbz_chem/textures/reactor_top_off.png delete mode 100644 mods/sbz_power/sbz_chem/textures/reactor_top_on.png delete mode 100644 mods/sbz_power/sbz_chem/textures/simple_alloy_furnace.png delete mode 100644 mods/sbz_power/sbz_chem/textures/xray_side.png delete mode 100644 mods/sbz_power/sbz_chem/textures/xray_top.png diff --git a/mods/sbz_chem/textures/compressor.ase b/mods/sbz_chem/textures/compressor.ase index 79388731406baae20dacead7a3a050c4cc8f2460..af46b38bc84affa15a1dbaa3467f227cd33a3e69 100644 GIT binary patch literal 2543 zcmaFQ$-wYnDK~=v5GpV*GB7Zt05JkMFff7yfihqUAweb9GN7@)KC*yqWdWKg2E^%N`xuPm;gi>3cxb^QOw;o7H^Ik%l751NWB z(37gNQwg#bQcw^vNzsToqB8%U!nNbe{@nim|Npat zt0VX&3@^(WN!PQyZzdKUOcSJIxfHIf9Js+m*lIWj!vsfOuBJMK0MCR|No1B z%UPHiYBzn)*oWrqb#!v}&bC)tFlVPHBpm4Gyy@Rlm-EoQtFGpu`^w*)y!Khg@VeeY zneX^{G}rH^q3eIt14G(?ZR5qC3Z@2MPrPHF$vG)|#k!`~&c_ujXZ$_!&V8GF3crV} z8P6o;6#Fx4cNlo^0+Wxc{k{*2ulzmICU5$fA5R)8*)R0?E}D1F(#ktB%*@O(?rrVO zhMOcjcztX){dP=idNSea;@9jO6Td0%mcRKA7(YAgNpYmV0xp1ldmn~hoe-9nm&}zSKPt&}A7ytTm zvN0UuQ4Kte=DFSU^qkOY`Mdv5e5?QSMScytoAPEy6UE=st5zR)wIOkW3`y~{d%oG{ z3us?_-6Hm;FZVM`L;w143)E`7F@2gT}^yf`jiH)YrS z8y^;@{ZafqU!q6*@51GwIWNW4+I0UEJ{A4)rT<;MmjOdzsp@sQWg~3qPU&^~OILGd zh-cbY=C4@ibkLyC>D%Ee%DW|75+5m;-Z<1R@|Vbz2FgZf(4uD#Eu%*Qn2i=E%&>rE zqeEYsub78~FHD#rY4CgE-Tpj#58E?#5^bG=$@X?ULCv~}gGm%zk2C4s@`Im`8vXnxsAoL}lEvR08+tpKCu@c$DZ zKK$ps8mb|o!ZwL{W#dZsGW!!g!2Dh%(A$%k1oe-dPtV_$FQ97Xi!hhH*Ij>~AA!dI zCj9m1IX3m*h09vozHkd47W=p36IazQ_wV+q5)4NYe{Wlf=8>7idE~z?R}{$}VTRO? jkLni8Jn{jR)Ik_s?e70~Vc&%mIh zU;-pvHEe)nnx!F-><_aBlJ^VMfaJ{uX+ZMb;aNcP_a`$TIrC`%kj&a=03^+)3=Ff^ zZU>Srb?rbhGb;;7Mur6e$ug%dAi2iK2uR)xPX?0Lt9Jp({^?#ovMb-@%e1!kl`1iFHOoxvxuGPOv-&>hHORe;F;XM)fS z;FM4?=l9=}Z~o_VZJgA^89C$DFV9kaGdpHx<~W;G^%bv|tNi5&`L&#dnZaiMkAeiC z&R-uH;ZYa>e4w)r z|2JB$XVBY|nAGy6`O3q?M{e}<^Oyg|uUe@AWl!QXQMt m-{2<3iwC8*4=-!z89~&vi%`N#KuZkN&P1TZg`7#Ll=lJ2`|F1Q diff --git a/mods/sbz_chem/textures/compressor.png b/mods/sbz_chem/textures/compressor.png index b1f6692f1bb25a8567f3ecf72e19611a426b09d2..3ca5fc28ea409fee330694c856a43e9307e3c456 100644 GIT binary patch delta 1054 zcmV+(1mXLM1F{H^BYyw^b5ch_0Itp)=>Px&>`6pHRA_02crY|eC^*oebak6dUJ}zWL!nCyok9i^Y78z3&eS@f z1{_bNCGKFKaym&THI^Y5y+!Af?)lx1_qq2@5}Kv;3FZ(H0DsbQ2roZ;MOqGFG}Mi2 zG^Uu!d|c z7r&Q<2S1)Z;x>-Adwd@3wOU*SRXH2*VBtI{Xd1t@-G4OFJcze@t`-D5uu%~3z{~?R zmE7&45Vtm8a~qF$50J=Z%+p8@V*m7vt03+c9|SzOrGh2o z0omfoCPV-B!~=GBBEQvC(i;z){9&uUZQ+4!#^MGQdMPi42fQwT@kXIpTA!rl5Oh(( zVWW?GuYaC7y0n@~V!V4`oko@i+-bD4fGo?yhPSludFlSr@nFf^nNI)NbpV_6-?F*# z0!?x+k;@p*3(eB{WHg-i>HKKL(^7u$ z7BIT9E{#g9j!0NQRn8iV?$VDgScv4s8|m#`#DC142~>DV7r8g+bY}=a;LgGJ?hg;< zJ`S`j<T zVj1m?7NkYO0`^)hM8bmck8GW<$AJM40v;?TKCs(ZiI97Ad|+A13vN7Ma|I%#p1fmm z(0?>TiRu_%`d>7%3UqMtz^H5|9V>@`DGxia05e?+=KRvU4?S#st8-6NftTxkjMq zavo>Ym5}LbE7R3hzUD$^yFvo!T+N#P`k=0aY#PJ1k#5(JJOFtxXke>90Lt>?JkKzZ z2W}z{y#8{X3TPDP1j~;zc|abt2~@`^A`i#|UE~3I0FVc>Bp?sS1AsgjG_VzaKY#~7 zArHs{fd4P}VX!<<$OH1AX8`d0!EYMy`~i8;CQu!xi02b&po`}dfd?X?16iJoA7=mn N002ovPDHLkV1k@5qtyTa diff --git a/mods/sbz_chem/textures/compressor_side.png b/mods/sbz_chem/textures/compressor_side.png index 6aa699ee4600716e81c5c7c669994bf6473be761..69c9797e70a43790f7ed6d12ee89a13f9e5a580c 100644 GIT binary patch delta 293 zcmV+=0owj*!2*yZe*tq+M?wIu&K&6g008?*L_t(Ijipnu3c^4PeIDI~60jXzoCI;` z=J)tv{*FTtI=S5F2|;j|>d?M3y`GbSa*tl}lDy;=r{m#`Kgv)R88n_{T}?3W z%DO^XS6>2}I+>gnORw>t#V!qKb_4Tzzm3ksyi+HU!~uYBe>nOVTT3^ncvKTtwTy)x=h1 z2@8q{05Ym_8(JG18y#cc%SX=2k4s8QSahU}jjb(^*^O7i flz~e^^Xxf>gGV`2gTLjNFaUw4tDnm{r-UW|b~qcy diff --git a/mods/sbz_power/sbz_chem/alloy_furnace.lua b/mods/sbz_power/sbz_chem/alloy_furnace.lua deleted file mode 100644 index f9800aec..00000000 --- a/mods/sbz_power/sbz_chem/alloy_furnace.lua +++ /dev/null @@ -1,107 +0,0 @@ -local simple_alloy_furnace_recipes = { - { recipe = { "sbz_chem:copper_powder", "sbz_chem:tin_powder" }, output = { "sbz_chem:bronze_powder" } }, - -- { recipe = { "sbz_chem:copper_powder", "sbz_chem:zinc_powder" }, output = { "sbz_chem:brass_powder" } }, - { recipe = { "sbz_chem:iron_powder", "sbz_chem:nickel_powder" }, output = { "sbz_chem:invar_powder" } }, - { recipe = { "sbz_chem:titanium_powder", "sbz_chem:aluminum_powder" }, output = { "sbz_chem:titanium_alloy_powder" } }, - -- { recipe = { "sbz_chem:gold_powder", "sbz_chem:nickel_powder" }, output = { "sbz_chem:white_gold_powder" } }, - -- uncomment to enable white gold or brass -} -minetest.after(0, function() - for k, v in ipairs(simple_alloy_furnace_recipes) do - unified_inventory.register_craft { - output = v.output[1], - type = "alloying", - items = v.recipe - } - end -end) - -sbz_api.simple_alloy_furnace_recipes = simple_alloy_furnace_recipes - -sbz_api.register_stateful_machine("sbz_chem:simple_alloy_furnace", { - description = "Simple Alloy Furnace", - tiles = { - "simple_alloy_furnace.png^[verticalframe:13:1" - }, - groups = { matter = 1 }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 2) - inv:set_size("output", 1) - - meta:set_string("formspec", [[ -formspec_version[7] -size[8.2,9] -style_type[list;spacing=.2;size=.8] -list[context;output;3.5,3;1,1;] -list[context;input;3,1;2,1;] -list[current_player;main;0.2,5;8,4;] -listring[current_player;main] -listring[context;input] -listring[current_player;main] -listring[context;output] -listring[current_player;main] - ]]) - end, - autostate = true, - action = function(pos, node, meta, supply, demand) - local power_needed = 10 - local inv = meta:get_inventory() - - local input_1 = inv:get_stack("input", 1):get_name() - local input_2 = inv:get_stack("input", 2):get_name() - - local function is_valid_recipe(input1, input2) - for _, recipe in ipairs(simple_alloy_furnace_recipes) do - local r = recipe.recipe - if (input1 == r[1] and input2 == r[2]) or (input1 == r[2] and input2 == r[1]) then - return recipe.output[1] - end - end - return nil - end - - local selected_item = is_valid_recipe(input_1, input_2) - if selected_item == nil then - meta:set_string("infotext", "Inactive") - return 0 - end - - if demand + power_needed > supply then - meta:set_string("infotext", "Not enough power") - return power_needed, false - else - meta:set_string("infotext", "Smelting...") - minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6 }, { pos = pos }) - - if inv:room_for_item("output", selected_item) then - inv:add_item("output", selected_item) - inv:remove_item("input", input_1) - inv:remove_item("input", input_2) - else - meta:set_string("infotext", "Output inventory full") - return 0 - end - - return power_needed - end - end, - input_inv = "input", - output_inv = "output" -}, { - tiles = { - { name = "simple_alloy_furnace.png", animation = { type = "vertical_frames", length = 0.7 } } - }, - light_source = 3, -}) - -minetest.register_craft({ - output = "sbz_chem:simple_alloy_furnace", - recipe = { - { "sbz_power:simple_charged_field", "sbz_resources:antimatter_dust", "sbz_power:simple_charged_field" }, - { "sbz_resources:matter_blob", "sbz_resources:emittrium_circuit", "sbz_resources:matter_blob" }, - { "sbz_power:simple_charged_field", "sbz_resources:matter_blob", "sbz_power:simple_charged_field" } - } -}) diff --git a/mods/sbz_power/sbz_chem/centrifuge.lua b/mods/sbz_power/sbz_chem/centrifuge.lua deleted file mode 100644 index 167d8679..00000000 --- a/mods/sbz_power/sbz_chem/centrifuge.lua +++ /dev/null @@ -1,231 +0,0 @@ -unified_inventory.register_craft_type("centrifugeing", { - description = "Seperating", - icon = "centrifuge.png^[verticalframe:12:1", - width = 1, - height = 1, - uses_crafting_grid = false, -}) - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if listname == "dst" then - return 0 - end - return stack:get_count() -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if to_list == "dst" then return 0 end - return count -end - --- sand recipes --- sand => 50% Silicon 2, 10% Gold, 100% white sand -unified_inventory.register_craft { - output = "sbz_chem:silicon_powder 2", - type = "centrifugeing", - chance = 50, -- 50% - items = { - "sbz_resources:sand" - } -} -unified_inventory.register_craft { - output = "sbz_chem:gold_powder", - type = "centrifugeing", - chance = 10, -- 10% - items = { - "sbz_resources:sand" - } -} -unified_inventory.register_craft { - output = "sbz_resources:white_sand", - type = "centrifugeing", - items = { - "sbz_resources:sand" - } -} - --- white sand => 100% dark sand, 5% silver - -unified_inventory.register_craft { - output = "sbz_resources:dark_sand", - type = "centrifugeing", - items = { - "sbz_resources:white_sand" - } -} - -unified_inventory.register_craft { - output = "sbz_chem:silver_powder", - chance = 5, - type = "centrifugeing", - items = { - "sbz_resources:white_sand" - } -} - --- dark sand => 100% black sand, 1% silver - -unified_inventory.register_craft { - output = "sbz_resources:black_sand", - type = "centrifugeing", - items = { - "sbz_resources:dark_sand" - } -} - -unified_inventory.register_craft { - output = "sbz_chem:silver_powder", - chance = 1, - type = "centrifugeing", - items = { - "sbz_resources:dark_sand" - } -} - --- gravel => 10% cobalt, 10% titanium, 10% lithium, 100% 1 pebble, 75% pebble, 50% pebble, 25% pebble, 5% pebble, 1% pebble -unified_inventory.register_craft { - output = "sbz_chem:cobalt_powder", - chance = 10, - type = "centrifugeing", - items = { - "sbz_resources:gravel" - } -} -unified_inventory.register_craft { - output = "sbz_chem:lithium_powder", - chance = 10, - type = "centrifugeing", - items = { - "sbz_resources:gravel" - } -} -unified_inventory.register_craft { - output = "sbz_chem:titanium_powder", - chance = 10, - type = "centrifugeing", - items = { - "sbz_resources:gravel" - } -} - -for k, v in ipairs { - 100, 75, 50, 25, 1 -} do - unified_inventory.register_craft { - output = "sbz_resources:pebble", - chance = v, - type = "centrifugeing", - items = { - "sbz_resources:gravel" - } - } -end - -sbz_api.register_stateful_machine("sbz_chem:centrifuge", { - description = "Centrifuge", - tiles = { - "centrifuge.png^[verticalframe:12:1", - "centrifuge_side.png", - "centrifuge_side.png", - "centrifuge_side.png", - "centrifuge_side.png", - "centrifuge_side.png", - }, - groups = { matter = 1 }, - -- paramtype2 = "4dir", - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_put = allow_metadata_inventory_put, - - input_inv = "src", - output_inv = "dst", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("src", 1) - inv:set_size("dst", 16) - - meta:set_string("formspec", [[ -formspec_version[7] -size[8.2,9] -style_type[list;spacing=.2;size=.8] -list[context;dst;3.5,0.5;4,4;] -list[context;src;1,2;1,1;] -list[current_player;main;0.2,5;8,4;] -listring[current_player;main]listring[context;src]listring[current_player;main]listring[context;dst]listring[current_player;main] - ]]) - end, - after_place_node = pipeworks.after_place, - after_dig_node = pipeworks.after_dig, - autostate = true, - action = function(pos, _, meta, supply, demand) - local power_needed = 16 - local inv = meta:get_inventory() - - if demand + power_needed > supply then - meta:set_string("infotext", "Not enough power") - return power_needed, false - else - meta:set_string("infotext", "Working...") - - local src = inv:get_list("src") - - local decremented_input = ItemStack(src[1]) - local recipe_outputs = unified_inventory.get_usage_list(src[1]:get_name()) - local outputs = {} - - for _, v in pairs(recipe_outputs or {}) do - if v.type == "centrifugeing" then - if not v.chance or math.random() <= v.chance / 100 then - outputs[#outputs + 1] = ItemStack(v.output) - end - end - end - - if #outputs == 0 then - meta:set_string("infotext", "Invalid/no recipe") - return 0 - end - - - for k, v in ipairs(outputs) do - if not inv:room_for_item("dst", v) then - meta:set_string("infotext", "Full") - -- undo - for kk, vv in ipairs(outputs) do - if kk >= k then break end - inv:remove_item("dst", vv) - end - return 0 - else - inv:add_item("dst", v) - end - end - - decremented_input:take_item(1) - - - inv:set_stack("src", 1, decremented_input) - minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6, pos = pos }) - return power_needed - end - end, -}, { - tiles = { - { name = "centrifuge.png", animation = { type = "vertical_frames", length = 0.6 } }, - "centrifuge_side.png", - "centrifuge_side.png", - "centrifuge_side.png", - "centrifuge_side.png", - "centrifuge_side.png", - }, - light_source = 14, -}) - -core.register_craft { - output = "sbz_chem:centrifuge_off", - recipe = { - { "sbz_chem:iron_ingot", "sbz_chem:iron_ingot", "sbz_chem:iron_ingot" }, - { "sbz_power:simple_charged_field", "sbz_resources:emittrium_circuit", "sbz_power:simple_charged_field" }, - { "sbz_chem:copper_ingot", "sbz_chem:bronze_ingot", "sbz_chem:copper_ingot" } - } -} diff --git a/mods/sbz_power/sbz_chem/compressor.lua b/mods/sbz_power/sbz_chem/compressor.lua deleted file mode 100644 index 7d964392..00000000 --- a/mods/sbz_power/sbz_chem/compressor.lua +++ /dev/null @@ -1,120 +0,0 @@ -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if listname == "dst" then - return 0 - end - return stack:get_count() -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if to_list == "dst" then return 0 end - return count -end - - -sbz_api.register_stateful_machine("sbz_chem:compressor", { - description = "Compressor", - tiles = { - "compressor_side.png", - "compressor_side.png", - "compressor_side.png", - "compressor_side.png", - "compressor_side.png", - "compressor.png^[verticalframe:11:1", - }, - groups = { matter = 1 }, - paramtype2 = "4dir", - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_put = allow_metadata_inventory_put, - - input_inv = "src", - output_inv = "dst", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("src", 4) - inv:set_size("dst", 4) - - meta:set_string("formspec", [[ -formspec_version[7] -size[8.2,9] -style_type[list;spacing=.2;size=.8] -list[current_player;main;0.2,5;8,4;] -list[context;src;1.5,1;2,2;] -listring[] -list[context;dst;4.5,1;2,2;] -listring[current_player;main] -listring[context;dst] - ]]) - end, - after_place_node = pipeworks.after_place, - after_dig_node = pipeworks.after_dig, - autostate = true, - action = function(pos, _, meta, supply, demand) - local power_needed = 20 - local inv = meta:get_inventory() - - if demand + power_needed > supply then - meta:set_string("infotext", "Not enough power") - return power_needed, false - else - meta:set_string("infotext", "Compressing...") - - local src = inv:get_list("src") - - local out, decremented_input, index - for i = 1, 4 do - local recipe_outputs = unified_inventory.get_usage_list(src[i]:get_name()) - local out_inner = ItemStack("") - local input = ItemStack("") - - for _, v in pairs(recipe_outputs or {}) do - if v.type == "compressing" then - out_inner = ItemStack(v.output) - input = ItemStack(v.items[1]) - break - end - end - if not out_inner:is_empty() and (src[i]:get_count() >= input:get_count()) then - out, decremented_input = out_inner, ItemStack(src[i]) - decremented_input:take_item(input:get_count()) - index = i - break - end - end - if out == nil then - meta:set_string("infotext", "Invalid/no recipe") - return 0 - end - - if not inv:room_for_item("dst", out) then - meta:set_string("infotext", "Full") - return 0 - end - - inv:set_stack("src", index, decremented_input) - inv:add_item("dst", out) - minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6, pos = pos }) - return power_needed - end - end, -}, { - tiles = { - "compressor_side.png", - "compressor_side.png", - "compressor_side.png", - "compressor_side.png", - "compressor_side.png", - { name = "compressor.png", animation = { type = "vertical_frames", length = 0.7 } }, - }, - light_source = 10, -}) - - -minetest.register_craft({ - output = "sbz_chem:compressor", - recipe = { - { "sbz_power:simple_charged_field", "sbz_resources:emittrium_circuit", "sbz_power:simple_charged_field" }, - { "sbz_resources:matter_blob", "sbz_resources:matter_plate", "sbz_resources:matter_blob" }, - { "sbz_power:simple_charged_field", "sbz_resources:emittrium_circuit", "sbz_power:simple_charged_field" } - } -}) diff --git a/mods/sbz_power/sbz_chem/crusher.lua b/mods/sbz_power/sbz_chem/crusher.lua deleted file mode 100644 index 8607b947..00000000 --- a/mods/sbz_power/sbz_chem/crusher.lua +++ /dev/null @@ -1,154 +0,0 @@ -for k, v in pairs(sbz_api.crusher_drops) do - unified_inventory.register_craft { - output = v, - type = "crushing", - items = { - "sbz_resources:pebble" - } - } -end - -core.register_craftitem("sbz_chem:enhanced_pebble", { - description = "Enhanced Pebble", - inventory_image = "enhanced_pebble.png", -}) - -for k, v in pairs(sbz_api.crusher_drops_enhanced) do - unified_inventory.register_craft { - output = v, - type = "crushing", - items = { - "sbz_chem:enhanced_pebble" - } - } -end - --- stone -> 2 gravel --- gravel -> 2 sand --- centrifuging sand: 90% chance of 4 Silicon, 10% chance of 1 gold -unified_inventory.register_craft { - output = "sbz_resources:gravel 2", - type = "crushing", - items = { - "sbz_resources:stone" - } -} - -unified_inventory.register_craft { - output = "sbz_resources:sand 2", - type = "crushing", - items = { - "sbz_resources:gravel" - } -} - -sbz_api.register_stateful_machine("sbz_chem:crusher", { - description = "Crusher", - tiles = { - "crusher_top.png^[verticalframe:4:1", - "crusher_side.png" - }, - groups = { matter = 1 }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("output", 16) - - meta:set_string("formspec", [[ -formspec_version[7] -size[8.2,9] -style_type[list;spacing=.2;size=.8] -list[context;output;3.5,0.5;4,4;] -list[context;input;1,2;1,1;] -list[current_player;main;0.2,5;8,4;] -listring[current_player;main]listring[context;input]listring[current_player;main]listring[context;output]listring[current_player;main] -]]) - end, - info_power_consume = 5, - autostate = true, - action = function(pos, node, meta, supply, demand) - local power_needed = 5 - local inv = meta:get_inventory() - - local itemname = inv:get_stack("input", 1):get_name() - - local recipe_outputs = unified_inventory.get_usage_list(itemname) - - - local possible_outputs = {} - - for k, v in pairs(recipe_outputs or {}) do - if v.type == "crushing" then - possible_outputs[#possible_outputs + 1] = v.output - end - end - - if #possible_outputs == 0 then - meta:set_string("infotext", "Inactive") - return 0 - end - - if demand + power_needed > supply then - meta:set_string("infotext", "Not enough power") - return power_needed, false - end - - meta:set_string("infotext", "Crushing...") - inv:remove_item("input", itemname) - minetest.sound_play({ name = "050597_ice-crusher-38522", gain = 0.4 }, { pos = pos }) - - local selected_item = possible_outputs[math.random(1, #possible_outputs)] - - - if inv:room_for_item("output", selected_item) then - inv:add_item("output", selected_item) - else - meta:set_string("infotext", "Output inventory full") - return 0 - end - if itemname == "sbz_resources:pebble" then - if inv:contains_item("output", "sbz_chem:empty_fluid_cell") then - inv:remove_item("output", "sbz_chem:empty_fluid_cell") - if inv:room_for_item("output", "sbz_chem:water_fluid_cell") then - inv:add_item("output", "sbz_chem:water_fluid_cell") - else - minetest.add_item(pos, "sbz_chem:water_fluid_cell") - end - end - end - - return power_needed - end, - input_inv = "input", - output_inv = "output", - --[[ - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "output" then - if stack:get_name() == "sbz_chem:empty_fluid_cell" then - return stack:get_count() - else - return 0 - end - end - return stack:get_count() - end - --]] -}, { - tiles = { - { name = "crusher_top.png", animation = { type = "vertical_frames", length = 0.5 } }, - "crusher_side.png" - }, - light_source = 3, -}) - - -minetest.register_craft({ - output = "sbz_chem:crusher", - recipe = { - { "sbz_power:simple_charged_field", "sbz_resources:antimatter_dust", "sbz_power:simple_charged_field" }, - { "sbz_resources:matter_blob", "sbz_resources:stone", "sbz_resources:matter_blob" }, - { "sbz_power:simple_charged_field", "sbz_resources:matter_blob", "sbz_power:simple_charged_field" } - } -}) diff --git a/mods/sbz_power/sbz_chem/crystal_grower.lua b/mods/sbz_power/sbz_chem/crystal_grower.lua deleted file mode 100644 index bd2e3fe2..00000000 --- a/mods/sbz_power/sbz_chem/crystal_grower.lua +++ /dev/null @@ -1,148 +0,0 @@ -unified_inventory.register_craft { - type = "crystal_growing", - output = "sbz_resources:warp_crystal", - items = { "sbz_bio:warpshroom 9" } -} - -core.register_craftitem("sbz_chem:uranium_crystal", { - description = "Uranium Crystal", - inventory_image = "uranium_crystal.png", -}) - -unified_inventory.register_craft { - type = "crystal_growing", - output = "sbz_chem:uranium_crystal", - items = { "sbz_chem:uranium_ingot 4" } -} - -core.register_craftitem("sbz_chem:thorium_crystal", { - description = "Thorium Crystal", - inventory_image = "thorium_crystal.png", -}) -unified_inventory.register_craft { - type = "crystal_growing", - output = "sbz_chem:thorium_crystal", - items = { "sbz_chem:thorium_ingot 4" } -} - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if listname == "dst" then - return 0 - end - return stack:get_count() -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if to_list == "dst" then return 0 end - return count -end - - -sbz_api.register_stateful_machine("sbz_chem:crystal_grower", { - description = "Crystal Grower", - info_extra = "Be aware, consumes high amounts of power!", - tiles = { - "crystal_grower_side.png", - "crystal_grower_side.png", - "crystal_grower_side.png", - "crystal_grower_side.png", - "crystal_grower_side.png", - "crystal_grower.png^[verticalframe:17:1", - }, - groups = { matter = 1 }, - paramtype2 = "4dir", - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_put = allow_metadata_inventory_put, - - input_inv = "src", - output_inv = "dst", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("src", 4) - inv:set_size("dst", 4) - - meta:set_string("formspec", [[ -formspec_version[7] -size[8.2,9] -style_type[list;spacing=.2;size=.8] -list[current_player;main;0.2,5;8,4;] -list[context;src;1.5,1;2,2;] -listring[] -list[context;dst;4.5,1;2,2;] -listring[current_player;main] -listring[context;dst] - ]]) - end, - after_place_node = pipeworks.after_place, - after_dig_node = pipeworks.after_dig, - autostate = true, - action = function(pos, _, meta, supply, demand) - local power_needed = 120 - local inv = meta:get_inventory() - - if demand + power_needed > supply then - meta:set_string("infotext", "Not enough power") - return power_needed, false - else - meta:set_string("infotext", "Growing...") - - local src = inv:get_list("src") - - local out, decremented_input, index - for i = 1, 4 do - local recipe_outputs = unified_inventory.get_usage_list(src[i]:get_name()) - local out_inner = ItemStack("") - local input = ItemStack("") - - for _, v in pairs(recipe_outputs or {}) do - if v.type == "crystal_growing" then - out_inner = ItemStack(v.output) - input = ItemStack(v.items[1]) - break - end - end - if not out_inner:is_empty() and (src[i]:get_count() >= input:get_count()) then - out, decremented_input = out_inner, ItemStack(src[i]) - decremented_input:take_item(input:get_count()) - index = i - break - end - end - if out == nil then - meta:set_string("infotext", "Invalid/no recipe") - return 0 - end - - if not inv:room_for_item("dst", out) then - meta:set_string("infotext", "Full") - return 0 - end - - inv:set_stack("src", index, decremented_input) - inv:add_item("dst", out) - minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6, pos = pos }) - return power_needed - end - end, -}, { - tiles = { - "crystal_grower_side.png", - "crystal_grower_side.png", - "crystal_grower_side.png", - "crystal_grower_side.png", - "crystal_grower_side.png", - { name = "crystal_grower.png", animation = { type = "vertical_frames", length = 2 } }, - }, - light_source = 14, -}) - - -minetest.register_craft({ - output = "sbz_chem:crystal_grower", - recipe = { - { "sbz_resources:stone", "sbz_meteorites:antineutronium", "sbz_resources:stone" }, - { "sbz_resources:reinforced_matter", "sbz_meteorites:neutronium", "sbz_resources:reinforced_matter" }, - { "sbz_resources:stone", "sbz_chem:titanium_block", "sbz_resources:stone" }, - } -}) diff --git a/mods/sbz_power/sbz_chem/decay_accel.lua b/mods/sbz_power/sbz_chem/decay_accel.lua deleted file mode 100644 index 3026f675..00000000 --- a/mods/sbz_power/sbz_chem/decay_accel.lua +++ /dev/null @@ -1,94 +0,0 @@ -sbz_api.register_stateful_machine("sbz_chem:decay_accel", { - description = "Decay Accelerator", - tiles = { - "decay_accel.png", - "decay_accel.png", - "decay_accel.png", - "decay_accel.png", - "decay_accel.png", - "decay_accel_front.png", - }, - groups = { matter = 1 }, - info_extra = "It doesn't just accelerate decay, it may throw in some neutrons.", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("output", 16) - - meta:set_string("formspec", [[ -formspec_version[7] -size[8.2,9] -style_type[list;spacing=.2;size=.8] -list[context;output;3.5,0.5;4,4;] -list[context;input;1,2;1,1;] -list[current_player;main;0.2,5;8,4;] -listring[current_player;main]listring[context;input]listring[current_player;main]listring[context;output]listring[current_player;main] -]]) - end, - info_power_consume = 64, - autostate = true, - action = function(pos, node, meta, supply, demand) - local power_needed = 64 - local inv = meta:get_inventory() - - local itemname = inv:get_stack("input", 1):get_name() - - local recipe_outputs = unified_inventory.get_usage_list(itemname) - - - local possible_outputs = {} - - for k, v in pairs(recipe_outputs or {}) do - if v.type == "decay_accelerating" then - possible_outputs[#possible_outputs + 1] = v.output - end - end - - if #possible_outputs == 0 then - meta:set_string("infotext", "Inactive") - return 0 - end - - if demand + power_needed > supply then - meta:set_string("infotext", "Not enough power") - return power_needed, false - end - - meta:set_string("infotext", "Active") - - local selected_item = possible_outputs[math.random(1, #possible_outputs)] - - - if inv:room_for_item("output", selected_item) then - inv:remove_item("input", itemname) - inv:add_item("output", selected_item) - return power_needed - else - meta:set_string("infotext", "Output inventory full") - return 0 - end - end, - input_inv = "input", - output_inv = "output", -}, { - tiles = { - "decay_accel.png", - "decay_accel.png", - "decay_accel.png", - "decay_accel.png", - "decay_accel.png", - { name = "decay_accel_front_on.png", animation = { type = "vertical_frames", length = 1 } }, - }, - light_source = 14, -}) - - -minetest.register_craft({ - output = "sbz_chem:decay_accel_off", - recipe = { - { "sbz_chem:uranium_crystal", "sbz_resources:matter_blob", "sbz_chem:thorium_crystal" }, - { "sbz_resources:reinforced_matter", "", "sbz_resources:reinforced_matter" }, - { "sbz_resources:phlogiston_circuit", "sbz_meteorites:neutronium", "sbz_resources:phlogiston_circuit" } - } -}) diff --git a/mods/sbz_power/sbz_chem/decay_chains.lua b/mods/sbz_power/sbz_chem/decay_chains.lua deleted file mode 100644 index 1db7a571..00000000 --- a/mods/sbz_power/sbz_chem/decay_chains.lua +++ /dev/null @@ -1,21 +0,0 @@ ---[[ -Recipes for the decay accelerator -Currently, just used to make plutonium -If you want to add more, feel free to do so :D -]] - -unified_inventory.register_craft_type("decay_accelerating", { - description = "Decay Accelerating", - icon = "decay_accel_front.png", - width = 1, - height = 1, - uses_crafting_grid = false, -}) - -unified_inventory.register_craft { - output = "sbz_chem:plutonium_powder", - type = "decay_accelerating", - items = { - "sbz_chem:uranium_powder" - } -} diff --git a/mods/sbz_power/sbz_chem/elements.lua b/mods/sbz_power/sbz_chem/elements.lua deleted file mode 100644 index 895e0641..00000000 --- a/mods/sbz_power/sbz_chem/elements.lua +++ /dev/null @@ -1,303 +0,0 @@ -unified_inventory.register_craft_type("crushing", { - description = "Crushing", - icon = "crusher_top.png^[verticalframe:4:1", - width = 1, - height = 1, - uses_crafting_grid = false, -}) - -unified_inventory.register_craft_type("alloying", { - description = "Alloying", - icon = "simple_alloy_furnace.png^[verticalframe:13:1", - width = 2, - height = 1, - uses_crafting_grid = false, -}) - -unified_inventory.register_craft_type("compressing", { - description = "Compressing", - icon = "compressor.png^[verticalframe:11:1", - width = 1, - height = 1, - uses_crafting_grid = false, -}) - -unified_inventory.register_craft_type("crystal_growing", { - description = "(Crystal) Growing", - icon = "crystal_grower.png^[verticalframe:17:1", - width = 1, - height = 1, - uses_crafting_grid = false, -}) - -sbz_api.crusher_drops = {} -sbz_api.crusher_drops_enhanced = {} -sbz_api.unused_chem = {} - -sbz_api.register_element = function(name, color, description, def) - def = def or {} - local disabled, part_of_crusher_drops, radioactive = def.disabled, def.part_of_crusher_drops, def.radioactive - if disabled == nil then disabled = false end - local disabled_group = disabled and 1 or nil - core.register_craftitem("sbz_chem:" .. name .. "_powder", { - groups = { chem_element = 1, powder = 1, not_in_creative_inventory = disabled_group, chem_disabled = disabled_group, radioactive = radioactive }, - description = string.format(description, "Powder"), - inventory_image = "powder.png^[colorize:" .. color .. ":150" - }) - core.register_craftitem("sbz_chem:" .. name .. "_ingot", { - groups = { chem_element = 1, ingot = 1, not_in_creative_inventory = disabled_group, chem_disabled = disabled_group, radioactive = radioactive }, - description = string.format(description, "Ingot"), - inventory_image = "ingot.png^[multiply:" .. color --[[.. ":150"]], - - }) - - core.register_node("sbz_chem:" .. name .. "_block", unifieddyes.def { - groups = { - chem_element = 1, - chem_block = 1, - not_in_creative_inventory = disabled_group, - chem_disabled = disabled_group, - matter = 1, - level = 2, - explody = 100, - radioactive = radioactive, - }, - description = string.format(description, "Block"), - tiles = { "block.png^[colorize:" .. color .. ":150" }, - sounds = sbz_api.sounds.metal() - }) - - - -- fluid - if def.fluid then - core.register_node(("sbz_chem:%s_fluid_source"):format(name), { - description = description:format("Fluid Source"), - drawtype = "liquid", - tiles = { - { name = ("flowing_chemical_source.png^[multiply:%s"):format(color), backface_culling = false, }, - { name = ("flowing_chemical_source.png^[multiply:%s"):format(color), backface_culling = true, } - }, - inventory_image = minetest.inventorycube(("flowing_chemical_source.png^[multiply:%s"):format(color)), - use_texture_alpha = "blend", - groups = { - liquid = 3, - habitat_conducts = 1, - transparent = 1, - liquid_capturable = 1, - water = 0, - not_in_creative_inventory = disabled_group, - chem_disabled = disabled_group, - chem_fluid = 1, - chem_fluid_source = 1, - chem_element = 1, - radioactive = (radioactive or 0) * 2, - hot = 50, - }, - post_effect_color = color .. "7F", - paramtype = "light", - walkable = false, - pointable = false, - buildable_to = true, - liquidtype = "source", - liquid_alternative_source = ("sbz_chem:%s_fluid_source"):format(name), - liquid_alternative_flowing = ("sbz_chem:%s_fluid_flowing"):format(name), - drop = "", - liquid_viscosity = 7, - liquid_renewable = false, - sbz_node_damage = { - matter = 5, -- 5hp/second - }, - light_source = 14, - liquid_range = 2, - chem_block_form = "sbz_chem:" .. name .. "_block" - }) - - local animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 8, - } - - minetest.register_node(("sbz_chem:%s_fluid_flowing"):format(name), { - description = description:format("Fluid Flowing"), - drawtype = "flowingliquid", - tiles = { { name = ("flowing_chemical_source.png^[multiply:%s"):format(color), } }, - special_tiles = { - { - name = ("flowing_chemical.png^[multiply:%s"):format(color), - backface_culling = false, - animation = animation, - }, - { - name = ("flowing_chemical.png^[multiply:%s"):format(color), - backface_culling = true, - animation = animation, - } - }, - use_texture_alpha = "blend", - groups = { - liquid = 3, - habitat_conducts = 1, - transparent = 1, - not_in_creative_inventory = 1, - water = 0, - hot = 10, - chem_disabled = disabled_group, - chem_fluid = 1, - chem_fluid_source = 0, - radioactive = radioactive - }, - post_effect_color = color .. "7F", - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - buildable_to = true, - liquidtype = "flowing", - liquid_alternative_source = ("sbz_chem:%s_fluid_source"):format(name), - liquid_alternative_flowing = ("sbz_chem:%s_fluid_flowing"):format(name), - drop = "", - liquid_viscosity = 7, - sbz_node_damage = { - matter = 3, -- 3hp/second - }, - liquid_renewable = false, - light_source = 14, - liquid_range = 2, - chem_block_form = "sbz_chem:" .. name .. "_block", - - }) - - sbz_api.register_fluid_cell(("sbz_chem:%s_fluid_cell"):format(name), { - description = description:format("Fluid Cell"), - groups = { - chem_disabled = disabled_group, - chem_fluid_cell = 1, - chem_fluid_source = 0, - not_in_creative_inventory = disabled_group, - } - }, ("sbz_chem:%s_fluid_source"):format(name), color) - end - if not disabled then - stairs.register("sbz_chem:" .. name .. "_block") - minetest.register_craft({ - type = "cooking", - output = "sbz_chem:" .. name .. "_ingot", - recipe = "sbz_chem:" .. name .. "_powder", - }) - unified_inventory.register_craft { - type = "crushing", - output = "sbz_chem:" .. name .. "_powder", - items = { "sbz_chem:" .. name .. "_ingot" } - } - - unified_inventory.register_craft { - type = "compressing", - output = "sbz_chem:" .. name .. "_block", - items = { "sbz_chem:" .. name .. "_powder 9" } - } - unified_inventory.register_craft { - type = "compressing", - output = "sbz_chem:" .. name .. "_block", - items = { "sbz_chem:" .. name .. "_ingot 9" } - } - - unified_inventory.register_craft { - type = "crushing", - output = "sbz_chem:" .. name .. "_powder 9", - items = { "sbz_chem:" .. name .. "_block" } - } - - if part_of_crusher_drops == nil or part_of_crusher_drops == true then - sbz_api.crusher_drops[#sbz_api.crusher_drops + 1] = "sbz_chem:" .. name .. "_powder" - sbz_api.crusher_drops_enhanced[#sbz_api.crusher_drops_enhanced + 1] = "sbz_chem:" .. name .. "_powder" - elseif def.part_of_enhanced_drops == true then - sbz_api.crusher_drops_enhanced[#sbz_api.crusher_drops_enhanced + 1] = "sbz_chem:" .. name .. "_powder" - end - else - sbz_api.unused_chem[#sbz_api.unused_chem + 1] = "sbz_chem:" .. name - end -end - -minetest.after(0, function() - for k, v in pairs(sbz_api.unused_chem) do - local powder = v .. "_powder" - local ingot = v .. "_ingot" - if unified_inventory.get_recipe_list(powder) then - minetest.log( - "This chemical: " .. - powder .. - " is disabled, and shouldn't have any use.. right... but it has!!! \n details: " .. - dump(unified_inventory.get_recipe_list(powder))) - end - if unified_inventory.get_recipe_list(ingot) then - minetest.log( - "This chemical: " .. - ingot .. - " is disabled, and shouldn't have any use.. right... but it has!!! \n details: " .. - dump(unified_inventory.get_recipe_list(ingot))) - end - end -end) - -sbz_api.register_element("gold", "#FFD700", "Gold %s (Au)", - { part_of_crusher_drops = false, part_of_enhanced_drops = true }) -sbz_api.register_element("silver", "#C0C0C0", "Silver %s (Ag)", - { part_of_crusher_drops = false, part_of_enhanced_drops = true }) -sbz_api.register_element("iron", "#B7410E", "Iron %s (Fe)", { fluid = 1 }) -sbz_api.register_element("copper", "#B87333", "Copper %s (Cu)") -sbz_api.register_element("aluminum", "#A9A9A9", "Aluminum %s (Al)") -sbz_api.register_element("tin", "#D2B48C", "Tin %s (Sn)") -sbz_api.register_element("nickel", "#88c6cc", "Nickel %s (Ni)", { fluid = 1 }) -sbz_api.register_element("cobalt", "#0047AB", "Cobalt %s (Co)", - { part_of_crusher_drops = false, part_of_enhanced_drops = true, fluid = 1 }) -sbz_api.register_element("titanium", "#4A2A2A", "Titanium %s (Ti)", - { part_of_crusher_drops = false, part_of_enhanced_drops = true }) -sbz_api.register_element("lithium", "#c8a4db", "Lithium %s (Li)", - { part_of_crusher_drops = false, part_of_enhanced_drops = true }) -sbz_api.register_element("silicon", "#5ba082", "Silicon %s (Si)", - { part_of_crusher_drops = false, part_of_enhanced_drops = true, fluid = 1 }) --- alloys - -sbz_api.register_element("bronze", "#CD7F32", "Bronze %s (CuSn)", { part_of_crusher_drops = false }) -sbz_api.register_element("invar", "#808080", "Invar %s (FeNi)", { part_of_crusher_drops = false }) -sbz_api.register_element("titanium_alloy", "#B0C4DE", "Titanium Alloy %s (TiAl)", { part_of_crusher_drops = false }) - --- RADIOACTIVE TECH - -sbz_api.register_element("thorium", "#d633af", "Thorium %s (Th)", - { part_of_crusher_drops = false, radioactive = 1, part_of_enhanced_drops = true }) -sbz_api.register_element("uranium", "#47681e", "Uranium %s (U)", - { part_of_crusher_drops = false, radioactive = 2, part_of_enhanced_drops = true }) -sbz_api.register_element("plutonium", "#1d2aba", "Plutonium %s (Pu)", { part_of_crusher_drops = false, radioactive = 5 }) - --- disabled tech -sbz_api.register_element("lead", "#6E6E6E", "Lead %s (Pb)", { disabled = true }) -sbz_api.register_element("zinc", "#7F7F7F", "Zinc %s (Zn)", { disabled = true }) -sbz_api.register_element("platinum", "#E5E4E2", "Platinum %s (Pt)", { disabled = true }) -sbz_api.register_element("mercury", "#B5B5B5", "Mercury %s (Hg)", { disabled = true }) -sbz_api.register_element("magnesium", "#DADADA", "Magnesium %s (Mg)", { disabled = true }) -sbz_api.register_element("calcium", "#F5F5DC", "Calcium %s (Ca)", { disabled = true }) -sbz_api.register_element("sodium", "#F4F4F4", "Sodium %s (Na)", { disabled = true }) - --- disabled alloys -sbz_api.register_element("white_gold", "#E5E4E2", "White Gold %s (AuNi)", - { disabled = true, part_of_crusher_drops = false }) -sbz_api.register_element("brass", "#B5A642", "Brass %s (CuZn)", { disabled = true, part_of_crusher_drops = false }) - -core.register_abm { - label = "Freeze liquid metals (group:cold>=1 contacting them)", - nodenames = { "group:chem_fluid" }, - neighbors = { "group:cold" }, - interval = 6, - chance = 6, - catch_up = false, - action = function(pos, node) - if core.get_item_group(node.name, "chem_fluid_source") == 0 then - core.set_node(pos, { name = "sbz_resources:stone" }) - elseif core.registered_nodes[node.name].chem_block_form then - core.set_node(pos, { name = core.registered_nodes[node.name].chem_block_form }) - end - end, -} diff --git a/mods/sbz_power/sbz_chem/fluids.lua b/mods/sbz_power/sbz_chem/fluids.lua deleted file mode 100644 index 7a2b942b..00000000 --- a/mods/sbz_power/sbz_chem/fluids.lua +++ /dev/null @@ -1,92 +0,0 @@ -sbz_api.sources2fluid_cells = {} -sbz_api.fluid_cells2sources = {} -local empty_cell = "sbz_chem:empty_fluid_cell" - -function sbz_api.register_fluid_cell(name, def, source_name, cellcolor) - sbz_api.sources2fluid_cells[source_name] = name - sbz_api.fluid_cells2sources[name] = source_name - def.liquids_pointable = true - def.groups = def.groups or {} - def.groups.chem_element = 1 - if cellcolor then - def.inventory_image = "fluid_cell.png^[fill:1x4:6,5:" .. cellcolor - end - def.on_place = function(itemstack, user, pointed) - if pointed.type ~= "node" then return end - local _, pos = minetest.item_place_node(ItemStack(source_name), user, pointed) - if pos then - itemstack:take_item() - if itemstack:is_empty() then return ItemStack(empty_cell) end - local inv = user:get_inventory() - if inv:room_for_item("main", empty_cell) then - inv:add_item("main", empty_cell) - else - minetest.add_item(user:get_pos(), empty_cell) - end - return itemstack - end - minetest.item_place(ItemStack("sbz_resources:matter_dust"), user, pointed) -- this is to handle callbacks - idealist - end - minetest.register_craftitem(name, def) -end - --- Empty -minetest.register_craftitem(empty_cell, { - description = "Empty Fluid Cell (Empty)", - inventory_image = "fluid_cell.png", - liquids_pointable = true, - groups = { chem_element = 1 }, - on_place = function(itemstack, user, pointed) - if pointed.type ~= "node" then return end - local node = minetest.get_node(pointed.under) - local fluid_cell = sbz_api.sources2fluid_cells[node.name] - if fluid_cell then - minetest.remove_node(pointed.under) - itemstack:take_item() - if itemstack:is_empty() then return ItemStack(fluid_cell) end - local inv = user:get_inventory() - if inv:room_for_item("main", fluid_cell) then - inv:add_item("main", fluid_cell) - else - minetest.add_item(user:get_pos(), fluid_cell) - end - return itemstack - end - minetest.item_place(ItemStack("sbz_resources:matter_dust"), user, pointed) - end -}) - -minetest.register_craft({ - output = empty_cell, - recipe = { - { "", "sbz_resources:pebble", "" }, - { "sbz_resources:pebble", "", "sbz_resources:pebble" }, - { "", "sbz_resources:pebble", "" } - } -}) - -sbz_api.register_fluid_cell("sbz_chem:water_fluid_cell", { - description = "Water Fluid Cell (H₂O)", -}, "sbz_resources:water_source", "#87CEEB") ---[[ --- Water (H₂O) -minetest.register_craftitem("sbz_chem:water_fluid_cell", { - description = "Water Fluid Cell (H₂O)", - inventory_image = "fluid_cell.png^[fill:1x4:6,5:#87CEEB", - on_place = function(itemstack, user, pointed) - local _, pos = minetest.item_place_node(ItemStack("sbz_resources:water_source"), user, pointed) - if pos then - itemstack:take_item() - if itemstack:is_empty() then return ItemStack(empty_cell) end - local inv = user:get_inventory() - if inv:room_for_item("main", empty_cell) then - inv:add_item("main", empty_cell) - else - minetest.add_item(user:get_pos(), empty_cell) - end - return itemstack - end - minetest.item_place(ItemStack("sbz_resources:matter_dust"), user, pointed) - end -}) ---]] diff --git a/mods/sbz_power/sbz_chem/hpef.lua b/mods/sbz_power/sbz_chem/hpef.lua deleted file mode 100644 index 0d34996d..00000000 --- a/mods/sbz_power/sbz_chem/hpef.lua +++ /dev/null @@ -1,112 +0,0 @@ --- theese allow_metadata_* functions were taken from the mtg furnace -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if listname == "dst" then - return 0 - end - return stack:get_count() -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if to_list == "dst" then return 0 end - return count -end - - -sbz_api.register_stateful_machine("sbz_chem:high_power_electric_furnace", { - description = "High Power Electric Furnace", - tiles = { - "hpef_top.png", - "hpef_top.png", - "hpef_top.png", - "hpef_top.png", - "hpef_top.png", - "hpef_front_off.png", - }, - groups = { matter = 1 }, - paramtype2 = "4dir", - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_put = allow_metadata_inventory_put, - - input_inv = "src", - output_inv = "dst", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("src", 4) - inv:set_size("dst", 4) - - meta:set_string("formspec", [[ -formspec_version[7] -size[8.2,9] -style_type[list;spacing=.2;size=.8] -list[current_player;main;0.2,5;8,4;] -list[context;src;1.5,1;2,2;] -listring[] -list[context;dst;4.5,1;2,2;] -listring[current_player;main] -listring[context;dst] - ]]) - end, - after_place_node = pipeworks.after_place, - autostate = true, - action = function(pos, node, meta, supply, demand) - local power_needed = 15 - local inv = meta:get_inventory() - - if demand + power_needed > supply then - meta:set_string("infotext", "Not enough power") - return power_needed, false - else - meta:set_string("infotext", "Smelting...") - - local src = inv:get_list("src") - - local out, decremented_input, index - for i = 1, 4 do - local out_inner, decremented_input_inner = minetest.get_craft_result({ - method = "cooking", - width = 1, - items = { src[i] }, - }) - if not out_inner.item:is_empty() then - out, decremented_input = out_inner, decremented_input_inner - index = i - break - end - end - if out == nil then - meta:set_string("infotext", "Invalid/no recipe") - return 0 - end - - if not inv:room_for_item("dst", out.item) then - meta:set_string("infotext", "Full") - return 0 - end - - inv:set_stack("src", index, decremented_input.items[1]) - inv:add_item("dst", out.item) - minetest.sound_play({ name = "simple_alloy_furnace_running", gain = 0.6, pos = pos }) - return power_needed - end - end, -}, { - tiles = { - "hpef_top.png", - "hpef_top.png", - "hpef_top.png", - "hpef_top.png", - "hpef_top.png", - { name = "hpef_front.png", animation = { type = "vertical_frames", length = 0.7 } }, - }, - light_source = 10, -}) - -minetest.register_craft({ - output = "sbz_chem:high_power_electric_furnace", - recipe = { - { "sbz_power:simple_charged_field", "sbz_resources:matter_dust", "sbz_power:simple_charged_field" }, - { "sbz_resources:matter_blob", "sbz_resources:emittrium_circuit", "sbz_resources:matter_blob" }, - { "sbz_power:simple_charged_field", "sbz_resources:matter_blob", "sbz_power:simple_charged_field" } - } -}) diff --git a/mods/sbz_power/sbz_chem/init.lua b/mods/sbz_power/sbz_chem/init.lua deleted file mode 100644 index 413e0ae6..00000000 --- a/mods/sbz_power/sbz_chem/init.lua +++ /dev/null @@ -1,15 +0,0 @@ -local modpath = minetest.get_modpath("sbz_chem") - -dofile(modpath .. "/fluids.lua") -dofile(modpath .. "/elements.lua") -dofile(modpath .. "/radiation.lua") -dofile(modpath .. "/centrifuge.lua") -dofile(modpath .. "/crusher.lua") -dofile(modpath .. "/alloy_furnace.lua") -dofile(modpath .. "/hpef.lua") -dofile(modpath .. "/compressor.lua") -dofile(modpath .. "/crystal_grower.lua") -dofile(modpath .. "/reactor.lua") -dofile(modpath .. "/pebble_enhancer.lua") -dofile(modpath .. "/decay_chains.lua") -dofile(modpath .. "/decay_accel.lua") diff --git a/mods/sbz_power/sbz_chem/mod.conf b/mods/sbz_power/sbz_chem/mod.conf deleted file mode 100644 index d261ab0d..00000000 --- a/mods/sbz_power/sbz_chem/mod.conf +++ /dev/null @@ -1,2 +0,0 @@ -name = sbz_chem -depends = sbz_base, sbz_power, sbz_resources, unified_inventory, stairs \ No newline at end of file diff --git a/mods/sbz_power/sbz_chem/pebble_enhancer.lua b/mods/sbz_power/sbz_chem/pebble_enhancer.lua deleted file mode 100644 index 801ad78a..00000000 --- a/mods/sbz_power/sbz_chem/pebble_enhancer.lua +++ /dev/null @@ -1,67 +0,0 @@ -sbz_api.register_stateful_machine("sbz_chem:pebble_enhancer", { - description = "Pebble Enhancer", - info_extra = "Shiny, potentially radioactive pebbles.", - tiles = { - "pebble_enhancer_top.png", - "pebble_enhancer_side.png" - }, - groups = { matter = 1, weak_radioactive = 80 }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("output", 16) - - meta:set_string("formspec", [[ -formspec_version[7] -size[8.2,9] -style_type[list;spacing=.2;size=.8] -list[context;output;3.5,0.5;4,4;] -list[context;input;1,2;1,1;] -list[current_player;main;0.2,5;8,4;] -listring[current_player;main]listring[context;input]listring[current_player;main]listring[context;output]listring[current_player;main] -]]) - end, - info_power_consume = 128, - autostate = true, - action = function(pos, node, meta, supply, demand) - local power_needed = 128 - local inv = meta:get_inventory() - - local itemname = inv:get_stack("input", 1):get_name() - - if demand + power_needed > supply then - meta:set_string("infotext", "Not enough power") - return power_needed, false - end - - if itemname == "sbz_resources:pebble" and inv:room_for_item("output", "sbz_chem:enhanced_pebble") then - inv:remove_item("input", itemname) - inv:add_item("output", "sbz_chem:enhanced_pebble") - meta:set_string("infotext", "Enhancing...") - return power_needed - end - meta:set_string("infotext", "Inactive") - return 0 - end, - input_inv = "input", - output_inv = "output", -}, { - tiles = { - { name = "pebble_enhancer_top_on.png", animation = { type = "vertical_frames", length = 0.5 } }, - "pebble_enhancer_side.png" - }, - light_source = 14, -}) - - - -minetest.register_craft({ - output = "sbz_chem:pebble_enhancer", - recipe = { - { "sbz_chem:uranium_crystal", "sbz_chem:uranium_crystal", "sbz_chem:uranium_crystal", }, - { "sbz_resources:matter_blob", "sbz_resources:phlogiston_circuit", "sbz_resources:matter_blob" }, - { "sbz_chem:thorium_crystal", "sbz_chem:thorium_crystal", "sbz_chem:thorium_crystal", } - } -}) diff --git a/mods/sbz_power/sbz_chem/radiation.lua b/mods/sbz_power/sbz_chem/radiation.lua deleted file mode 100644 index a99e9dc2..00000000 --- a/mods/sbz_power/sbz_chem/radiation.lua +++ /dev/null @@ -1,400 +0,0 @@ ---[[ - This file contains code from https://github.com/minetest-mods/technic/blob/3bece9cec5807a73dc764bdf43ad0d1d3441904e/technic/radiation.lua#L202 - The code has been modified. - License: - Minetest Mod: technic - Copyright (C) 2012-2022 RealBadAngel and contributors - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -]] - ---[[ -#DOCS -implements functions to groups: radioactive, weak_radioactive -weak_radioactive is 100 times weaker than the radioactive group -the radiation group's strength is the same as technic's radiation strength -]] - ---[[ -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 meter 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. ---]] - -local rad_resistance_node = {} -local rad_resistance_group = { - charged_field = 512, -} - -local cache_radiation_resistance = {} - -local function node_radiation_resistance(node_name) - local resistance = cache_radiation_resistance[node_name] - if resistance then - return resistance - end - local def = minetest.registered_nodes[node_name] - if not def then - cache_radiation_resistance[node_name] = 0 - return 0 - end - resistance = def.radiation_resistance or - rad_resistance_node[node_name] - if not resistance then - resistance = 0 - for g, v in pairs(def.groups) do - if v > 0 and rad_resistance_group[g] then - resistance = resistance + rad_resistance_group[g] - end - end - end - resistance = math.sqrt(resistance) - cache_radiation_resistance[node_name] = resistance - return resistance -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), which is -the maximum distance one can get from the node center 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 from a node at which an unshielded -player will be damaged by 1 HP/s. Or, equivalently, it is the square -root of the damage rate in HP/s that an unshielded player one node -away will take. - -Shielding is assessed by adding the shielding values of all nodes -between the source node and the player, ignoring the source node itself. -As in reality, shielding causes exponential attenuation of radiation. -However, the effect is scaled down relative to real life. A node with -radiation resistance value R yields attenuation of sqrt(R) * 0.1 nepers. -(In real life it would be about R * 0.69 nepers, by the definition -of the radiation resistance values.) The sqrt part of this formula -scales down the differences between shielding types, reflecting the -game's simplification of making expensive materials such as gold -readily available in cubes. The multiplicative factor in the -formula scales down the difference between shielded and unshielded -safe distances, avoiding the latter becoming impractically large. - -Damage is processed at rates down to 0.2 HP/s, which in the absence of -shielding is attained at the distance specified by the "radioactive" -group value. Computed damage rates below 0.2 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 abdomen_offset = 1 -local rad_dmg_cutoff = 0.2 - -local function apply_fractional_damage(o, dmg) - local dmg_int = math.floor(dmg) - -- The closer you are to getting one more damage point, - -- the more likely it will be added. - if math.random() < dmg - dmg_int then - dmg_int = dmg_int + 1 - end - if dmg_int > 0 then - local new_hp = math.max(o:get_hp() - dmg_int, 0) - o:set_hp(new_hp) - return new_hp == 0 - end - return false -end - -local function calculate_base_damage(node_pos, object_pos, strength) - local shielding = 0 - local dist = vector.distance(node_pos, object_pos) - - for ray_pos in Raycast(node_pos, vector.multiply(vector.direction(node_pos, object_pos), dist), false, false) do - ray_pos = ray_pos.under - local shield_name = minetest.get_node(ray_pos).name - shielding = shielding + node_radiation_resistance(shield_name) * 0.025 - end - - local dmg = (strength * strength) / - (math.max(0.75, dist * dist) * math.exp(shielding)) - - if dmg < rad_dmg_cutoff then return end - return dmg -end - -local function calculate_damage_multiplier(object) - local ag = object.get_armor_groups and object:get_armor_groups() - if not ag then - return 0 - end - if ag.immortal then - return 0 - end - if ag.light then - return 0.01 * ag.light - end - return 0 -end - -local function calculate_object_center(object) - if object:is_player() then - return { x = 0, y = abdomen_offset, z = 0 } - end - return { x = 0, y = 0, z = 0 } -end - -local function dmg_object(pos, object, strength) - local obj_pos = vector.add(object:get_pos(), calculate_object_center(object)) - local mul - -- we need to check may the object be damaged even if armor is disabled - mul = calculate_damage_multiplier(object) - if mul == 0 then - return - end - - local dmg = calculate_base_damage(pos, obj_pos, strength) - if not dmg then - return - end - dmg = dmg * mul - apply_fractional_damage(object, dmg) -end - -local rad_dmg_mult_sqrt = math.sqrt(1 / rad_dmg_cutoff) -local function dmg_abm(pos, node) - local strength = - minetest.get_item_group(node.name, "radioactive") + - (minetest.get_item_group(node.name, "weak_radioactive") / 100) - local max_dist = strength * rad_dmg_mult_sqrt - for _, o in pairs(minetest.get_objects_inside_radius(pos, - max_dist + abdomen_offset)) do - if (o:is_player()) and o:get_hp() > 0 then - dmg_object(pos, o, strength) - end - end -end - -if minetest.settings:get_bool("enable_damage") then - minetest.register_abm({ - label = "Radiation damage", - nodenames = { "group:radioactive" }, - interval = 1, - chance = 1, - action = dmg_abm, - }) - minetest.register_abm({ - label = "Radiation damage (Weak, mostly radon)", - nodenames = { "group:weak_radioactive" }, - interval = 1, - chance = 3, - action = dmg_abm, - }) -end - - --- RADON!!! -core.register_node("sbz_chem:radon", { - description = "radon", - drawtype = "glasslike", - paramtype = "light", - drops = "", - tiles = { "radon.png" }, - light_source = 10, - use_texture_alpha = "blend", - diggable = false, - groups = { not_in_creative_inventory = 1, habitat_conducts = 1, explody = 10000, weak_radioactive = 50, }, - sunlight_propagates = true, - post_effect_color = "#6abe3032", - walkable = false, - buildable_to = true, - pointable = false, - is_ground_content = true, - air = true, - air_equivalent = true, -- deprecated - floodable = true, -}) - --- 20% chance of going away each move if not surrounded by radioactivity -core.register_abm({ - label = "Radon gas move", - nodenames = { "sbz_chem:radon" }, - neighbors = { "air", "group:airlike" }, - interval = 1, - chance = 1, - action = function(spos, node) - local should_go_away_with_chance = true - local air_nodes = sbz_api.filter_node_neighbors(spos, 1, function(pos) - local nn = core.get_node(pos).name - if core.get_item_group(nn, "radioactive") > 0 or core.get_item_group(nn, "weak_radioactive") > 0 then - should_go_away_with_chance = false - end - if core.get_item_group(nn, "airlike") == 1 or nn == "air" then - return pos - end - end, false) - local num_airnodes = #air_nodes - if num_airnodes == 0 then return false end - local swap_pos = air_nodes[math.random(1, num_airnodes)] - if (not should_go_away_with_chance) or (math.random() <= 0.20) then -- 20% - core.swap_node(swap_pos, node) - end - core.remove_node(spos) - end -}) - -core.register_abm({ - label = "Radon gas/water spawn (by group:radioactive)", - nodenames = { "group:radioactive" }, - interval = 1, - chance = 1, - action = function(spos, node) - local radioactive_group = core.get_item_group(node.name, "radioactive") - local num_radon = 0 - if radioactive_group >= 5 then - num_radon = math.floor(radioactive_group / 5) - else - if math.random() >= (radioactive_group / 5) then - num_radon = 0 - else - num_radon = 1 - end - end - if num_radon == 0 then return end - - local target_nodes = sbz_api.filter_node_neighbors(spos, 1 + math.floor(radioactive_group / 10), function(pos) - local nn = core.get_node(pos).name - if core.get_item_group(nn, "airlike") == 1 or nn == "air" then - return { pos = pos, type = "air" } - end - if nn == "sbz_resources:water_source" then - return { pos = pos, type = "water" } - end - end, false) - if #target_nodes == 0 then return end - for i = 1, num_radon do - local data = target_nodes[math.random(1, #target_nodes)] - local node_to_place - if data.type == "air" then - node_to_place = "sbz_chem:radon" - elseif data.type == "water" then - node_to_place = "sbz_chem:radioactive_water" - end - core.set_node(data.pos, { name = node_to_place }) - end - end -}) - -local water_color = "#6abe3032" --alpha: 0x32 - -core.register_node("sbz_chem:radioactive_water", { - description = "bad water, unhealthy even", - drawtype = "liquid", - tiles = { - { name = "water.png^[multiply:" .. water_color .. "^[opacity:200", backface_culling = false }, - }, - use_texture_alpha = "blend", - groups = { liquid = 3, habitat_conducts = 1, not_in_creative_inventory = 1, weak_radioactive = 80 }, - light_source = 14, - post_effect_color = water_color, - paramtype = "light", - walkable = false, - pointable = false, - buildable_to = true, - drop = "", - liquid_viscosity = 1, - drowning = 6, -}) - -core.register_abm({ - label = "Radioactive water move", - nodenames = { "sbz_chem:radioactive_water" }, - neighbors = { "air", "sbz_resources:water_source", "sbz_chem:radioactive_water" }, - interval = 2, - chance = 1, - action = function(spos, node) - local uppos = vector.new(spos.x, spos.y + 1, spos.z) - local upnode = core.get_node(uppos) - if upnode.name == "air" or core.get_item_group(upnode.name, "airlike") > 0 or upnode.name == "sbz_bio:algae" then - core.set_node(spos, { name = "sbz_resources:water_source" }) - core.set_node(uppos, { name = "sbz_chem:radon" }) - return - end - - local positions = { - { -1, 1, -1 }, - { 0, 1, -1 }, - { -1, 1, 0 }, - - { 1, 1, 1 }, - { 0, 1, 1 }, - { 1, 1, 0 }, - } - - for i = 1, 8 do - local vec - if i ~= 1 then - vec = vector.add(vector.copy(spos), vector.new(unpack( - positions[math.random(1, #positions)] - ))) - else - vec = vector.add(vector.copy(spos), vector.new(0, 1, 0)) - end - - if core.get_node(vec).name == "sbz_resources:water_source" then - core.set_node(spos, { name = "sbz_resources:water_source" }) - core.after(0, function() - core.set_node(vec, node) - end) - return - end - end - end -}) diff --git a/mods/sbz_power/sbz_chem/reactor.lua b/mods/sbz_power/sbz_chem/reactor.lua deleted file mode 100644 index ed993f29..00000000 --- a/mods/sbz_power/sbz_chem/reactor.lua +++ /dev/null @@ -1,269 +0,0 @@ --- Fuel rods - -core.register_craftitem("sbz_chem:thorium_fuel_rod", { - groups = { chem_element = 1, fuel_rod = 1, radioactive = 1 }, - description = "Thorium Fuel Rod", - inventory_image = "fuel_rod.png^[multiply:#d633af" -}) - -unified_inventory.register_craft { - type = "compressing", - output = "sbz_chem:thorium_fuel_rod", - items = { "sbz_chem:thorium_block 8" } -} - -core.register_craftitem("sbz_chem:uranium_fuel_rod", { - groups = { chem_element = 1, fuel_rod = 2, radioactive = 3 }, - description = "Uranium Fuel Rod", - inventory_image = "fuel_rod.png^[multiply:#47681e" -}) - -unified_inventory.register_craft { - type = "compressing", - output = "sbz_chem:uranium_fuel_rod", - items = { "sbz_chem:uranium_block 8" } -} - -core.register_craftitem("sbz_chem:plutonium_fuel_rod", { - groups = { chem_element = 1, fuel_rod = 3, radioactive = 5 }, - description = "Plutonium Fuel Rod", - info_extra = "Not for noobs...", - inventory_image = "fuel_rod.png^[multiply:#1d2aba" -}) -unified_inventory.register_craft { - type = "compressing", - output = "sbz_chem:plutonium_fuel_rod", - items = { "sbz_chem:plutonium_block 8" } -} - - -local tier2power = { - [1] = 800, - [2] = 2200, - [3] = 4800, -} - -local explosion_particle_def = { - time = 1, - amount = 9000, - radius = 1, - drag = 0.2, - glow = 14, - exptime = { min = 2, max = 10 }, - size = { min = 3, max = 6 }, - texture = "reactor_explosion_particle.png^[multiply:lime", - attract = { - kind = "point", - strength = { min = -20, max = 0 } - }, - acc = { x = 0, y = -3, z = 0 }, -- "gravity" - collisiondetection = true, -} - -sbz_api.register_stateful_generator("sbz_chem:nuclear_reactor", { - description = "Nuclear Reactor", - tiles = { - "reactor_top_off.png", - "reactor_bottom.png", - "reactor_side.png", - "reactor_side.png", - "reactor_side.png", - "reactor_side.png", - }, - groups = { matter = 1, fluid_pipe_connects = 1, fluid_pipe_stores = 1, ui_fluid = 1, explody = 2 }, - - input_inv = "rods", - output_inv = "rods", - on_construct = function(pos) - local meta = core.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("rods", 6) - meta:set_int("rod_timer", 0) - meta:set_int("rod_tier", 0) - meta:set_string("liquid_inv", minetest.serialize({ - max_count_in_each_stack = 100, -- 100 buckets - [1] = { - name = "sbz_resources:water_source", -- forced to be water - count = 0, - can_change_name = false, - }, - })) - meta:set_string("formspec", "formspec_version[7]size[10.2,10.8]" .. - sbz_api.bar(0, 0, 0.2, 0.2, " Water Sources", - "Reactor Water Storage", "Don't let it get too low.") .. [[ -list[context;rods;6.2,0.2;2,3;] -list[current_player;main;0.2,5.4;8,4;] -listring[] - ]]) - end, - after_place_node = function(pos, placer, itemstack, pointed_thing) - minetest.get_meta(pos):set_string("owner", placer:get_player_name()) - return pipeworks.after_place(pos) - end, - on_liquid_inv_update = function(pos, lqinv) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", "formspec_version[7]size[10.2,10.8]" .. - sbz_api.bar(lqinv[1].count, lqinv.max_count_in_each_stack, 0.2, 0.2, " Water Sources", - "Reactor Water Storage", "Don't let it get too low.") .. [[ -list[context;rods;6.2,0.2;2,3;] -list[current_player;main;0.2,5.4;8,4;] -listring[] - ]]) - end, - autostate = true, - action = function(pos, _, meta, supply, demand) - local inv = meta:get_inventory() - local lqinv = core.deserialize(meta:get_string("liquid_inv")) - - local rodtimer = meta:get_int("rod_timer") - - if rodtimer <= 0 then -- no rods, attempt to get some from inventory - if lqinv[1].count == 0 then - meta:set_string("infotext", "No water and no fuel rods") - return 0 - end - local rodstack = ItemStack("") - if inv:contains_item("rods", "sbz_chem:thorium_fuel_rod 6") then - rodstack = inv:remove_item("rods", "sbz_chem:thorium_fuel_rod 6") - elseif inv:contains_item("rods", "sbz_chem:uranium_fuel_rod 6") then - rodstack = inv:remove_item("rods", "sbz_chem:uranium_fuel_rod 6") - elseif inv:contains_item("rods", "sbz_chem:plutonium_fuel_rod 6") then - rodstack = inv:remove_item("rods", "sbz_chem:plutonium_fuel_rod 6") - end - - if rodstack:is_empty() then - meta:set_string("infotext", "Need fuel rods.") - return 0 - end - local tier = core.get_item_group(rodstack:get_name(), "fuel_rod") - -- mercy on noobs - if tier == 3 and count_nodes_within_radius(pos, "sbz_resources:water_source", 5) < ((9 * 9 * 9) - 1) / 2 then - inv:add_item("rods", rodstack) - meta:set_string("infotext", - "Not enough water near the reactor, either put water near your reactor or don't use plutonium fuel rods.") - return 0 - end - meta:set_string("rod_tier", tier) - meta:set_string("rod_timer", 3 * 60 * 60) -- 6 fuel rods will last 3 hours - end - -- alright, from that if statement, while it doesn't look obvious at first, we are sure we have a rod active in some way - rodtimer = meta:get_int("rod_timer") - local tier = meta:get_int("rod_tier") - - -- 1 water every tick i guess... for all fuel rods... sure - -- so check water - if lqinv[1].count <= 0 then - -- attempt to explode - if tier == 1 then -- but thorium ones don't explode so just don't make them do anything.. so it just pauses - meta:set_string("infotext", "Out of water, but you have thorium fuel rods so the reactor didn't explode.") - return 0 - end - -- explode - local owner = minetest.get_meta(pos):get_string("owner") - minetest.sound_play({ name = "distant-explosion-47562", gain = 0.4 }) -- we gotta get better sfx - local strength = 1 - if tier == 3 then strength = 2 end - sbz_api.explode(pos, 20 * strength, 0.9 * strength, false, owner) - explosion_particle_def.pos = pos - explosion_particle_def.attract.origin = pos - minetest.add_particlespawner(explosion_particle_def) - return 10000 -- yeah sure why not - end - - if tier == 3 then - -- must be somewhat submerged in water.. - -- 50% of nodes in a r=2 area around the reactor must be water sources, around the reactor, the check gets performed in a r=5 area - -- basically just put it in a pond you should be good and don't let radiated water kill your reactor - if count_nodes_within_radius(pos, "sbz_resources:water_source", 5) < ((5 * 5 * 5) - 1) / 2 then - -- i know... duplicating explosion code... cringe bad yeah yeah - local owner = minetest.get_meta(pos):get_string("owner") - minetest.sound_play({ name = "distant-explosion-47562", gain = 0.4 }) -- we gotta get better sfx - sbz_api.explode(pos, 20 * 2, 0.9 * 2, false, owner) - explosion_particle_def.pos = pos - explosion_particle_def.attract.origin = pos - minetest.add_particlespawner(explosion_particle_def) - return 10000 - end - end - -- great... now - -- render formspec BEFORE consuming water - meta:set_string("formspec", "formspec_version[7]size[10.2,10.8]" .. - sbz_api.bar(lqinv[1].count, lqinv.max_count_in_each_stack, 0.2, 0.2, " Water Sources", - "Reactor Water Storage", "Don't let it get too low.") .. [[ -list[context;rods;6.2,0.2;2,3;] -list[current_player;main;0.2,5.4;8,4;] -listring[] - ]]) - -- consume water - lqinv[1].count = lqinv[1].count - 1 - meta:set_string("liquid_inv", core.serialize(lqinv)) - - - - meta:set_int("rod_timer", rodtimer - 1) - meta:set_string("infotext", - "Working, used: " .. math.floor((100 - (rodtimer / (3 * 60 * 60) * 100)) / 100) * 100 .. "%") - return tier2power[tier] - end, -}, { - tiles = { - "reactor_top_on.png", - "reactor_bottom.png", - "reactor_side.png", - "reactor_side.png", - "reactor_side.png", - "reactor_side.png", - }, - -- can do some evil chain explosion logic but wont :> - groups = { matter = 1, radioactive = 10 }, - diggable = false, - light_source = 14, -}) - --- the scary -local xray_demand = 1800 -sbz_api.register_stateful_machine("sbz_chem:xray", { - description = "X-ray emitter", - tiles = { - "xray_top.png", - "xray_top.png", - "xray_side.png", - }, - groups = { matter = 1, }, - autostate = true, - action = function(pos, _, meta, supply, demand) - if supply < demand + xray_demand then - meta:set_string("infotext", - "Needs 1800 power. Maybe because of that this might be a little... dangerous... hmm.... no i'm sure it's nothing...") - return 0, false - end - meta:set_string("infotext", "On") - return xray_demand, true - end, -}, { - groups = { matter = 1, radioactive = 30 }, - tiles = { - "blank.png^[invert:rgba^[colorize:cyan:255", - "blank.png^[invert:rgba^[colorize:cyan:255", - "blank.png^[invert:rgba^[colorize:cyan:255", - }, - light_source = 14, -}) - -core.register_craft { - output = "sbz_chem:xray_off", - recipe = { - { "sbz_chem:plutonium_block", "sbz_chem:plutonium_block", "sbz_chem:plutonium_block", }, - { "sbz_chem:plutonium_block", "sbz_resources:phlogiston_circuit", "sbz_chem:plutonium_block", }, - { "sbz_chem:plutonium_block", "sbz_chem:plutonium_block", "sbz_chem:plutonium_block", }, - } -} - -core.register_craft { - output = "sbz_chem:nuclear_reactor_off", - recipe = { - { "sbz_power:solid_charged_field", "sbz_resources:phlogiston_circuit", "sbz_power:solid_charged_field" }, - { "sbz_resources:phlogiston_circuit", "sbz_resources:storinator_neutronium", "sbz_resources:phlogiston_circuit" }, - { "sbz_power:solid_charged_field", "sbz_resources:phlogiston_circuit", "sbz_power:solid_charged_field" } - } -} diff --git a/mods/sbz_power/sbz_chem/sounds/050597_ice-crusher-38522.ogg b/mods/sbz_power/sbz_chem/sounds/050597_ice-crusher-38522.ogg deleted file mode 100644 index 395eba44825634f9532b6bb2f5f020d0ac069677..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14978 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

-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 VyZ+!pF#840%&qSYssPB=w*a;JqpJV_ diff --git a/mods/sbz_power/sbz_chem/textures/block.png b/mods/sbz_power/sbz_chem/textures/block.png deleted file mode 100644 index 0c2ca3583570cfce607efe4c703fe73d2238fc47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmV8eOr>!eEr!p|vIC_|ZBXU}>8(Y((sBs%^WsG>qTqvzDX_zq9EHV^2 z%ZiAGOVpukiL6t1)8P`lpg0VuBP|)k5nvk`MutK%0?x1k(z9QOg6@xQ|7_(u>60(% zX@AfAzF*F1pGDMjR8EiLV#$Yyw%{|p7EW*flO69%G&amkrS>2tl)azI{ykG9TExbJ zYa-NOdYl3*UH?4z%iD{=t|RH-VB=wM{I&`_^lKt$yvT#k?B50^WJH5W3E`kp9R~`6 z3FLLVz}L532MtvsSk&m=r?m8f_Mh&8A{J5Ai8Ekfei4{qG=iJfCxP$A?*YG3D#5M| z2CyTq4lMofC2&s`FTRC}{M~(amxxkO2Z}%i(1$z3VGU*YLKddbgd+rD2Q_#>3Px@n zQG^IApn!aYBN?&CL?F__++nQW15JblNoZYaZdwkj@cgwh4fh7HlRp+Qrpe_#DBC}> z|M=#RP!g~HJ%ct?9vnL`Z(SmPYAkgiG$bUESG|+nzqX?!lhI5#@91MJW%-%;)yMOb zy0sb3S2`*P)LMJI0x--HC!M!eVRXzF7ykl~y2Kfd4%@wFbsb-J1}(WBp+ zWiIa8R-=ncWnxu+3#!WQ7MK*Dy>YA0MwNMVt>N+7CU3ZFr`-J?ILK0x{&kSeoY1DX4#zN2S~B*Ojxowb?3C-&s;p?~OUU;CT)fQQq0bYi6CsQPQp$ z6e{Ar%iPg-!}Q4ELlJ#kGxU#(6xhG`*bJ6e?bQx`Tfb9Qw}7W&t~qt6t-Yd$G5zt$ zxQ``}KKL!N_@XyD|Kh*uyvm`=O4*eVv?eh5iMrg4qgw|=+vo2aVwXD|SNjDT*u8Z3 zjJ21$-$vE?TOr3r1ckBHvBX;1A~&6{87TT8sFk3Xixu)gv@Y@Op+ru!ixh6s9oKM?jQPxIp_`l-W|Dh*Ob&gp6gLsuIJ;`*d a<9E!9sj1wj*94t!nZq}7=>S}9)l=|rDHp=F_80gj+8SXai%IBvSrDb1yLpUXb0p3>}PBsG_CT#Ehv8Z zZFpa7{-=-6_is$l3jn;m#-j!wjy0aA{Q9K=rXo9cK5uqWn1LQx)qCSQH=1#^|dn?dY0N49&UiTXK2AH}{77oXHw83pE5FXfK&%Y}ZK|BDOa4nXr zaXe^;%gh8d$n!OTYpD8wVi{fJJ)H{-7Oc z)5M&ba}kv)k;JJp173qr^&05&LLX3qc%av0(*D4;@em#e52%42Xr5jN?+?sKPd+bb zlVBbI&GUbM9`tQ_ECa@a_F~@eyufxQP6N}(C*i@L=0Q7^dA>%GZK;v>ywH9X$TTkx zk~r->jC&12)N8O<=dO7l7+K1+Rhh7la3+Di9vn`d|G8x`<|TQX8_E2lp4W(dhmHz)$hQ1L47?0w(D% zNPj{43&SKlkp6<#AVl-`7up)dgEmZzopr07+*rbN~PV diff --git a/mods/sbz_power/sbz_chem/textures/compressor.ase b/mods/sbz_power/sbz_chem/textures/compressor.ase deleted file mode 100644 index 79388731406baae20dacead7a3a050c4cc8f2460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1599 zcmcC#V_jR)Ik_s?e70~Vc&%mIh zU;-pvHEe)nnx!F-><_aBlJ^VMfaJ{uX+ZMb;aNcP_a`$TIrC`%kj&a=03^+)3=Ff^ zZU>Srb?rbhGb;;7Mur6e$ug%dAi2iK2uR)xPX?0Lt9Jp({^?#ovMb-@%e1!kl`1iFHOoxvxuGPOv-&>hHORe;F;XM)fS z;FM4?=l9=}Z~o_VZJgA^89C$DFV9kaGdpHx<~W;G^%bv|tNi5&`L&#dnZaiMkAeiC z&R-uH;ZYa>e4w)r z|2JB$XVBY|nAGy6`O3q?M{e}<^Oyg|uUe@AWl!QXQMt m-{2<3iwC8*4=-!z89~&vi%`N#KuZkN&P1TZg`7#Ll=lJ2`|F1Q diff --git a/mods/sbz_power/sbz_chem/textures/compressor.png b/mods/sbz_power/sbz_chem/textures/compressor.png deleted file mode 100644 index b1f6692f1bb25a8567f3ecf72e19611a426b09d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmV;40e1e0P)LIUVq&6@uD zpss{$8pF1cZr6}J0C_NIV5>g>%JSnp&oGe(ZXyr7{&JlP6z2rXk285d9<&Km$0;HY z$OB#E0eJwB2eTv~56A<6JQy^v6@Nc~2S6bY$OC}?FZf}wJW$93@}Oq`@chAV8u0u9 ndC(?M9jA!r6KSA}=M#YkBB29Wo{S%700000NkvXXu0mjfx$dTu diff --git a/mods/sbz_power/sbz_chem/textures/compressor_side.png b/mods/sbz_power/sbz_chem/textures/compressor_side.png deleted file mode 100644 index 6aa699ee4600716e81c5c7c669994bf6473be761..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr`&KfBv3)W6#Xm(AwD8 z=otH6K5|xmTvAfPq9bK&Y;A$eZoCqv3|tbLXU{PlJj$6G{4K`>sF}gj)z4*}Q$iB} Dy5S!k diff --git a/mods/sbz_power/sbz_chem/textures/crusher_side.png b/mods/sbz_power/sbz_chem/textures/crusher_side.png deleted file mode 100644 index c5a78b9db7a72674ed4971ca57ae748b9cb574a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr}70PaY=zIPbuiz#_Ro zCA&T8$ocsDk`5BG8#WgjH5l;Rsjlf@Jj@U?D{)YAi!xh*%I9>?^b%)k1k!JAXPdUz{V>odtpN3bb$WzvmvkO`nzcWRy czopr0NlMiXaE2J diff --git a/mods/sbz_power/sbz_chem/textures/crusher_top.png b/mods/sbz_power/sbz_chem/textures/crusher_top.png deleted file mode 100644 index 9fadd2882084fb524cb7ff062c5430dd8233236e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795 zcmV+$1LXXPP)h-!W*tI(GE56;di)`v*X_5pyn=qgt&dLPDVst*o4z0(N)b6SAF1B&gMDiI8YCO4qNf zkrP6>{G1Af0yUdW5fY2VCWmopIk%auzm~q?cUHDd_ z3PH9x=6&@7AjxFX_b~3pxq~^nd0Gc^10)~d50Hm_<$z^^c1B0?lL+(__;5TPcU)kC zSbgyJ-43@XcsIoAgY}J@l+9)}p>V(Oorpe=AVwcxq1xPd;`qP@ zDHd1t{eVY&qtOr{kgVndcRSl4JnozjDwUnd7RJj3x3dYNjyo*}_aBt3kU&0=Ac1^f zg7}Si-%3;=e#?b6-qmK}MH3Kpp>hw_|7<_NxVw1a>TEvX5g&;}JP^?byj<`*gBxP? z!OK@qC;Kx>TzzLyA)*f?h|vdlzLziEaC~5cEG?bYeZa~>=}HicJIx2YT;PQR?QDba zxN}0-+xtMn;ZS>5@Pnx1PRqgTH``W7ARkDOKt3=*{6@TQC8`j=B>Ar`%FCvW6DpdjEnf0AWW zM8wi5DSYl5&*n)wOc!X;nZT;&>m$4IY8n~@RQ}9ZGW*KxYZnikzBc*VPr*8tiWIM%NxkodG@o)YURiO@T=lE} VtSNS8en8t9JYD@<);T3K0RWW$KS%%o diff --git a/mods/sbz_power/sbz_chem/textures/decay_accel_front_on.ase b/mods/sbz_power/sbz_chem/textures/decay_accel_front_on.ase deleted file mode 100644 index 1e18a3d66268f08aafa52ddb22de567836a7f6a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2373 zcmcJRdrVVj7>7>>YsZ3g8AgiRXfabDZgQI)M8g3L#>-euMT}0%)lMp7$htAva=19? z1Y*mm!t9bVVU$Kp1n0&@1ZgA7l;NNoRA>gnZ7qxnvqIP7p?g0F(DXkpJ58T+nkM}{ z-}}AiJ&ke0u;Fh!uovLP!DtwUrNVpZ;4EGKFIReqv`x7#rapiaZ_Yw0+d0#YVVgK_ z0Au`j0)^qhKxzCA;BTk50QFTupjmSXNdChGe)-1%py*Z*@J)FJaDQ4LkiY*`V93sJ zAdZWHL5T&xcQQtRDGECT#S86g3tiA2C7@qFM%(Z#^}kPx8$ za0;;hlNO+~Vjr;h{UEyt*5ZmPj1~urfE9o~xPv%YgEIJnESQ2OID#P9ff{&$6c~XH zaYIyxfP)73Hkym|p^_pi(>rrH*jQ+L8% zM@nvydt=*;X20!^ID2Mr*fvF5+}P9bdD*G76gr)LlU3`XAfj{1x+76+ zLrxN_hM_0;PpVs$FH+TJ)et4GW%K(2TgbiLJARlxSU`I;CcARZN#M*%1oDwUJ?qH2 zZB&!xvLe5p{m>`bvPnVfJ)4dr69XkTGMWqHC`~t2bBFzUFEha8WuR*Qd?l3(xQ!Ja zQ=huvBvQB%k*M45?(Y7q<3374+%|A;t`fd&Mq!?%YLK@lu+baJA0OxrC5fYqW|fu@ zH7RwInhmoxTK3gmW`m>D*JD4Ps&tb2eA!aoELKO@?BAYYcl?TCaqfpr^HLFDhnb?j zQ_2M5(EA2nsUQ`dP}5}NYMXk3;A@zNt)4IC>fXj{Y7@jW<(IN$6Dn61>{{@H@ip-p zMqcx~HlR!K+=bd^8wesVwo;HTtZH@CyVk5+Pkoz-2aHI}1bj?MpO!p2|448W(F!#o+a@*TalBV zJTN5fX)|US&0Q)l1!}cJ_zeS3WF2`vH+fWg(IlyKu2-2;f1z=(yxSl8Yfq=vD8)(F zQa2MARe)NaWw?=jJdhij+3YAbFvKe+jy5UflNzsCEp&Vz)3%5N2muFB#&dNwPlj;V^*k$btrDO}YI2z0uPQijz2Gd(fctFuo ovJ6t5{iO9^|KjvT&mr`8#&MZ(t4!N%z{dzt^Wsf-RFXaZA0KmKaR2}S diff --git a/mods/sbz_power/sbz_chem/textures/decay_accel_front_on.png b/mods/sbz_power/sbz_chem/textures/decay_accel_front_on.png deleted file mode 100644 index 5ff38e628a8e3fa59af051ea8fc4843d879180fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 846 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 diff --git a/mods/sbz_power/sbz_chem/textures/flowing_chemical_source.png b/mods/sbz_power/sbz_chem/textures/flowing_chemical_source.png deleted file mode 100644 index 937c450dfc0341a90059770f2966261ec11514ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 zcmV;(0yq7MP)C~f)L9}7>b;JF`J-_|>I{+a@&WAH8X1e7g^6~M3(T3x(r>ZKh z<4DPXE;NgVx|u^Mte%&=et#pyz!WFKF>&Y*$j5F61u&X%nlQ>RzpGiacg))c=PHy^ zEW3_=e97clo}1Qg*KF-9@Ph*27;>zY~Z5UtQg^UwA>m9soPJdjFe_qM}No){7( z-&|uVh!V6>NL@R+t|R8eZu`P{xF8q9;q!nvOAa>#sVt>rL{$~ZNHTR1JB9<5N%e;#1t_`sH`CNHeoJ>>o9OR5BMn%l&9}|+NPnhf^`=8_Qy9; z%4nl$+c}%(4fA$>TOlVDOSXS*N#)2iPQ(z{{S-94`0qEw`B$| zH?pbyJi~_BgR%JvL#AM4+nP5yi16s-8>FVdQ&MBb@0PfK{ApigX diff --git a/mods/sbz_power/sbz_chem/textures/fuel_rod.png b/mods/sbz_power/sbz_chem/textures/fuel_rod.png deleted file mode 100644 index 1d2dc252d987607e1b5d9aec88e8dafa403c9d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar`%NC)si}81T3)uK2&Z z^vwln7N-Ss=QpqOJ)qRVze)8zzsr-?1?Q*eTKbiLzaZywcJWjJuUv-A-jxlrg0rH9 zPYB6OZ2GQv@3`=1ZN`RK`=b+o@?R2}_}kxtF@?c#fwrZFBhV@aPgg&ebxsLQ0G?Jg A_y7O^ diff --git a/mods/sbz_power/sbz_chem/textures/hpef_front.aseprite b/mods/sbz_power/sbz_chem/textures/hpef_front.aseprite deleted file mode 100644 index 6ff5eeb69b267647c691f45ee795e44261b8044f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1188 zcmcJNe@GKi0LPy(3&L1L&=hN@=}HK@Eiq=x18EieL1kkRNoo^gD<;Y+v2}H|TFBKF z47O`gB4rU1sy`|UMJPhZ{wbna&=0adgotiPtkv=QE>U6l=X}R~?mh00&*$B{n<_#+ z-zp@_aWSNT5YmQwZZLDx1(~Iw%*d))>w8#=nHj4#*GUN}XKFz6dK1`g)Po`C7VuN2 z4jk`m2Y)=f3jRseg3`C$pl6r`H%Gjn)x8mHv{rxylM&=NAIP?x1rK_wIR!r9GX z6W9Ur(T;FbBN@GjMJY1Th(OdK4PA&r5puFEl%fI&@IwwWv~WTQ8&u_46Qc%a1`^0p z($MNUa=5GGn77T3bs;nTmM)rplK=le_qC_ZcYe|O^D#jXHi-7qsqeH~U#|qF`r|@E zd!w$YD?N4Yd1R$+L=!btE2BM~l3?X(hmvEAliPXSp|D#=-2sR4_;s;9Bex#<8j96y zvn!Dat%W6WQHgX3x{O>fd*Y|C&T|VR+E#7VLDS LQderoPt^PaoOP4L diff --git a/mods/sbz_power/sbz_chem/textures/hpef_front.png b/mods/sbz_power/sbz_chem/textures/hpef_front.png deleted file mode 100644 index ea3470be7b88a4a891d1f33ae4f4d08ed2a154fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmV;a0#^NrP)Px%V@X6oR9J=Wn7?ZiVHn3htrCbd860jfS-ik;A#}N5k-8+EI-4S{Qp7*NNkr=4 zqJoRbRGdR84i3Rh9HN1OWXMv4DuhJHR%)Sm8R}5px6gY&l9;+E_l1z-&GUTkxl5i; zo_iM_tv)^F0=f)vd@Dmbo8#nYI5i=i%>i(7G-T=1PZon8s(@+9Mg?lI_u(@DAHTc> zz|LROf!_u{sFZ5}EU&GG4V3z$4x8KI+foJI++Uzlu8Au5&n_XI&GGu>L;9l*)vY0p z<#XlhE92!@KAYR8^hX_DJh`il7ghO{a!n@>+I0Y0yG>fVO#lY%I*#R2-5Tmk(FRh3 zc3me)wRW4@Se;ZGq_a8tqYjScv$1jrz{biUu3Nx$3wjN}v3&ZYPJ9KW{213QP|A-( zYtl&FNW;LhQvfuIUA?A`8^tcA{8-0?Dp>QDL)R^hq-1R9cL0#NbK7_i9!nVpJCE1d zi42okk2bh^N0AntQnh%U`!Lw78j?V`S*DcT}cFE+gYdXy|A4CB~4H&`Lga-)^3Px$6iGxuR5*>LlD}%gU=+oF+9IUbj2V(l8S(%fb;?*=Tc~p>K7dn)VrQi;b(78+ zGKao^eFy2_l=uKz5VEv`+>dfbI-lp)^qRmmosn)@YBD>FdYuNv{7J~ z4giN;O809|yLc&tCb5=4e#YS&0GnhBfaltZxJkC^doUcA4f1$gmd6qRA5Sej*UqI} zA6qa?hxgghHJGIMR>sx$Tzh;gQ^wPm2W8xr_?~Mkak5$f5Jw?#6atW}7Wh_1FiEx6 zv>^&nM0vzfsEnnkGLW8pE2|obh9akw;J=WfCmU2IxbZrTf+DAK4+i%`?JU068jNo1 s*H|FiS~9pB%^StF2`)a@Cy4?60Aq?*IZGvzY5)KL07*qoM6N<$f;{b!bN~PV diff --git a/mods/sbz_power/sbz_chem/textures/hpef_top.png b/mods/sbz_power/sbz_chem/textures/hpef_top.png deleted file mode 100644 index 556efce20a7f2c57e7dab07ec2427013e50f9a4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|rg^$JhGgTe~DWM4fK}A<2 diff --git a/mods/sbz_power/sbz_chem/textures/ingot.png b/mods/sbz_power/sbz_chem/textures/ingot.png deleted file mode 100644 index 50fb0288624733ae220a03351e14d3767869c9a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmV+f0sH=mP)6Hhq|7$5LX?AY;^0s4ce}Xnq7?10Y@w#i5;hKVnrySVdrsfp_xt(0zu^C| zc1~#RoG>e2$P)teIxPU~{SknESIgAIDrRA955aP6zB>}4$3ox4DkfQ(HUM(1R=(f; zcU<`Vq^L4;-2h-V9VUfejfG@DYt$(KbKSrXo=k@A+>uiT03pzns@%jbY#>0^asyv@9doxv}$+w z)oYRw%d+oF@J?o7n9$<1?eD|1z1LJsE~FVVd!BHrZ*67NTpDuAg`x!i4{an^LB{Ts5W{*d( diff --git a/mods/sbz_power/sbz_chem/textures/radon.png b/mods/sbz_power/sbz_chem/textures/radon.png deleted file mode 100644 index 0335b7b822f1fa5b18a7947fededa78f7e68c317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nR5lbP0l+XkKtl~KO diff --git a/mods/sbz_power/sbz_chem/textures/reactor_side.png b/mods/sbz_power/sbz_chem/textures/reactor_side.png deleted file mode 100644 index 414dfc6a1eee8bb3924ebbf9cb37840998c84ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`hMq2tAr`&KAwdQ|&pR+CBqk&z z2Zn^vy85}Sb4q9e E0HKZ_ApigX diff --git a/mods/sbz_power/sbz_chem/textures/reactor_top_off.png b/mods/sbz_power/sbz_chem/textures/reactor_top_off.png deleted file mode 100644 index d3208c9fead4701fc6b1e84eea8d1a24c65f314b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr`&KAwdQ|&pR+CBqk&z ze3RWkNsST*fWYAFOQx=rYj(^cc6ya+lkRl0^6X*!VBqlG z*y@1l`9lX9IC5hcw*N8Is$>ke5%yu{S^To0v61U#!^BH(co>|Vm2VY%dG!crF@vY8 KpUXO@geCxo3_N}S diff --git a/mods/sbz_power/sbz_chem/textures/reactor_top_on.png b/mods/sbz_power/sbz_chem/textures/reactor_top_on.png deleted file mode 100644 index d8f040f0d7b45a542bd2f5254a48710e391ae61e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`xt=bLAr`&KAwdQ|&pR+CBqk&z ze3RWkNsST*fS_ROMON3K-F5t2^3!dEJ>MN=V!OvsA+g}M zr0j!9>4^yrEoOQR(f=f-?rG4T$GMET?PAG+0}ibv2Rt&%*ciIaRfH_L|M&teX7F_N Kb6Mw<&;$Tx2|8u~ diff --git a/mods/sbz_power/sbz_chem/textures/simple_alloy_furnace.png b/mods/sbz_power/sbz_chem/textures/simple_alloy_furnace.png deleted file mode 100644 index 83f65ac1711a91321718a5eb834737446094d678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmV-k1EKthP)Px&7)eAyRA_c95oRboTeh1uibW&|B>FF45~<0sywQH&F+Gj~|XLcYK<MR^3TD1PNInE*jud)zdhL9+nE*^4EyN5 ze>bVhBu(1@fST`c4s#M;zIcT+ZCjggc78e?&g_qY@#q!jAUB-Zhz;h>!NP-u2eUC9 zyR-*`Vc&YoV(2%LBspj_mN2@#!}awI_2a>?kL8tR{QUJJ77u=p{!He48xtO{*2e|1 zb3Pjh6qiV#WW#!(1;sWC4`L|L1jeIFbqUiR*xc&QrjaDcLI3M_D+``Ie~QuV9Ud*! zV)5Yfr*G0afHh%jdvkgv+L{pdE-f3@11%_Qf`PK|z+-k6F|J%`4}z{-O;N2YBJu!$ zwF#03fZKh7^C4(KVLi}-!X_9f55)tY;p{y-Hv#={raf?3xk?3?=z0v1c>vg%kn;er zHzEAY#CkBlI}|no6lV|C*An%A!O4SChqL$WJXyJ_LVMs7s(`8A7@-FMZ-Vkl1nf*G z&jas02nLF?2Wi^I+4*UH?aX>0Kq-GXd(X~c`iVX%EKv09AyN+j&IGLo0B=HtJ@76d zt_x)=jPXD;Wpit1)&l{G^Kh1WDED%+txMz{FwY?)_5dh0!RP_Nneb3N2;K@~Jdi-i z4rkT_=_!xPaE`nwD^jip>^ljOdjObCDD(g*HX#xZ;%kLj_Y<>cne`x^9?E>0vLfYq zVDo-b1v~)sCQu##W)s5C&Q2c0*9xn~^M!aoarQv!q4*?M!1i6mig*C1O`tsh^d^L# zot-?0uN77e54;Q94=5*BN800`&yvUGz2ypd0OU=Wc%XYLY&I$r!q3i59>muQ`%gUZ oEo0B&@0SE~DCN2cX7-#02mysR58FhkOfV nKs%xl!6jHSVD5tM@BfaUE)G)9y#Z|=00000NkvXXu0mjfIIUcv!q a1_o7cHl?czpY#BYXYh3Ob6Mw<&;$Tym@5eY