elepower/elepower_nuclear/machines/fusion_reactor.lua

194 lines
7.2 KiB
Lua

local iC = 1 -- Casing
local iR = 2 -- Controller
local iI = 3 -- Inputs
local iO = 4 -- Outputs
local iE = 5 -- Energy Inputs
local iX = 6 -- Center nodes
-- Width and Height of the structure
local structure_size = 15
-- This is the reactor structure (y 0 to 2)
local reactor_structure = {}
local controller_pos = {x = 7, z = 14}
-- Determine the validity of the structure from the position of the controller
local function determine_structure(pos, player)
local node = minetest.get_node_or_nil(pos)
if not node then return nil end
local hsize = math.floor(structure_size / 2)
local hindex = {x = hsize, y = 1, z = structure_size}
-- TODO: Determine build direction
--local front = ele.helpers.face_front(pos, node.param2)
-- Load appropriate map piece into memory for easier parsing
local manip = minetest.get_voxel_manip()
local e1, e2 = manip:read_from_map(vector.subtract(pos, hindex), vector.add(pos, hindex))
local area = VoxelArea:new{MinEdge=e1, MaxEdge=e2}
local data = manip:get_data()
local success = true
local inputs = {}
local outputs = {}
local power = {}
for y = -1, 1 do
if not success then break end
local arr = reactor_structure[(y + 2)]
for i = 1, #arr do
local ntype = arr[i]
local indx = i - 1
if ntype ~= 0 then
local z = math.floor(indx / structure_size)
local x = math.floor(indx % structure_size)
local relX = controller_pos.x - x
local relZ = controller_pos.z - z
local scan_pos = vector.add(pos, {x = relX, y = y, z = relZ})
local index = area:indexp(scan_pos)
if data[index] ~= ntype then
minetest.chat_send_player(player, ('Incorrect node at %d,%d,%d; expected %s, found %s'):format(
scan_pos.x,scan_pos.y,scan_pos.z,minetest.get_name_from_content_id(ntype),
minetest.get_name_from_content_id(data[index])))
success = false
break
end
if ntype == iI then
table.insert(inputs, scan_pos)
elseif ntype == iO then
table.insert(outputs, scan_pos)
elseif ntype == iE then
table.insert(power, scan_pos)
end
end
end
end
if success then
minetest.chat_send_player(player, "Multi-node structure complete!")
end
return success, inputs, outputs, power
end
-----------
-- Nodes --
-----------
minetest.register_node("elepower_nuclear:reactor_controller", {
description = "Fusion Reactor Controller",
tiles = {
"elepower_advblock_combined.png", "elepower_advblock_combined.png", "elepower_advblock_combined.png",
"elepower_advblock_combined.png", "elepower_advblock_combined.png", "elepower_advblock_combined.png^elenuclear_fusion_controller.png",
},
groups = {cracky = 2},
on_punch = function (pos, node, puncher, pointed_thing)
print(determine_structure(pos, puncher:get_player_name()))
minetest.node_punch(pos, node, puncher, pointed_thing)
end,
})
minetest.register_node("elepower_nuclear:reactor_power", {
description = "Fusion Reactor Power Port (Input)",
tiles = {
"elepower_advblock_combined.png", "elepower_advblock_combined.png", "elepower_advblock_combined.png",
"elepower_advblock_combined.png", "elepower_advblock_combined.png", "elepower_advblock_combined.png^elenuclear_power_port.png^elepower_power_port.png",
},
paramtype2 = "facedir",
groups = {cracky = 2},
})
minetest.register_node("elepower_nuclear:reactor_fluid", {
description = "Fusion Reactor Fluid Port (Input)",
tiles = {
"elepower_advblock_combined.png", "elepower_advblock_combined.png", "elepower_advblock_combined.png",
"elepower_advblock_combined.png", "elepower_advblock_combined.png",
"elepower_advblock_combined.png^elenuclear_fluid_port.png^elepower_power_port.png",
},
paramtype2 = "facedir",
groups = {cracky = 2},
})
minetest.register_node("elepower_nuclear:reactor_output", {
description = "Fusion Reactor Fluid Port (Output)",
tiles = {
"elepower_advblock_combined.png", "elepower_advblock_combined.png", "elepower_advblock_combined.png",
"elepower_advblock_combined.png", "elepower_advblock_combined.png",
"elepower_advblock_combined.png^elenuclear_fluid_port_out.png^elepower_power_port.png",
},
paramtype2 = "facedir",
groups = {cracky = 2},
})
-- Define reactor structure with Content IDs
iC = minetest.get_content_id("elepower_machines:advanced_machine_block")
iR = minetest.get_content_id("elepower_nuclear:reactor_controller")
iI = minetest.get_content_id("elepower_nuclear:reactor_fluid")
iO = minetest.get_content_id("elepower_nuclear:reactor_output")
iE = minetest.get_content_id("elepower_nuclear:reactor_power")
iX = minetest.get_content_id("elepower_nuclear:fusion_coil")
reactor_structure = {
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, iC, iC, iC, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, iC, iC, 0, 0, 0, iC, iC, 0, 0, 0, 0,
0, 0, 0, iC, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0, 0,
0, 0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0,
0, 0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0,
0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0,
0, iI, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, iI, 0,
0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0,
0, 0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0,
0, 0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0,
0, 0, 0, iC, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0, 0,
0, 0, 0, 0, iC, iC, 0, 0, 0, iC, iC, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, iC, iC, iC, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
},
{
0, 0, 0, 0, 0, 0, iC, iE, iC, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, iC, iC, iX, iX, iX, iC, iC, 0, 0, 0, 0,
0, 0, 0, iC, iX, iX, iC, iC, iC, iX, iX, iC, 0, 0, 0,
0, 0, iC, iX, iC, iC, 0, 0, 0, iC, iC, iX, iC, 0, 0,
0, iC, iX, iC, 0, 0, 0, 0, 0, 0, 0, iC, iX, iC, 0,
0, iC, iX, iC, 0, 0, 0, 0, 0, 0, 0, iC, iX, iC, 0,
iC, iX, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, iX, iC,
iE, iX, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, iX, iE,
iC, iX, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, iX, iC,
0, iC, iX, iC, 0, 0, 0, 0, 0, 0, 0, iC, iX, iC, 0,
0, iC, iX, iC, 0, 0, 0, 0, 0, 0, 0, iC, iX, iC, 0,
0, 0, iC, iX, iC, iC, 0, 0, 0, iC, iC, iX, iC, 0, 0,
0, 0, 0, iC, iX, iX, iC, iC, iC, iX, iX, iC, 0, 0, 0,
0, 0, 0, 0, iC, iC, iX, iX, iX, iC, iC, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, iC, iR, iC, 0, 0, 0, 0, 0, 0,
},
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, iC, iC, iC, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, iC, iC, 0, 0, 0, iC, iC, 0, 0, 0, 0,
0, 0, 0, iC, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0, 0,
0, 0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0,
0, 0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0,
0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0,
0, iO, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, iO, 0,
0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0,
0, 0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0,
0, 0, iC, 0, 0, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0,
0, 0, 0, iC, 0, 0, 0, 0, 0, 0, 0, iC, 0, 0, 0,
0, 0, 0, 0, iC, iC, 0, 0, 0, iC, iC, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, iC, iC, iC, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
}
}