From 70e124f13706be5acf4c456c2708fccc3ca316cb Mon Sep 17 00:00:00 2001 From: Evert Prants Date: Fri, 27 Jul 2018 18:47:49 +0300 Subject: [PATCH] Start working on the nuclear reactor --- elepower_nuclear/crafting.lua | 2 +- elepower_nuclear/craftitems.lua | 15 +- elepower_nuclear/fluids.lua | 2 +- elepower_nuclear/init.lua | 1 + .../machines/enrichment_plant.lua | 2 +- elepower_nuclear/machines/fission_reactor.lua | 488 ++++++++++++++++++ elepower_nuclear/machines/init.lua | 11 +- elepower_nuclear/nodes.lua | 17 + .../elenuclear_fission_controller_side.png | Bin 0 -> 2865 bytes .../textures/elenuclear_fission_core_side.png | Bin 0 -> 5200 bytes .../textures/elenuclear_fission_core_top.png | Bin 0 -> 1582 bytes .../textures/elenuclear_mineral_uranium.png | Bin 0 -> 1550 bytes .../textures/elenuclear_uranium_lump.png | Bin 481 -> 1425 bytes elepower_nuclear/textures/gui_sheen.png | Bin 0 -> 4223 bytes elepower_nuclear/worldgen.lua | 39 ++ 15 files changed, 560 insertions(+), 17 deletions(-) create mode 100644 elepower_nuclear/machines/fission_reactor.lua create mode 100644 elepower_nuclear/textures/elenuclear_fission_controller_side.png create mode 100644 elepower_nuclear/textures/elenuclear_fission_core_side.png create mode 100644 elepower_nuclear/textures/elenuclear_fission_core_top.png create mode 100644 elepower_nuclear/textures/elenuclear_mineral_uranium.png create mode 100644 elepower_nuclear/textures/gui_sheen.png create mode 100644 elepower_nuclear/worldgen.lua diff --git a/elepower_nuclear/crafting.lua b/elepower_nuclear/crafting.lua index 50534fc..653c7e6 100644 --- a/elepower_nuclear/crafting.lua +++ b/elepower_nuclear/crafting.lua @@ -36,7 +36,7 @@ elepm.register_craft({ elepm.register_craft({ type = "enrichment", output = { "elepower_nuclear:depleted_uranium_dust", "elepower_nuclear:nuclear_waste 3"}, - recipe = { "elepower_nuclear:nuclear_waste 4" }, + recipe = { "elepower_nuclear:nuclear_waste 5" }, time = 50, }) diff --git a/elepower_nuclear/craftitems.lua b/elepower_nuclear/craftitems.lua index b19e57b..b9e644f 100644 --- a/elepower_nuclear/craftitems.lua +++ b/elepower_nuclear/craftitems.lua @@ -31,17 +31,22 @@ minetest.register_craftitem("elepower_nuclear:nuclear_waste", { minetest.register_craftitem("elepower_nuclear:fuel_rod_empty", { description = "Empty Fuel Rod", - inventory_image = "elenuclear_fuel_rod_empty.png" + inventory_image = "elenuclear_fuel_rod_empty.png", + max_stack = 1, }) minetest.register_craftitem("elepower_nuclear:fuel_rod_fissile", { - description = "Fissile Fuel Rod", - inventory_image = "elenuclear_fuel_rod_fissile.png" + description = "Fissile Fuel Rod\nLasts 2 hours (7200 seconds)", + inventory_image = "elenuclear_fuel_rod_fissile.png", + groups = { fissile_fuel = 1 }, + fissile_count = 7200, + max_stack = 1, }) minetest.register_craftitem("elepower_nuclear:fuel_rod_depleted", { - description = "Depleted Fuel Rod", - inventory_image = "elenuclear_fuel_rod_depleted.png" + description = "Depleted Fuel Rod\nCan not be used in a reactor anymore", + inventory_image = "elenuclear_fuel_rod_depleted.png", + max_stack = 1, }) -------------------------- diff --git a/elepower_nuclear/fluids.lua b/elepower_nuclear/fluids.lua index dba797b..03c80a0 100644 --- a/elepower_nuclear/fluids.lua +++ b/elepower_nuclear/fluids.lua @@ -14,7 +14,7 @@ minetest.register_node("elepower_nuclear:coolant", { minetest.register_node("elepower_nuclear:coolant_hot", { description = "Coolant (hot)", - groups = {not_in_creative_inventory = 1, oddly_breakable_by_hand = 1, coolant = 1}, + groups = {not_in_creative_inventory = 1, oddly_breakable_by_hand = 1, coolant = 1, hot = 1}, tiles = {"elenuclear_hot_coolant.png"}, }) diff --git a/elepower_nuclear/init.lua b/elepower_nuclear/init.lua index 4584e55..a5e550b 100644 --- a/elepower_nuclear/init.lua +++ b/elepower_nuclear/init.lua @@ -10,3 +10,4 @@ dofile(modpath.."/craftitems.lua") dofile(modpath.."/nodes.lua") dofile(modpath.."/fluids.lua") dofile(modpath.."/crafting.lua") +dofile(modpath.."/worldgen.lua") diff --git a/elepower_nuclear/machines/enrichment_plant.lua b/elepower_nuclear/machines/enrichment_plant.lua index 45f63b9..cfd6d8f 100644 --- a/elepower_nuclear/machines/enrichment_plant.lua +++ b/elepower_nuclear/machines/enrichment_plant.lua @@ -31,7 +31,7 @@ elepm.register_crafter("elepower_nuclear:enrichment_plant", { description = "Enrichment Plant", craft_type = "enrichment", tiles = { - "elenuclear_machine_top.png", "elenuclear_machine_top.png", "elenuclear_machine_side.png", + "elenuclear_machine_top.png", "elepower_lead_block.png", "elenuclear_machine_side.png", "elenuclear_machine_side.png", "elenuclear_machine_side.png", "elenuclear_enrichment_plant.png", }, groups = {ele_user = 1, cracky = 3}, diff --git a/elepower_nuclear/machines/fission_reactor.lua b/elepower_nuclear/machines/fission_reactor.lua new file mode 100644 index 0000000..92e53da --- /dev/null +++ b/elepower_nuclear/machines/fission_reactor.lua @@ -0,0 +1,488 @@ + +--[[ + Reactor fitness check: + 8x8x8 area surrounding the core must either contain.. + Water source nodes + Neutron Absorber (with active medium) + Fluid Port (with COLD coolant available) + Also acceptable nodes: + Any fluid transfer conduit + Any reactor component + Unacceptable nodes (These raise heat INSTANTLY!): + Lava source + Hot coolant + ..in order to keep the heat below critical. Any other detected node will either be MOLTEN or ACTIVATED (TODO) (you don't want this!) + Reactor core will be replaced by a molten core when the heat reaches 100%. All components and fuel will be lost! + Do NOT run the reactor at 100% power 100% percent of the time! Keep some control rods partially inserted at all times. +]] + +local AREA_SIZE = 8 + +local function calculate_fitness(pos) + -- Calculate the heat sink percentage + -- Amount of nodes we shall count down from + local add = {x = (AREA_SIZE) / 2, y = (AREA_SIZE) / 2, z = (AREA_SIZE) / 2} + local minp = vector.subtract(pos, add) + local maxp = vector.add(pos, add) + + -- Get the vmanip mapgen object and the nodes and VoxelArea + local manip = minetest.get_voxel_manip() + local e1, e2 = manip:read_from_map(minp, maxp) + local area = VoxelArea:new{MinEdge=e1, MaxEdge=e2} + local data = manip:get_data() + + local ids = { + c_water = minetest.get_content_id("default:water_source"), + c_lava = minetest.get_content_id("default:lava"), + } + + local excession = 0 + local hu = 0 + local nodes = 0 + for i in area:iter( + minp.x, minp.y, minp.z, + maxp.x, maxp.y, maxp.z + ) do + nodes = nodes + 1 + if data[i] == ids["c_water"] then + hu = hu - 1 + elseif data[i] == ids["c_lava"] then + hu = hu + 1 + else + local dp = minetest.get_name_from_content_id(data[i]) + if excession <= 16 and (ele.helpers.get_item_group(dp, "ele_reactor_component") or + ele.helpers.get_item_group(dp, "ele_neutron_absorbant") or + ele.helpers.get_item_group(dp, "elefluid_transport_source") or + ele.helpers.get_item_group(dp, "elefluid_transport") or + ele.helpers.get_item_group(dp, "tube") or + ele.helpers.get_item_group(dp, "tubedevice")) then + hu = hu - 1 + excession = excession + 1 + elseif ele.helpers.get_item_group(dp, "hot") then + hu = hu + 1 + else + hu = hu + 1 + end + end + end + + hu = nodes + hu + + return 100 - math.floor(100 * hu / nodes), hu +end + +local function fuel_after_depletion(inv) + local fuel_count = 0 + local change = false + + local list = inv:get_list("fuel") + for i,stack in pairs(list) do + local sname = stack:get_name() + if ele.helpers.get_item_group(sname, "fissile_fuel") then + local stdef = minetest.registered_items[sname] + if stdef.fissile_count then + local meta = stack:get_meta() + local fscount = meta:get_int("fission_count") + if fscount < stdef.fissile_count then + fscount = fscount + 1 + fuel_count = fuel_count + 1 + + meta:set_int("fission_count", fscount) + meta:set_string("description", ("%s\nDepleted: %d "):format(stdef.description, + math.floor(100 * fscount / stdef.fissile_count)).." %") + else + stack = ItemStack("elepower_nuclear:fuel_rod_depleted") + end + list[i] = stack + change = true + end + end + end + + if change then + inv:set_list("fuel", list) + end + + return fuel_count +end + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("fuel") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + if not ele.helpers.get_item_group(stack:get_name(), "fissile_fuel") 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) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function get_core_formspec(heat, power) + local status = "Activate by extracting the control rods" + + if heat > 80 then + status = "!!! TEMPERATURE CRITICAL !!!" + elseif heat > 90 then + status = "!!! REACTOR CRITICAL !!!" + elseif heat > 95 then + status = "!!! REACTOR MELTDOWN IMMINENT !!!" + elseif power > 0 then + status = "Active reaction chain" + end + + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;fuel;2.5,0;3,3;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + ele.formspec.create_bar(0, 0, power, "#ff0000", true).. + ele.formspec.create_bar(0.5, 0, heat, "#ffdd11", true).. + "label[0,3;Power: \t"..power.."%]".. + "label[0,3.25;Heat: \t"..heat.."%]".. + "label[0,3.75;".. status .."]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +local function get_controller_formspec(rod_pos, selected) + -- TODO: Reactor-dependent rod count + local rods = 4 + local ctrls = {} + + for num, depth in pairs(rod_pos) do + local xoffset = (num / rods) * 8 + local sel = "" + + if num == selected then + sel = " <- " + end + + local fspc = ("label[%d,0;%s]"):format(xoffset - 0.25, depth .. " %" .. sel) + + fspc = fspc .. ele.formspec.create_bar(xoffset - 1, 0.5, 100 - depth, "#252625", true) + + table.insert(ctrls, fspc) + end + + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + table.concat( ctrls, "" ).. + "button[0,3.5;1.5,0.5;next;Next]".. + "button[1.5,3.5;1.5,0.5;prev;Previous]".. + "button[3.25,3.5;1.5,0.5;stop;SCRAM]".. + "button[5,3.5;1.5,0.5;up;Raise]".. + "button[6.5,3.5;1.5,0.5;down;Lower]".. + "tooltip[next;Select the next control rod]".. + "tooltip[prev;Select the previous control rod]".. + "tooltip[stop;Drops all the rods into the reactor core, instantly stopping it]".. + "tooltip[up;Raise selected control rod]".. + "tooltip[down;Lower selected control rod]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +local function get_port_formspec(cool, hot) + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + ele.formspec.fluid_bar(0, 0, cool).. + ele.formspec.fluid_bar(7, 0, hot).. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +local function reactor_core_timer(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local headless = false + + -- SAFEGUARD: Expect a controller to be above the core + local controller_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + local controller_node = minetest.get_node_or_nil(controller_pos) + if not controller_node or controller_node.name ~= "elepower_nuclear:fission_controller" then + -- Don't do anything without a head + headless = true + end + + local controller = minetest.get_meta(controller_pos) + + -- Only read area ever so often + -- Calculate the absorbance of heat around the core + local hp = meta:get_int("absorbance") + local absorb_tick = meta:get_int("absorb_tick") + if absorb_tick > 10 then + hp = calculate_fitness(pos) + absorb_tick = 0 + else + absorb_tick = absorb_tick + 1 + end + + meta:set_int("absorb_tick", absorb_tick) + meta:set_int("absorbance", hp) + + -- Get reactor power setting + local power_setting_target = controller:get_int("setting") + local power_setting = meta:get_int("setting") + + -- Do nothing + if headless then + power_setting = 0 + else + if not (power_setting_target == 0 and power_setting == 0) then + -- Decrease or increase power + if power_setting_target > power_setting then + power_setting = power_setting + 1 + elseif power_setting_target < power_setting then + power_setting = power_setting - 5 + end + + if power_setting < 0 then + power_setting = 0 + elseif power_setting > 100 then + power_setting = 100 + end + end + end + + if power_setting > 0 then + local fuel_reactor = fuel_after_depletion(inv) + if fuel_reactor == 0 then + -- Enforce zero power setting when no fuel present + power_setting = 0 + end + end + + -- Set power setting + meta:set_int("setting", power_setting) + + -- Get reactor heat + local heat = meta:get_int("heat") + + -- Calculate heat + if hp < 75 and power_setting > 0 then + heat = heat + (math.floor(((100-(hp/100))*power_setting)) + 1) + elseif power_setting > 5 then + local ceiling = math.floor(power_setting / 2) + if heat ~= ceiling then + if heat > ceiling then + heat = heat - 1 + else + heat = heat + 1 + end + end + elseif heat > 0 then + heat = heat - 1 + end + + if heat >= 100 then + -- TODO: Melt + print("It ded.") + minetest.set_node(pos, {name = "air"}) + return false + end + + -- Expect a fluid port below the core + local fluid_port_pos = {x = pos.x, y = pos.y - 1, z = pos.z} + local fluid_port_node = minetest.get_node_or_nil(fluid_port_pos) + if fluid_port_node ~= nil and fluid_port_node.name == "elepower_nuclear:reactor_fluid_port" then + -- TODO: Heat coolant + end + + meta:set_int("heat", heat) + meta:set_string("formspec", get_core_formspec(heat, power_setting)) + + return true +end + +local function reactor_controller_timer(pos) + local meta = minetest.get_meta(pos) + local settings = {} + local averg = 0 + + for i = 1, 4 do + table.insert(settings, meta:get_int("c" .. i)) + averg = averg + settings[i] + end + + meta:set_int("setting", 100 - (averg / 4)) + meta:set_string("formspec", get_controller_formspec(settings, meta:get_int("selected"))) + + return false +end + +local function reactor_controller_manage(pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + local selected = meta:get_int("selected") + local change = false + + if fields["next"] then + selected = selected + 1 + if selected > 4 then + selected = 1 + end + + meta:set_int("selected", selected) + change = true + elseif fields["prev"] then + selected = selected - 1 + if selected == 0 then + selected = 4 + end + + meta:set_int("selected", selected) + change = true + elseif fields["stop"] then + for i = 1, 4 do + meta:set_int("c" .. i, 100) + end + change = true + elseif fields["up"] then + local sl = meta:get_int("c"..selected) + sl = sl - 10 + + if sl <= 0 then + sl = 0 + end + + meta:set_int("c"..selected, sl) + change = true + elseif fields["down"] then + local sl = meta:get_int("c"..selected) + sl = sl + 10 + + if sl >= 100 then + sl = 100 + end + + meta:set_int("c"..selected, sl) + change = true + end + + if change then + minetest.get_node_timer(pos):start(1.0) + end +end + +local function reactor_port_timer(pos) + return false +end + +-- Reactor Core +ele.register_base_device("elepower_nuclear:fission_core", { + description = "Fission Reactor Core", + groups = { + cracky = 3, + ele_reactor_core = 1, + ele_reactor_component = 1, + }, + tiles = { + "elenuclear_fission_core_top.png", "elepower_lead_block.png", "elenuclear_fission_core_side.png", + "elenuclear_fission_core_side.png", "elenuclear_fission_core_side.png", "elenuclear_fission_core_side.png", + }, + on_timer = reactor_core_timer, + on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + inv:set_size("fuel", 9) + meta:set_int("absorb_tick", 11) + + meta:set_string("formspec", get_core_formspec(0,0,false)) + end, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = ele.default.allow_metadata_inventory_take, + + on_metadata_inventory_move = ele.default.metadata_inventory_changed, + on_metadata_inventory_put = ele.default.metadata_inventory_changed, + on_metadata_inventory_take = ele.default.metadata_inventory_changed, +}) + +-- Reactor Control +ele.register_base_device("elepower_nuclear:fission_controller", { + description = "Fission Control Module\nPlace me on top of a Fission Reactor Core", + groups = { + cracky = 3, + ele_reactor_component = 1, + }, + tiles = { + "elenuclear_fission_core_top.png", "elepower_lead_block.png", "elenuclear_fission_controller_side.png", + "elenuclear_fission_controller_side.png", "elenuclear_fission_controller_side.png", "elenuclear_fission_controller_side.png", + }, + on_timer = reactor_controller_timer, + on_receive_fields = reactor_controller_manage, + on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + meta:set_int("c1", 100) + meta:set_int("c2", 100) + meta:set_int("c3", 100) + meta:set_int("c4", 100) + + meta:set_int("setting", 0) + meta:set_int("selected", 1) + + meta:set_string("formspec", get_controller_formspec({100, 100, 100, 100}, 1)) + end +}) + +-- Reactor Fluid Port +ele.register_base_device("elepower_nuclear:reactor_fluid_port", { + description = "Reactor Fluid Port\nPlace me on the bottom of a Fission Reactor Core", + groups = { + cracky = 3, + ele_reactor_component = 1, + ele_port = 1, + fluid_container = 1, + }, + tiles = { + "elenuclear_machine_top.png", "elepower_lead_block.png", "elenuclear_machine_side.png^elepower_power_port.png", + "elenuclear_machine_side.png^elepower_power_port.png", "elenuclear_machine_side.png^elepower_power_port.png", + "elenuclear_machine_side.png^elepower_power_port.png", + }, + on_timer = reactor_port_timer, + on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + meta:set_string("formspec", get_port_formspec()) + end, + fluid_buffers = { + cool = { + capacity = 16000, + accepts = {"default:water_source", "elepower_nuclear:coolant"}, + drainable = false, + }, + hot = { + capacity = 16000, + accepts = {"elepower_nuclear:coolant_hot"}, + drainable = true, + } + }, +}) diff --git a/elepower_nuclear/machines/init.lua b/elepower_nuclear/machines/init.lua index 85685b2..25019a9 100644 --- a/elepower_nuclear/machines/init.lua +++ b/elepower_nuclear/machines/init.lua @@ -1,13 +1,6 @@ local mp = elenuclear.modpath .. "/machines/" -minetest.register_node("elepower_nuclear:machine_block", { - description = "Radiation-shielded Lead Machine Chassis", - tiles = { - "elenuclear_machine_top.png", "elepower_lead_block.png", "elenuclear_machine_block.png", - "elenuclear_machine_block.png", "elenuclear_machine_block.png", "elenuclear_machine_block.png", - }, - groups = {cracky = 3}, -}) - dofile(mp.."enrichment_plant.lua") +dofile(mp.."fission_reactor.lua") + diff --git a/elepower_nuclear/nodes.lua b/elepower_nuclear/nodes.lua index 7eff573..9c5f1be 100644 --- a/elepower_nuclear/nodes.lua +++ b/elepower_nuclear/nodes.lua @@ -1,2 +1,19 @@ dofile(elenuclear.modpath.."/machines/init.lua") + +minetest.register_node("elepower_nuclear:machine_block", { + description = "Radiation-shielded Lead Machine Chassis", + tiles = { + "elenuclear_machine_top.png", "elepower_lead_block.png", "elenuclear_machine_block.png", + "elenuclear_machine_block.png", "elenuclear_machine_block.png", "elenuclear_machine_block.png", + }, + groups = {cracky = 3}, +}) + +minetest.register_node("elepower_nuclear:stone_with_uranium", { + description = "Uranium Ore", + tiles = {"default_stone.png^elenuclear_mineral_uranium.png"}, + groups = {cracky = 2}, + drop = 'elepower_nuclear:uranium_lump', + sounds = default.node_sound_stone_defaults(), +}) diff --git a/elepower_nuclear/textures/elenuclear_fission_controller_side.png b/elepower_nuclear/textures/elenuclear_fission_controller_side.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5f939b0080d7e7723d9ead079609cbf0e6833e GIT binary patch literal 2865 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 literal 0 HcmV?d00001 diff --git a/elepower_nuclear/textures/elenuclear_mineral_uranium.png b/elepower_nuclear/textures/elenuclear_mineral_uranium.png new file mode 100644 index 0000000000000000000000000000000000000000..e62c8ab0c2c6e03fae95d3200c78b9d55e039317 GIT binary patch literal 1550 zcmV+p2J!icP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+TB-Ka^yA){pTri1Ong!9*1ky+#tu#<0853u|3{W zsfyGsQV@mhJ%HV&|NU#2zi_ZkY@Cl8QV14@OD=K7MD0HEx{`J4dT#7Bc_uga1BOU2 z%D&ZbWgYx`AK8je6fy?4CB(x3KquAu5NcdQG`@Zb3Y)Bd( zL#Su{IL}ua@HO+|By#Y9qQlj(jWHz5m92}&TbquK%4xpm%Te^=-dsx=K5-Wki>sR+ z3fvc!j4|TM;&@9lpzO&xBJ^5*0jZAX&j#DG>w4L5><_8r0WVslr9aog+r(%0ksZr~o5zU2wa3(%>jb z8o+0%po2ilw=cBJre&^@!f+!sU=KkV;gxTl<|B*7m<2^-_0ARi;#q0%Vj@RmEMXZC zp>dMxSAwte_h^9s zr{GZb;+^+C_~_LqpM!*1VIjmYJ8F&+UGy=;7&WGtjfy(;8Z@eE(wsO6I<8Ns$D}Ex zoMALWbH>{l3vw=8q`2ZsD6wcsC0908s;j<+8mrb+bK@orb=*RWO%NB` zyY|%c0M&*JH~a`A4jsvie4}yYo64u3F!XHXx@78k&%YbHUb_w6u^|$5F1!H z<=87vD66M2seP(=DNh78Khur=Lq)MR*l0jPIIr{$hP4h>LVXhG&WZj zb53hOdC}D^q-QcaY@x4iN!Mt;tKe3Ie-NYLKdt!(x<$L~7qr6#00006VoOIv07(F3 z0E?LvxDx;X010qNS#tmYE+YT{E+YYWr9XB6000McNliru;s+QM4=@V5l!gER02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{0090;L_t(I%e9i-N&;~Z#eXxq z8}y8kABdXdMQsxJ1bq-#pjet{(Tj9bZ&b1E{!bS|kcBAeT+T3O&hIex{QAOw$`>2e z(xEDQEv+hGt2k&>jzt_8-QU>aEMB@;PUS?59(o3FP&*L;3gwJvbFps+&1x!S1S=R% zuWh3UYlXNxi&V{0M}InK?spWtAj{t{IToBa*})?R7YIDeBaT-sU=nw3aB^>EX>4U6ba`-PAZ2)IW&i+q+U-_bmfR=| z{bv=k1SBC4%K>c8nH|jX=kl<-s*>(>Cz+o)F;##C*5h6Y+nxXX-Q8cf*r(uvCW|>n zk1OPmxnN>`U1j#GA3#VtP}XYA)KZ+}})fm|OH<#R98=Y_Hr zv26pF#cfDv8Sq=ND_fE9wj9=dU19l{Ej@FS8oIC(K4E$BpUMQK$2CoMwu8ib_#S*p-$%< z8#TBX_~e9*IP;lN70Pf@2RR1~#=u}W ziM7+s-5Yc2B>o=W9EjlG!JHe^eS*1fdHWt~N0~1=nGB6G9H4qZ_4V9OD{N)FDL)+D zkAF6NcKoC0|DovUV`O|EMGA`F_-1+@@kSg|Z72J=dAw<_$xn`wR>Gdn$fo+>NseiU zZ!`4jEy{6B%G)!xyiDTEz6#1i?3(Aa_)M-&jdI)Yc>}>)&@KhK{3L%ZT>g!Bm`#k% zbg#ZQQtc}SD5yH8!CQF4U@D4yp;4|$pnqq_TI7i!&b*fuyvoPKk>VY=nC-%7#Njpo zuMusBm~K|{i|UP;-)Oj>fM}_VF>K|qvN2+Mg``E{3$+W-Hsi?FRzl&M^G@_^D}OX( z_~#S+F|q5K3WNR)*G}x_Z~Ttuf{Suj-nKa%x&3fIdknpvHtsuAf8`juNB3*T(H}+s zfgoltJBi(Y2#0ivU6>W?}6JM5s`c zuvE+&Kr|{k@exSil78HCPGunWAU<#`)}SaTzTcnGG*J->a;1! zlA`qF1S*;FC{BSX)x=C{5+Y%Oaf0&(YdnWPj+yCHj3y0;a&+{Q&DC9b@Q90R3;M3# zCwPZ11EYEZPEbvFV>mm%;OmE7dHRj(1C33>w=B*YQp|`#2EP3lej)V_=>36tHdUDe P00000NkvXXu0mjf{O`J< diff --git a/elepower_nuclear/textures/gui_sheen.png b/elepower_nuclear/textures/gui_sheen.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0b38d1b25aaf618c2c4d60fef7de8fcdca8969 GIT binary patch literal 4223 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 literal 0 HcmV?d00001 diff --git a/elepower_nuclear/worldgen.lua b/elepower_nuclear/worldgen.lua new file mode 100644 index 0000000..824ecb7 --- /dev/null +++ b/elepower_nuclear/worldgen.lua @@ -0,0 +1,39 @@ + +-------------- +-- Worldgen -- +-------------- + +-- Uranium + +minetest.register_ore({ + ore_type = "scatter", + ore = "elepower_nuclear:stone_with_uranium", + wherein = "default:stone", + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 5, + clust_size = 3, + y_max = 846, + y_min = 248, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "elepower_nuclear:stone_with_uranium", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = -248, + y_min = -846, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "elepower_nuclear:stone_with_uranium", + wherein = "default:stone", + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 8, + clust_size = 3, + y_max = -1248, + y_min = -1846, +})