techage/fusion_reactor/magnet.lua
2022-01-07 22:35:12 +01:00

259 lines
7.8 KiB
Lua

--[[
TechAge
=======
Copyright (C) 2019-2022 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
TA5 Fusion Reactor Magnet
]]--
-- for lazy programmers
local S2P = minetest.string_to_pos
local P2S = minetest.pos_to_string
local M = minetest.get_meta
local S = techage.S
local Cable = techage.ElectricCable
local Pipe = techage.GasPipe
local power = networks.power
local liquid = networks.liquid
local control = networks.control
local tubelib2_get_pos = tubelib2.get_pos
local tubelib2_side_to_dir = tubelib2.side_to_dir
local CAPACITY = 20
local SHELLBLOCKS = {"techage:ta5_fr_shell1", "techage:ta5_fr_shell2"}
local function get_pos(pos, sides, param2)
local pos1 = {x = pos.x, y = pos.y, z = pos.z}
for side in sides:gmatch"." do
pos1 = tubelib2_get_pos(pos1, tubelib2_side_to_dir(side, param2))
end
return pos1
end
minetest.register_node("techage:ta5_magnet1", {
description = S("TA5 Fusion Reactor Magnet 1"),
tiles = {
-- up, down, right, left, back, front
"techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top.png^[transformR180]",
"techage_collider_magnet.png^techage_steel_tiles_top.png",
"techage_collider_magnet.png^techage_steel_tiles_side.png",
"techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]",
"techage_collider_magnet.png^techage_appl_hole_electric.png",
"techage_steel_tiles.png",
},
after_place_node = function(pos, placer, itemstack)
Pipe:after_place_node(pos)
Cable:after_place_node(pos)
end,
ta_rotate_node = function(pos, node, new_param2)
Pipe:after_dig_node(pos)
Cable:after_dig_node(pos)
minetest.swap_node(pos, {name = node.name, param2 = new_param2})
Pipe:after_place_node(pos)
Cable:after_place_node(pos)
end,
after_dig_node = function(pos, oldnode)
Pipe:after_dig_node(pos)
Cable:after_dig_node(pos)
techage.del_mem(pos)
end,
drawtype = "nodebox",
paramtype2 = "facedir",
groups = {choppy=2, cracky=2, crumbly=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:ta5_magnet2", {
description = S("TA5 Fusion Reactor Magnet 2"),
tiles = {
-- up, down, right, left, back, front
"techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top2.png^[transformR180]",
"techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top2.png^[transformR270]",
"techage_steel_tiles.png",
"techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]",
"techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png",
"techage_steel_tiles.png",
},
after_place_node = function(pos, placer, itemstack)
Pipe:after_place_node(pos)
Cable:after_place_node(pos)
end,
ta_rotate_node = function(pos, node, new_param2)
Pipe:after_dig_node(pos)
Cable:after_dig_node(pos)
minetest.swap_node(pos, {name = node.name, param2 = new_param2})
Pipe:after_place_node(pos)
Cable:after_place_node(pos)
end,
after_dig_node = function(pos, oldnode)
Pipe:after_dig_node(pos)
Cable:after_dig_node(pos)
techage.del_mem(pos)
end,
drawtype = "nodebox",
paramtype2 = "facedir",
groups = {choppy=2, cracky=2, crumbly=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:ta5_magnet3", {
description = S("TA5 Fusion Reactor Magnet 3"),
drawtype = "nodebox",
tiles = {
-- up, down, right, left, back, front
"techage_collider_magnet.png^techage_appl_hole_ta5_pipe.png^techage_steel_tiles_top.png^[transformR180]",
"techage_collider_magnet.png^techage_steel_tiles_top.png",
"techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png",
"techage_collider_magnet.png^techage_appl_hole_electric.png^techage_steel_tiles_side.png^[transformR180]",
"techage_magnet_hole.png",
"techage_steel_tiles.png",
},
node_box = {
type = "fixed",
fixed = {
{-8/16, -8/16, -8/16, 8/16, 8/16, 2/16},
{-8/16, -8/16, 2/16, -2/16, 8/16, 8/16},
{ 2/16, -8/16, 2/16, 8/16, 8/16, 8/16},
{-8/16, -8/16, 2/16, 8/16, -2/16, 8/16},
{-8/16, 2/16, 2/16, 8/16, 8/16, 8/16},
},
},
selection_box = {
type = "fixed",
fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16},
},
after_place_node = function(pos, placer, itemstack)
Pipe:after_place_node(pos)
Cable:after_place_node(pos)
end,
ta_rotate_node = function(pos, node, new_param2)
Pipe:after_dig_node(pos)
Cable:after_dig_node(pos)
minetest.swap_node(pos, {name = node.name, param2 = new_param2})
Pipe:after_place_node(pos)
Cable:after_place_node(pos)
end,
after_dig_node = function(pos, oldnode)
Pipe:after_dig_node(pos)
Cable:after_dig_node(pos)
techage.del_mem(pos)
end,
drawtype = "nodebox",
paramtype2 = "facedir",
paramtype = "light",
use_texture_alpha = "blend",
groups = {choppy=2, cracky=2, crumbly=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
power.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, Cable, "con", {"L", "B"})
power.register_nodes({"techage:ta5_magnet3"}, Cable, "con", {"L", "R"})
liquid.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2", "techage:ta5_magnet3"}, Pipe, "tank", {"U"}, {
capa = CAPACITY,
peek = function(pos, indir)
local nvm = techage.get_nvm(pos)
return liquid.srv_peek(nvm)
end,
put = function(pos, indir, name, amount)
local nvm = techage.get_nvm(pos)
return liquid.srv_put(nvm, name, amount, CAPACITY)
end,
take = function(pos, indir, name, amount)
local nvm = techage.get_nvm(pos)
return liquid.srv_take(nvm, name, amount)
end,
untake = function(pos, indir, name, amount)
local nvm = techage.get_nvm(pos)
liquid.srv_put(nvm, name, amount, CAPACITY)
end,
})
local function check_plasma(pos, param2)
local pos1 = get_pos(pos, "F", param2)
local node = minetest.get_node(pos1) or {}
techage.mark_position("singleplayer", pos1, "pos1", nil, 2)
return node.name == "techage:plasma1" or node.name == "techage:plasma2"
end
local function swap_plasma(pos, name, param2)
local pos1 = get_pos(pos, "F", param2)
minetest.swap_node(pos1, {name = name, param2 = param2})
end
local function check_steel(pos, param2)
local pos1 = get_pos(pos, "D", param2)
local pos2 = get_pos(pos, "BU", param2)
local _,t = minetest.find_nodes_in_area(pos1, pos2, SHELLBLOCKS)
local cnt = 0
for k,v in pairs(t) do
cnt = cnt + v
end
print("shell", cnt)
return cnt == 5
end
local function on_receive(pos, tlib2, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "on" then
nvm.running = true
elseif topic == "off" then
nvm.running = false
end
end
local function on_receive3(pos, tlib2, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "on" then
nvm.running = true
local node = minetest.get_node(pos) or {}
swap_plasma(pos, "techage:plasma2", node.param2)
elseif topic == "off" then
nvm.running = false
local node = minetest.get_node(pos) or {}
swap_plasma(pos, "techage:plasma1", node.param2)
end
end
local function on_request(pos, tlib2, topic)
local nvm = techage.get_nvm(pos)
if topic == "state" then
if not nvm.liquid or not nvm.liquid.amount or nvm.liquid.amount < CAPACITY then
return false, "no gas"
elseif nvm.liquid.name ~= "techage:isobutane" then
return false, "wrong gas"
elseif nvm.running then
return false, "stopped"
end
return true, "running"
elseif topic == "test_plasma" then
local node = minetest.get_node(pos) or {}
return check_plasma(pos, node.param2)
elseif topic == "test_shell" then
local node = minetest.get_node(pos) or {}
return check_steel(pos, node.param2)
end
return false
end
control.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, {
on_receive = on_receive,
on_request = on_request,
}
)
control.register_nodes({"techage:ta5_magnet3"}, {
on_receive = on_receive3,
on_request = on_request,
}
)