From a08ba2bb93d7683b619a0e6b0bf00e3afd614ae4 Mon Sep 17 00:00:00 2001 From: cx384 <cx384@proton.me> Date: Mon, 22 Jan 2024 18:27:54 +0100 Subject: [PATCH] Get rid of deprecated metadata (#628) --- technic/machines/HV/nuclear_reactor.lua | 78 +++++++++++++++++++++++++-------------- 1 files changed, 50 insertions(+), 28 deletions(-) diff --git a/technic/machines/HV/nuclear_reactor.lua b/technic/machines/HV/nuclear_reactor.lua index 3377710..431b2ee 100644 --- a/technic/machines/HV/nuclear_reactor.lua +++ b/technic/machines/HV/nuclear_reactor.lua @@ -31,24 +31,26 @@ }) local function make_reactor_formspec(meta) - local f = "size[8,9]".. - "label[0,0;"..S("Nuclear Reactor Rod Compartment").."]".. - "list[current_name;src;2,1;3,2;]".. - "list[current_player;main;0,5;8,4;]".. - "listring[]".. - "button[5.5,1.5;2,1;start;Start]".. - "checkbox[5.5,2.5;autostart;automatic Start;"..meta:get_string("autostart").."]" + local f = + "formspec_version[4]".. + "size[10.75,10.75]".. + "label[0.2,0.4;"..S("Nuclear Reactor Rod Compartment").."]".. + "list[current_name;src;1.5,1;3,2;]".. + "list[current_player;main;0.5,5.5;8,4;]".. + "listring[]".. + "button[5.7,1;2,1;start;Start]".. + "checkbox[5.7,2.75;autostart;automatic Start;"..meta:get_string("autostart").."]" if not digiline_remote_path then return f end local digiline_enabled = meta:get_string("enable_digiline") - f = f.."checkbox[0.5,2.8;enable_digiline;Enable Digiline;"..digiline_enabled.."]" + f = f.."checkbox[1.5,3.75;enable_digiline;Enable Digiline channel;"..digiline_enabled.."]" if digiline_enabled ~= "true" then return f end return f.. - "button_exit[4.6,3.69;2,1;save;Save]".. - "field[1,4;4,1;remote_channel;Digiline Remote Channel;${remote_channel}]" + "field[2,4.2;4.25,1;remote_channel;;${remote_channel}]" .. + "button_exit[6.5,4.2;2,1;save;Save]" end local SS_OFF = 0 @@ -140,8 +142,11 @@ --]] local function reactor_structure_badness(pos) local vm = VoxelManip() + + -- Blast-resistant Concrete Block layer outer positions local pos1 = vector.subtract(pos, 3) local pos2 = vector.add(pos, 3) + local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2) local data = vm:get_data() local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge}) @@ -157,16 +162,19 @@ for z = pos1.z, pos2.z do for y = pos1.y, pos2.y do for x = pos1.x, pos2.x do + -- In the entire volume, make sure there is: local cid = data[area:index(x, y, z)] if x == pos1.x or x == pos2.x or y == pos1.y or y == pos2.y or z == pos1.z or z == pos2.z then + -- r=3 : Blast-resistant Concrete Block shell if cid == c_blast_concrete then blast_layer = blast_layer + 1 end elseif x == pos1.x+1 or x == pos2.x-1 or y == pos1.y+1 or y == pos2.y-1 or z == pos1.z+1 or z == pos2.z-1 then + -- r=2 : Lead Block shell if cid == c_lead then lead_layer = lead_layer + 1 elseif cid == c_steel then @@ -175,6 +183,7 @@ elseif x == pos1.x+2 or x == pos2.x-2 or y == pos1.y+2 or y == pos2.y-2 or z == pos1.z+2 or z == pos2.z-2 then + -- r=1 : Water cooling if cid == c_water_source or cid == c_water_flowing then water_layer = water_layer + 1 end @@ -184,6 +193,8 @@ end if steel_layer >= 96 then + -- Legacy: convert stainless steel to lead + -- Why don't we accept both without conversion? for z = pos1.z+1, pos2.z-1 do for y = pos1.y+1, pos2.y-1 do for x = pos1.x+1, pos2.x-1 do @@ -206,6 +217,7 @@ if water_layer > 25 then water_layer = 25 end if lead_layer > 96 then lead_layer = 96 end if blast_layer > 216 then blast_layer = 216 end + -- Amount of missing blocks return (25 - water_layer) + (96 - lead_layer) + (216 - blast_layer) end @@ -217,24 +229,33 @@ local function start_reactor(pos, meta) + local correct_fuel_count = 6 + local msg_fuel_missing = "Error: You need to insert " .. correct_fuel_count .. " pieces of Uranium Fuel." + if minetest.get_node(pos).name ~= "technic:hv_nuclear_reactor_core" then - return false + return msg_fuel_missing end local inv = meta:get_inventory() if inv:is_empty("src") then - return false + return msg_fuel_missing end local src_list = inv:get_list("src") - local correct_fuel_count = 0 + local fuel_count = 0 for _, src_stack in pairs(src_list) do if src_stack and src_stack:get_name() == fuel_type then - correct_fuel_count = correct_fuel_count + 1 + fuel_count = fuel_count + 1 end end - -- Check that the reactor is complete and has the correct fuel - if correct_fuel_count ~= 6 or reactor_structure_badness(pos) ~= 0 then - return false + -- Check that the has the correct fuel + if fuel_count ~= correct_fuel_count then + return msg_fuel_missing end + + -- Check that the reactor is complete + if reactor_structure_badness(pos) ~= 0 then + return "Error: The power plant seems to be built incorrectly." + end + meta:set_int("burn_time", 1) technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active") meta:set_int("HV_EU_supply", power_supply) @@ -242,7 +263,8 @@ src_stack:take_item() inv:set_stack("src", idx, src_stack) end - return true + + return nil end @@ -257,7 +279,7 @@ local accum_badness = meta:get_int("structure_accumulated_badness") if badness == 0 then if accum_badness ~= 0 then - meta:set_int("structure_accumulated_badness", accum_badness - 4) + meta:set_int("structure_accumulated_badness", math.max(accum_badness - 4, 0)) siren_clear(pos, meta) end else @@ -281,13 +303,13 @@ "fuel used", 6, true) end if meta:get_string("autostart") == "true" then - if start_reactor(pos, meta) then + if not start_reactor(pos, meta) then return end end meta:set_int("HV_EU_supply", 0) meta:set_int("burn_time", 0) - meta:set_string("infotext", S("%s Idle"):format(reactor_desc)) + meta:set_string("infotext", S("@1 Idle", reactor_desc)) technic.swap_node(pos, "technic:hv_nuclear_reactor_core") meta:set_int("structure_accumulated_badness", 0) siren_clear(pos, meta) @@ -313,11 +335,11 @@ meta:set_string("remote_channel", fields.remote_channel) end if fields.start then - local b = start_reactor(pos, meta) - if b then + local start_error_msg = start_reactor(pos, meta) + if not start_error_msg then minetest.chat_send_player(player_name, "Start successful") else - minetest.chat_send_player(player_name, "Error") + minetest.chat_send_player(player_name, start_error_msg) end end if fields.autostart then @@ -385,11 +407,11 @@ melt_down_reactor(pos) end elseif msg.command == "start" then - local b = start_reactor(pos, meta) - if b then + local start_error_msg = start_reactor(pos, meta) + if not start_error_msg then digiline_remote.send_to_node(pos, channel, "Start successful", 6, true) else - digiline_remote.send_to_node(pos, channel, "Error", 6, true) + digiline_remote.send_to_node(pos, channel, start_error_msg, 6, true) end end end @@ -455,7 +477,7 @@ technic_run = run, technic_on_disable = function(pos, node) local timer = minetest.get_node_timer(pos) - timer:start(1) + timer:start(1) end, on_timer = function(pos, node) local meta = minetest.get_meta(pos) -- Gitblit v1.8.0