2013-07-11 01:04:58 +02:00
|
|
|
-- The enriched uranium rod driven EU generator.
|
|
|
|
-- A very large and advanced machine providing vast amounts of power.
|
2014-05-04 15:23:34 -04:00
|
|
|
-- Very efficient but also expensive to run as it needs uranium. (10000EU 86400 ticks (one week))
|
2013-07-11 01:04:58 +02:00
|
|
|
-- Provides HV EUs that can be down converted as needed.
|
|
|
|
--
|
|
|
|
-- The nuclear reactor core needs water and a protective shield to work.
|
|
|
|
-- This is checked now and then and if the machine is tampered with... BOOM!
|
2013-07-12 19:23:29 -04:00
|
|
|
|
2013-07-17 15:34:35 -04:00
|
|
|
local burn_ticks = 7 * 24 * 60 * 60 -- (seconds).
|
|
|
|
local power_supply = 100000 -- EUs
|
|
|
|
local fuel_type = "technic:uranium_fuel" -- The reactor burns this stuff
|
2013-07-12 19:23:29 -04:00
|
|
|
|
2013-10-30 13:45:32 -04:00
|
|
|
local S = technic.getter
|
2013-07-11 01:04:58 +02:00
|
|
|
|
|
|
|
-- FIXME: recipe must make more sense like a rod recepticle, steam chamber, HV generator?
|
2013-07-12 19:23:29 -04:00
|
|
|
minetest.register_craft({
|
|
|
|
output = 'technic:hv_nuclear_reactor_core',
|
|
|
|
recipe = {
|
|
|
|
{'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot'},
|
2014-07-06 17:13:11 +01:00
|
|
|
{'technic:stainless_steel_ingot', 'technic:machine_casing', 'technic:stainless_steel_ingot'},
|
2013-07-12 19:23:29 -04:00
|
|
|
{'technic:stainless_steel_ingot', 'technic:hv_cable', 'technic:stainless_steel_ingot'},
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2013-07-11 01:04:58 +02:00
|
|
|
local generator_formspec =
|
2013-07-12 19:23:29 -04:00
|
|
|
"invsize[8,9;]"..
|
2013-10-30 13:45:32 -04:00
|
|
|
"label[0,0;"..S("Nuclear Reactor Rod Compartment").."]"..
|
2013-07-12 19:23:29 -04:00
|
|
|
"list[current_name;src;2,1;3,2;]"..
|
|
|
|
"list[current_player;main;0,5;8,4;]"
|
2013-07-11 01:04:58 +02:00
|
|
|
|
|
|
|
-- "Boxy sphere"
|
2013-07-11 23:01:13 +02:00
|
|
|
local nodebox = {
|
2013-07-12 19:23:29 -04:00
|
|
|
{ -0.353, -0.353, -0.353, 0.353, 0.353, 0.353 }, -- Box
|
|
|
|
{ -0.495, -0.064, -0.064, 0.495, 0.064, 0.064 }, -- Circle +-x
|
|
|
|
{ -0.483, -0.128, -0.128, 0.483, 0.128, 0.128 },
|
|
|
|
{ -0.462, -0.191, -0.191, 0.462, 0.191, 0.191 },
|
|
|
|
{ -0.433, -0.249, -0.249, 0.433, 0.249, 0.249 },
|
|
|
|
{ -0.397, -0.303, -0.303, 0.397, 0.303, 0.303 },
|
|
|
|
{ -0.305, -0.396, -0.305, 0.305, 0.396, 0.305 }, -- Circle +-y
|
|
|
|
{ -0.250, -0.432, -0.250, 0.250, 0.432, 0.250 },
|
|
|
|
{ -0.191, -0.461, -0.191, 0.191, 0.461, 0.191 },
|
|
|
|
{ -0.130, -0.482, -0.130, 0.130, 0.482, 0.130 },
|
|
|
|
{ -0.066, -0.495, -0.066, 0.066, 0.495, 0.066 },
|
|
|
|
{ -0.064, -0.064, -0.495, 0.064, 0.064, 0.495 }, -- Circle +-z
|
|
|
|
{ -0.128, -0.128, -0.483, 0.128, 0.128, 0.483 },
|
|
|
|
{ -0.191, -0.191, -0.462, 0.191, 0.191, 0.462 },
|
|
|
|
{ -0.249, -0.249, -0.433, 0.249, 0.249, 0.433 },
|
|
|
|
{ -0.303, -0.303, -0.397, 0.303, 0.303, 0.397 },
|
2013-07-11 23:01:13 +02:00
|
|
|
}
|
2013-07-11 01:04:58 +02:00
|
|
|
|
2013-07-12 19:23:29 -04:00
|
|
|
minetest.register_node("technic:hv_nuclear_reactor_core", {
|
Rationalise machine terminology
All electrically-powered machines now consistently indicate their
tier (supply voltage) in their names. As this implies that they are
electrically powered, the furnaces no longer have "Electric" in their
names. The fuel-fired equivalents of electric machines, which exist
for alloy furnace and furnace, now say "Fuel-Fired" to distinguish them.
(The fuel-fired alloy furnace used to say "Coal", which was inaccurate
because it uses any fuel. The fuel-fired furnace, from the default mod,
used to just be called "Furnace", which is ambiguous.)
Electric power generators now consistently indicate their tier and have
the word "Generator" in their names. This makes their purpose much
clearer, and makes obvious craft guide searches produce useful results.
The fuel-fired generators, previously just (ambiguously) called
"Generator", are now explicitly "Fuel-Fired".
2014-06-20 16:58:52 +01:00
|
|
|
description = S("Nuclear %s Generator Core"):format("HV"),
|
2013-07-12 19:23:29 -04:00
|
|
|
tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
|
|
|
|
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
|
|
|
|
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
|
|
|
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
|
|
|
|
legacy_facedir_simple = true,
|
|
|
|
sounds = default.node_sound_wood_defaults(),
|
|
|
|
drawtype="nodebox",
|
|
|
|
paramtype = "light",
|
2013-07-17 15:34:35 -04:00
|
|
|
stack_max = 1,
|
2013-07-12 19:23:29 -04:00
|
|
|
node_box = {
|
|
|
|
type = "fixed",
|
|
|
|
fixed = nodebox
|
|
|
|
},
|
|
|
|
on_construct = function(pos)
|
2013-07-17 15:34:35 -04:00
|
|
|
local meta = minetest.get_meta(pos)
|
Rationalise machine terminology
All electrically-powered machines now consistently indicate their
tier (supply voltage) in their names. As this implies that they are
electrically powered, the furnaces no longer have "Electric" in their
names. The fuel-fired equivalents of electric machines, which exist
for alloy furnace and furnace, now say "Fuel-Fired" to distinguish them.
(The fuel-fired alloy furnace used to say "Coal", which was inaccurate
because it uses any fuel. The fuel-fired furnace, from the default mod,
used to just be called "Furnace", which is ambiguous.)
Electric power generators now consistently indicate their tier and have
the word "Generator" in their names. This makes their purpose much
clearer, and makes obvious craft guide searches produce useful results.
The fuel-fired generators, previously just (ambiguously) called
"Generator", are now explicitly "Fuel-Fired".
2014-06-20 16:58:52 +01:00
|
|
|
meta:set_string("infotext", S("Nuclear %s Generator Core"):format("HV"))
|
2013-07-12 19:23:29 -04:00
|
|
|
meta:set_int("HV_EU_supply", 0)
|
2013-07-17 15:34:35 -04:00
|
|
|
-- Signal to the switching station that this device burns some
|
|
|
|
-- sort of fuel and needs special handling
|
|
|
|
meta:set_int("HV_EU_from_fuel", 1)
|
2013-07-12 19:23:29 -04:00
|
|
|
meta:set_int("burn_time", 0)
|
|
|
|
meta:set_string("formspec", generator_formspec)
|
|
|
|
local inv = meta:get_inventory()
|
|
|
|
inv:set_size("src", 6)
|
|
|
|
end,
|
2013-11-27 12:28:56 -05:00
|
|
|
can_dig = technic.machine_can_dig,
|
|
|
|
allow_metadata_inventory_put = technic.machine_inventory_put,
|
|
|
|
allow_metadata_inventory_take = technic.machine_inventory_take,
|
|
|
|
allow_metadata_inventory_move = technic.machine_inventory_move,
|
2013-07-12 19:23:29 -04:00
|
|
|
})
|
|
|
|
|
|
|
|
minetest.register_node("technic:hv_nuclear_reactor_core_active", {
|
|
|
|
tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
|
|
|
|
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
|
|
|
|
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
|
|
|
|
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
|
|
|
|
legacy_facedir_simple = true,
|
|
|
|
sounds = default.node_sound_wood_defaults(),
|
|
|
|
drop="technic:hv_nuclear_reactor_core",
|
|
|
|
drawtype="nodebox",
|
|
|
|
light_source = 15,
|
|
|
|
paramtype = "light",
|
|
|
|
node_box = {
|
|
|
|
type = "fixed",
|
|
|
|
fixed = nodebox
|
|
|
|
},
|
2013-11-27 12:28:56 -05:00
|
|
|
can_dig = technic.machine_can_dig,
|
|
|
|
allow_metadata_inventory_put = technic.machine_inventory_put,
|
|
|
|
allow_metadata_inventory_take = technic.machine_inventory_take,
|
|
|
|
allow_metadata_inventory_move = technic.machine_inventory_move,
|
2013-07-12 19:23:29 -04:00
|
|
|
})
|
2013-07-11 01:04:58 +02:00
|
|
|
|
|
|
|
local check_reactor_structure = function(pos)
|
2013-07-17 15:34:35 -04:00
|
|
|
-- The reactor consists of a 9x9x9 cube structure
|
2013-07-12 19:23:29 -04:00
|
|
|
-- A cross section through the middle:
|
2013-07-17 15:34:35 -04:00
|
|
|
-- CCCC CCCC
|
|
|
|
-- CBBB BBBC
|
|
|
|
-- CBSS SSBC
|
|
|
|
-- CBSWWWSBC
|
|
|
|
-- CBSW#WSBC
|
|
|
|
-- CBSW|WSBC
|
|
|
|
-- CBSS|SSBC
|
|
|
|
-- CBBB|BBBC
|
|
|
|
-- CCCC|CCCC
|
|
|
|
-- C = Concrete, B = Blast resistant concrete, S = Stainless Steel,
|
|
|
|
-- W = water node, # = reactor core, | = HV cable
|
2013-07-12 19:23:29 -04:00
|
|
|
-- The man-hole and the HV cable is only in the middle
|
|
|
|
-- The man-hole is optional
|
|
|
|
|
2013-07-17 15:34:35 -04:00
|
|
|
local vm = VoxelManip()
|
|
|
|
local pos1 = vector.subtract(pos, 4)
|
|
|
|
local pos2 = vector.add(pos, 4)
|
|
|
|
local MinEdge, MaxEdge = vm:read_from_map(pos1, pos2)
|
|
|
|
local data = vm:get_data()
|
|
|
|
local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge})
|
2013-07-12 19:23:29 -04:00
|
|
|
|
2013-07-17 15:34:35 -04:00
|
|
|
local c_concrete = minetest.get_content_id("technic:concrete")
|
|
|
|
local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete")
|
|
|
|
local c_stainless_steel = minetest.get_content_id("technic:stainless_steel_block")
|
|
|
|
local c_water_source = minetest.get_content_id("default:water_source")
|
|
|
|
local c_water_flowing = minetest.get_content_id("default:water_flowing")
|
2013-07-12 19:23:29 -04:00
|
|
|
|
2013-07-17 15:34:35 -04:00
|
|
|
local concretelayer, blastlayer, steellayer, waterlayer = 0, 0, 0, 0
|
2013-07-12 19:23:29 -04:00
|
|
|
|
2013-07-17 15:34:35 -04:00
|
|
|
for z = pos1.z, pos2.z do
|
|
|
|
for y = pos1.y, pos2.y do
|
|
|
|
for x = pos1.x, pos2.x do
|
|
|
|
-- If the position is in the outer layer
|
|
|
|
if x == pos1.x or x == pos2.x or
|
|
|
|
y == pos1.y or y == pos2.y or
|
|
|
|
z == pos1.z or z == pos2.z then
|
|
|
|
if data[area:index(x, y, z)] == c_concrete then
|
|
|
|
concretelayer = concretelayer + 1
|
|
|
|
end
|
|
|
|
elseif x == pos1.x+1 or x == pos2.x-1 or
|
|
|
|
y == pos1.y+1 or y == pos2.y-1 or
|
|
|
|
z == pos1.z+1 or z == pos2.z-1 then
|
|
|
|
if data[area:index(x, y, z)] == c_blast_concrete then
|
|
|
|
blastlayer = blastlayer + 1
|
|
|
|
end
|
|
|
|
elseif x == pos1.x+2 or x == pos2.x-2 or
|
|
|
|
y == pos1.y+2 or y == pos2.y-2 or
|
|
|
|
z == pos1.z+2 or z == pos2.z-2 then
|
|
|
|
if data[area:index(x, y, z)] == c_stainless_steel then
|
|
|
|
steellayer = steellayer + 1
|
|
|
|
end
|
|
|
|
elseif x == pos1.x+3 or x == pos2.x-3 or
|
|
|
|
y == pos1.y+3 or y == pos2.y-3 or
|
|
|
|
z == pos1.z+3 or z == pos2.z-3 then
|
|
|
|
local cid = data[area:index(x, y, z)]
|
|
|
|
if cid == c_water_source or cid == c_water_flowing then
|
|
|
|
waterlayer = waterlayer + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if waterlayer >= 25 and
|
|
|
|
steellayer >= 96 and
|
|
|
|
blastlayer >= 216 and
|
|
|
|
concretelayer >= 384 then
|
|
|
|
return true
|
2013-07-12 19:23:29 -04:00
|
|
|
end
|
|
|
|
end
|
2013-07-11 01:04:58 +02:00
|
|
|
|
|
|
|
local explode_reactor = function(pos)
|
2013-07-17 15:34:35 -04:00
|
|
|
print("A reactor exploded at "..minetest.pos_to_string(pos))
|
|
|
|
end
|
|
|
|
|
|
|
|
local function damage_nearby_players(pos)
|
|
|
|
local objs = minetest.get_objects_inside_radius(pos, 4)
|
|
|
|
for _, o in pairs(objs) do
|
|
|
|
if o:is_player() then
|
|
|
|
o:set_hp(math.max(o:get_hp() - 2, 0))
|
|
|
|
end
|
|
|
|
end
|
2013-07-12 19:23:29 -04:00
|
|
|
end
|
2013-07-11 01:04:58 +02:00
|
|
|
|
2013-07-12 19:23:29 -04:00
|
|
|
minetest.register_abm({
|
|
|
|
nodenames = {"technic:hv_nuclear_reactor_core", "technic:hv_nuclear_reactor_core_active"},
|
|
|
|
interval = 1,
|
|
|
|
chance = 1,
|
|
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
2013-07-17 15:34:35 -04:00
|
|
|
local meta = minetest.get_meta(pos)
|
Rationalise machine terminology
All electrically-powered machines now consistently indicate their
tier (supply voltage) in their names. As this implies that they are
electrically powered, the furnaces no longer have "Electric" in their
names. The fuel-fired equivalents of electric machines, which exist
for alloy furnace and furnace, now say "Fuel-Fired" to distinguish them.
(The fuel-fired alloy furnace used to say "Coal", which was inaccurate
because it uses any fuel. The fuel-fired furnace, from the default mod,
used to just be called "Furnace", which is ambiguous.)
Electric power generators now consistently indicate their tier and have
the word "Generator" in their names. This makes their purpose much
clearer, and makes obvious craft guide searches produce useful results.
The fuel-fired generators, previously just (ambiguously) called
"Generator", are now explicitly "Fuel-Fired".
2014-06-20 16:58:52 +01:00
|
|
|
local machine_name = S("Nuclear %s Generator Core"):format("HV")
|
2013-07-17 15:34:35 -04:00
|
|
|
local burn_time = meta:get_int("burn_time") or 0
|
2013-07-11 01:04:58 +02:00
|
|
|
|
2013-07-17 15:34:35 -04:00
|
|
|
if burn_time >= burn_ticks or burn_time == 0 then
|
2013-07-12 19:23:29 -04:00
|
|
|
local inv = meta:get_inventory()
|
|
|
|
if not inv:is_empty("src") then
|
|
|
|
local srclist = inv:get_list("src")
|
2013-07-17 15:34:35 -04:00
|
|
|
local correct_fuel_count = 0
|
2013-07-12 19:23:29 -04:00
|
|
|
for _, srcstack in pairs(srclist) do
|
|
|
|
if srcstack then
|
2013-07-17 15:34:35 -04:00
|
|
|
if srcstack:get_name() == fuel_type then
|
2013-07-12 19:23:29 -04:00
|
|
|
correct_fuel_count = correct_fuel_count + 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2013-07-17 15:34:35 -04:00
|
|
|
-- Check that the reactor is complete as well
|
|
|
|
-- as the correct number of correct fuel
|
|
|
|
if correct_fuel_count == 6 and
|
|
|
|
check_reactor_structure(pos) then
|
|
|
|
meta:set_int("burn_time", 1)
|
2013-12-10 20:14:39 -05:00
|
|
|
technic.swap_node(pos, "technic:hv_nuclear_reactor_core_active")
|
2013-07-17 15:34:35 -04:00
|
|
|
meta:set_int("HV_EU_supply", power_supply)
|
|
|
|
for idx, srcstack in pairs(srclist) do
|
|
|
|
srcstack:take_item()
|
|
|
|
inv:set_stack("src", idx, srcstack)
|
2013-07-12 19:23:29 -04:00
|
|
|
end
|
2013-07-17 15:34:35 -04:00
|
|
|
return
|
2013-07-12 19:23:29 -04:00
|
|
|
end
|
|
|
|
end
|
2013-07-17 15:34:35 -04:00
|
|
|
meta:set_int("HV_EU_supply", 0)
|
|
|
|
meta:set_int("burn_time", 0)
|
2013-10-30 13:45:32 -04:00
|
|
|
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
2013-12-10 20:14:39 -05:00
|
|
|
technic.swap_node(pos, "technic:hv_nuclear_reactor_core")
|
2013-07-17 15:34:35 -04:00
|
|
|
elseif burn_time > 0 then
|
|
|
|
damage_nearby_players(pos)
|
|
|
|
if not check_reactor_structure(pos) then
|
|
|
|
explode_reactor(pos)
|
|
|
|
end
|
|
|
|
burn_time = burn_time + 1
|
|
|
|
meta:set_int("burn_time", burn_time)
|
|
|
|
local percent = math.floor(burn_time / burn_ticks * 100)
|
2013-10-30 13:45:32 -04:00
|
|
|
meta:set_string("infotext", machine_name.." ("..percent.."%)")
|
2013-07-17 15:34:35 -04:00
|
|
|
meta:set_int("HV_EU_supply", power_supply)
|
2013-07-11 23:01:13 +02:00
|
|
|
end
|
2013-07-12 19:23:29 -04:00
|
|
|
end
|
|
|
|
})
|
2013-07-11 01:04:58 +02:00
|
|
|
|
2013-07-17 15:34:35 -04:00
|
|
|
technic.register_machine("HV", "technic:hv_nuclear_reactor_core", technic.producer)
|
|
|
|
technic.register_machine("HV", "technic:hv_nuclear_reactor_core_active", technic.producer)
|
|
|
|
|