mods that hopefully work for a TechAge-based pack
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA4 Cooler as part of the Collider
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
local S = techage.S
|
||||
|
||||
local Pipe = techage.LiquidPipe
|
||||
|
||||
minetest.register_node("techage:ta4_collider_cooler", {
|
||||
description = S("TA4 Collider Cooler"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
{
|
||||
name = "techage_appl_cooler4.png^techage_frame4_ta4_top.png",
|
||||
backface_culling = false,
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 32,
|
||||
aspect_h = 32,
|
||||
length = 0.4,
|
||||
},
|
||||
},
|
||||
{
|
||||
name = "techage_appl_cooler4.png^techage_frame4_ta4_top.png",
|
||||
backface_culling = false,
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 32,
|
||||
aspect_h = 32,
|
||||
length = 0.4,
|
||||
},
|
||||
},
|
||||
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
networks = {
|
||||
pipe2 = {},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
Pipe:after_place_node(pos)
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode)
|
||||
Pipe:after_dig_node(pos)
|
||||
techage.del_mem(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
Pipe:add_secondary_node_names({"techage:ta4_collider_cooler"})
|
||||
Pipe:set_valid_sides("techage:ta4_collider_cooler", {"R", "L"})
|
||||
|
||||
techage.register_node({"techage:ta4_collider_cooler"}, {
|
||||
on_transfer = function(pos, in_dir, topic, payload)
|
||||
if topic == "cooler" then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_collider_cooler",
|
||||
recipe = {
|
||||
{'', 'dye:blue', ''},
|
||||
{'', 'techage:cooler', ''},
|
||||
{'', 'techage:aluminum', ''},
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,448 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA4 Detector as part of the Collider
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
local S = techage.S
|
||||
local S2P = minetest.string_to_pos
|
||||
local P2S = minetest.pos_to_string
|
||||
local getpos = techage.assemble.get_pos
|
||||
|
||||
local CYCLE_TIME = 2
|
||||
local TNO_MAGNETS = 22
|
||||
local IMPROBABILITY = 40 -- every 40 min
|
||||
-- one point per 40 min: check every 20 s => factor = 40 * 3 = 120
|
||||
IMPROBABILITY = (minetest.settings:get("techage_expoint_rate_in_min") or 40) * 3
|
||||
|
||||
local TIME_SLOTS = 10
|
||||
local Schedule = {[0] =
|
||||
-- Route: 0 = forward, 1 = right, 2 = backward, 3 = left
|
||||
-- Gas left/right
|
||||
{name = "techage:ta4_collider_pipe_inlet", yoffs = 1, route = {3,3,3,2}, check = techage.gas_inlet_check},
|
||||
{name = "techage:ta4_collider_pipe_inlet", yoffs = 1, route = {1,1,1,2}, check = techage.gas_inlet_check},
|
||||
-- Power left/right
|
||||
{name = "techage:ta4_collider_cable_inlet", yoffs = 2, route = {3,3,3}, check = techage.power_inlet_check},
|
||||
{name = "techage:ta4_collider_cable_inlet", yoffs = 2, route = {1,1,1}, check = techage.power_inlet_check},
|
||||
-- Cooler
|
||||
{name = "techage:ta4_collider_pipe_inlet", yoffs = 0, route = {0}, check = techage.cooler_check},
|
||||
{name = "techage:ta4_collider_pipe_inlet", yoffs = 2, route = {0}, check = techage.cooler_check},
|
||||
-- Air outlet
|
||||
{name = "techage:ta4_collider_pipe_outlet", yoffs = 2, route = {}, check = techage.air_outlet_check},
|
||||
-- All nodes
|
||||
{name = "shell", yoffs = 0, route = {}, check = nil},
|
||||
}
|
||||
|
||||
local function play_sound(pos)
|
||||
minetest.sound_play("techage_hum", {
|
||||
pos = pos,
|
||||
gain = 0.5,
|
||||
max_hear_distance = 10,
|
||||
})
|
||||
end
|
||||
|
||||
local function terminal_message(pos, msg)
|
||||
local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num")
|
||||
local own_num = M(pos):get_string("node_number")
|
||||
|
||||
if term_num and own_num then
|
||||
techage.send_single(own_num, term_num, "text", msg)
|
||||
end
|
||||
end
|
||||
|
||||
local function experience_points(pos)
|
||||
if math.random(IMPROBABILITY) == 1 then
|
||||
local owner = M(pos):get_string("owner")
|
||||
local own_num = M(pos):get_string("node_number")
|
||||
local player = minetest.get_player_by_name(owner)
|
||||
if player then
|
||||
if techage.add_expoint(player, own_num) then
|
||||
terminal_message(pos, "Experience point reached!")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function check_shell(pos, param2)
|
||||
local pos1 = getpos(pos, param2, {3,3,3,2}, 0)
|
||||
local pos2 = getpos(pos, param2, {1,1,1,0}, 2)
|
||||
local _, tbl = minetest.find_nodes_in_area(pos1, pos2, {"techage:ta4_detector_magnet", "techage:ta4_colliderblock", "default:obsidian_glass"})
|
||||
if tbl["techage:ta4_detector_magnet"] < 16 then
|
||||
return false, "Magnet missing"
|
||||
elseif tbl["techage:ta4_colliderblock"] < 31 then
|
||||
return false, "Steel block missing"
|
||||
elseif tbl["default:obsidian_glass"] < 1 then
|
||||
return false, "Obsidian glass missing"
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
local function check_state(pos)
|
||||
-- Cyclically check all connections
|
||||
local param2 = minetest.get_node(pos).param2
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.ticks = (nvm.ticks or 0) + 1
|
||||
local idx = nvm.ticks % TIME_SLOTS
|
||||
local item = Schedule[idx]
|
||||
|
||||
if idx == 1 then
|
||||
nvm.result = true
|
||||
end
|
||||
|
||||
if item then
|
||||
if item.name == "shell" then
|
||||
local res, err = check_shell(pos, param2)
|
||||
if not res then
|
||||
nvm.result = false
|
||||
nvm.runnning = false
|
||||
terminal_message(pos, (err or "unknown") .. "!!!")
|
||||
return nvm.result
|
||||
end
|
||||
else
|
||||
local pos2 = getpos(pos, param2, item.route, item.yoffs)
|
||||
local nvm2 = techage.get_nvm(pos2)
|
||||
local meta2 = M(pos2)
|
||||
local node2 = minetest.get_node(pos2)
|
||||
if item.name == node2.name then
|
||||
local res, err = item.check(pos2, node2, meta2, nvm2)
|
||||
--print("check_state", idx, res, err)
|
||||
if not res then
|
||||
nvm.result = false
|
||||
nvm.runnning = false
|
||||
terminal_message(pos, (err or "unknown") .. "!!!")
|
||||
return nvm.result
|
||||
end
|
||||
else
|
||||
nvm.result = false
|
||||
nvm.runnning = false
|
||||
terminal_message(pos, "Detector defect!!!")
|
||||
end
|
||||
end
|
||||
elseif idx == #Schedule + 1 then
|
||||
return nvm.result
|
||||
end
|
||||
end
|
||||
|
||||
local function add_laser(pos)
|
||||
local param2 = minetest.get_node(pos).param2
|
||||
local pos1 = getpos(pos, param2, {3,3}, 1)
|
||||
local pos2 = getpos(pos, param2, {1,1,1}, 1)
|
||||
techage.del_laser(pos)
|
||||
techage.add_laser(pos, pos1, pos2)
|
||||
end
|
||||
|
||||
local function create_task(pos, task)
|
||||
local mem = techage.get_mem(pos)
|
||||
if not mem.co then
|
||||
mem.co = coroutine.create(task)
|
||||
end
|
||||
|
||||
local _, err = coroutine.resume(mem.co, pos)
|
||||
if err then
|
||||
mem.co = nil
|
||||
--print(err)
|
||||
return
|
||||
end
|
||||
minetest.after(0.4, create_task, pos, task)
|
||||
end
|
||||
|
||||
-- Call on_cyclic_check of all magents so that the magnets don't need a FLB.
|
||||
local function magnets_on_cyclic_check(pos, nvm)
|
||||
local ndef = minetest.registered_nodes["techage:ta4_magnet"]
|
||||
for idx,pos2 in ipairs(nvm.magnet_positions or {}) do
|
||||
local res = ndef.on_cyclic_check(pos2)
|
||||
if res == -2 then
|
||||
terminal_message(pos, "Magnet #" .. idx .. " defect!!!")
|
||||
return false
|
||||
elseif res == -1 then
|
||||
terminal_message(pos, "Vacuum defect!!!")
|
||||
techage.air_outlet_reset({x=pos.x, y=pos.y + 2, z=pos.z})
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-- Turn off all magnets so that they don't consume power
|
||||
local function magnets_turn_off(pos, nvm)
|
||||
local ndef = minetest.registered_nodes["techage:ta4_magnet"]
|
||||
for idx,pos2 in ipairs(nvm.magnet_positions or {}) do
|
||||
ndef.on_turn_off(pos2)
|
||||
end
|
||||
end
|
||||
|
||||
local function cable_inlets_turn_on_off(pos, on)
|
||||
local turn_on_off = function(pos, param2, item)
|
||||
local pos2 = getpos(pos, param2, item.route, item.yoffs)
|
||||
local node2 = minetest.get_node(pos2)
|
||||
if item.name == node2.name then
|
||||
local nvm = techage.get_nvm(pos2)
|
||||
techage.power_inlet_turn_on_off(pos2, nvm, on)
|
||||
end
|
||||
end
|
||||
|
||||
local param2 = minetest.get_node(pos).param2
|
||||
turn_on_off(pos, param2, Schedule[2])
|
||||
turn_on_off(pos, param2, Schedule[3])
|
||||
end
|
||||
|
||||
minetest.register_node("techage:ta4_detector_core", {
|
||||
description = S("TA4 Collider Detector Core"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png^techage_collider_detector_core.png",
|
||||
"default_steel_block.png^techage_collider_detector_core.png",
|
||||
"default_steel_block.png^techage_collider_detector_core.png",
|
||||
"default_steel_block.png^techage_collider_detector_core.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
local meta = M(pos)
|
||||
local own_num = techage.add_node(pos, "techage:ta4_detector_core")
|
||||
meta:set_string("node_number", own_num)
|
||||
meta:set_string("owner", placer:get_player_name())
|
||||
M({x=pos.x, y=pos.y - 1, z=pos.z}):set_string("infotext", S("TA4 Collider Detector") .. " " .. own_num)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end,
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if nvm.running then
|
||||
if not magnets_on_cyclic_check(pos, nvm) then
|
||||
techage.del_laser(pos)
|
||||
terminal_message(pos, "Detector stopped.")
|
||||
magnets_turn_off(pos, nvm)
|
||||
cable_inlets_turn_on_off(pos, false)
|
||||
nvm.running = false
|
||||
nvm.magnet_positions = nil
|
||||
else
|
||||
local res = check_state(pos)
|
||||
if res == true then
|
||||
experience_points(pos)
|
||||
add_laser(pos)
|
||||
if nvm.ticks <= TIME_SLOTS then -- only once
|
||||
terminal_message(pos, "Detector running.")
|
||||
end
|
||||
elseif res == false then
|
||||
techage.del_laser(pos)
|
||||
magnets_turn_off(pos, nvm)
|
||||
cable_inlets_turn_on_off(pos, false)
|
||||
nvm.running = false
|
||||
nvm.magnet_positions = nil
|
||||
terminal_message(pos, "Detector stopped.")
|
||||
end
|
||||
if nvm.running then
|
||||
play_sound(pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
techage.on_remove_collider(digger)
|
||||
techage.remove_node(pos, oldnode, oldmetadata)
|
||||
techage.del_mem(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
local function check_expr(own_num, term_num, text, expr)
|
||||
techage.send_single(own_num, term_num, "text", text .. "..." .. (expr and "ok" or "error!!!"))
|
||||
return expr
|
||||
end
|
||||
|
||||
local function start_task(pos)
|
||||
local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num")
|
||||
local param2 = minetest.get_node(pos).param2
|
||||
local pos2 = getpos(pos, param2, {3,3,3}, 1)
|
||||
local own_num = M(pos):get_string("node_number")
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.magnet_positions = {}
|
||||
|
||||
if term_num and param2 and pos2 then
|
||||
techage.send_single(own_num, term_num, "text", "#### Start ####")
|
||||
|
||||
coroutine.yield()
|
||||
local resp = techage.tube_inlet_command(pos2, "enumerate", 1)
|
||||
if not check_expr(own_num, term_num, "- Check number of magnets", resp == TNO_MAGNETS) then
|
||||
nvm.locked = false
|
||||
return
|
||||
end
|
||||
|
||||
coroutine.yield()
|
||||
techage.send_single(own_num, term_num, "text", "- Check position of magnets...")
|
||||
resp = techage.tube_inlet_command(pos2, "distance")
|
||||
if resp ~= true then
|
||||
techage.send_single(own_num, term_num, "append", "#" .. resp .. " defect!!!")
|
||||
nvm.locked = false
|
||||
return
|
||||
end
|
||||
techage.send_single(own_num, term_num, "append", "ok")
|
||||
|
||||
coroutine.yield()
|
||||
techage.send_single(own_num, term_num, "text", "- Start magnets...")
|
||||
local t = {}
|
||||
for num = 1, TNO_MAGNETS do
|
||||
local resp = techage.tube_inlet_command(pos2, "pos", num)
|
||||
if not resp or type(resp) ~= "table" then
|
||||
techage.send_single(own_num, term_num, "append", "#" .. num .. " defect!!!")
|
||||
nvm.magnet_positions = nil
|
||||
nvm.locked = false
|
||||
return
|
||||
else
|
||||
t[#t + 1] = resp
|
||||
end
|
||||
coroutine.yield()
|
||||
end
|
||||
nvm.magnet_positions = t
|
||||
techage.send_single(own_num, term_num, "append", "ok")
|
||||
cable_inlets_turn_on_off(pos, true)
|
||||
|
||||
coroutine.yield()
|
||||
techage.send_single(own_num, term_num, "text", "- Check magnets...")
|
||||
-- The check will be performed by the timer, so wait 5 sec.
|
||||
for i = 1,14 do
|
||||
coroutine.yield()
|
||||
end
|
||||
if nvm.magnet_positions then
|
||||
techage.send_single(own_num, term_num, "append", "ok")
|
||||
else
|
||||
nvm.locked = false
|
||||
return
|
||||
end
|
||||
|
||||
coroutine.yield()
|
||||
techage.send_single(own_num, term_num, "text", "- Check detector...")
|
||||
for _,item in ipairs(Schedule)do
|
||||
if item.name == "shell" then
|
||||
local res, err = check_shell(pos, param2)
|
||||
if not res then
|
||||
techage.send_single(own_num, term_num, "append", err .. "!!!")
|
||||
nvm.magnet_positions = nil
|
||||
nvm.locked = false
|
||||
cable_inlets_turn_on_off(pos, false)
|
||||
return
|
||||
end
|
||||
else
|
||||
local pos2 = getpos(pos, param2, item.route, item.yoffs)
|
||||
local nvm2 = techage.get_nvm(pos2)
|
||||
local meta2 = M(pos2)
|
||||
local node2 = minetest.get_node(pos2)
|
||||
if item.name == node2.name then
|
||||
local res, err = item.check(pos2, node2, meta2, nvm2)
|
||||
if not res then
|
||||
techage.send_single(own_num, term_num, "append", err .. "!!!")
|
||||
nvm.magnet_positions = nil
|
||||
nvm.locked = false
|
||||
cable_inlets_turn_on_off(pos, false)
|
||||
return
|
||||
end
|
||||
else
|
||||
techage.send_single(own_num, term_num, "append", "defect!!!")
|
||||
nvm.magnet_positions = nil
|
||||
nvm.locked = false
|
||||
cable_inlets_turn_on_off(pos, false)
|
||||
return
|
||||
end
|
||||
coroutine.yield()
|
||||
end
|
||||
end
|
||||
techage.send_single(own_num, term_num, "append", "ok")
|
||||
|
||||
coroutine.yield()
|
||||
techage.send_single(own_num, term_num, "text", "Collider starting...")
|
||||
nvm.ticks = 0
|
||||
nvm.running = true
|
||||
end
|
||||
end
|
||||
|
||||
local function test_magnet(pos, payload)
|
||||
local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num")
|
||||
local param2 = minetest.get_node(pos).param2
|
||||
local pos2 = getpos(pos, param2, {3,3,3}, 1)
|
||||
local own_num = M(pos):get_string("node_number")
|
||||
local magnet_num = tonumber(payload)
|
||||
local res, err = techage.tube_inlet_command(pos2, "test", magnet_num)
|
||||
if res then
|
||||
techage.send_single(own_num, term_num, "text", "magnet #" .. magnet_num .. ": ok")
|
||||
else
|
||||
techage.send_single(own_num, term_num, "text", "magnet #" .. magnet_num .. ": " .. (err or "unknown error") .. "!!!")
|
||||
end
|
||||
end
|
||||
|
||||
techage.register_node({"techage:ta4_detector_core"}, {
|
||||
on_recv_message = function(pos, src, topic, payload)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if topic == "connect" then
|
||||
M(pos):set_string("term_num", src)
|
||||
return true
|
||||
elseif topic == "start" then
|
||||
-- Worker block
|
||||
nvm.locked = true
|
||||
create_task(pos, start_task)
|
||||
return true
|
||||
elseif topic == "stop" then
|
||||
nvm.running = false
|
||||
techage.del_laser(pos)
|
||||
nvm.locked = false
|
||||
magnets_turn_off(pos, nvm)
|
||||
cable_inlets_turn_on_off(pos, false)
|
||||
nvm.magnet_positions = nil
|
||||
return "Detector stopped."
|
||||
elseif topic == "status" then
|
||||
if nvm.running == true then
|
||||
return "running"
|
||||
elseif nvm.result == false then
|
||||
return "fault"
|
||||
else
|
||||
return "stopped"
|
||||
end
|
||||
elseif topic == "test"then
|
||||
if payload and tonumber(payload) then
|
||||
test_magnet(pos, payload)
|
||||
return true
|
||||
else
|
||||
return "Invalid magnet number"
|
||||
end
|
||||
elseif topic == "points" then
|
||||
local owner = M(pos):get_string("owner")
|
||||
local player = minetest.get_player_by_name(owner)
|
||||
if player then
|
||||
local points = techage.get_expoints(player)
|
||||
return "Ex. Points = " .. points
|
||||
end
|
||||
else
|
||||
return "unsupported"
|
||||
end
|
||||
end,
|
||||
on_node_load = function(pos)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_detector_core",
|
||||
recipe = {
|
||||
{'techage:aluminum', 'basic_materials:heating_element', 'default:steel_ingot'},
|
||||
{'default:diamond', 'techage:ta4_wlanchip', 'techage:electric_cableS'},
|
||||
{'default:steel_ingot', '', 'techage:aluminum'},
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,375 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA4 Tube/Pipe Inputs/Outputs as part of the Collider
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
local S = techage.S
|
||||
|
||||
local PWR_NEEDED = 15
|
||||
local CYCLE_TIME = 2
|
||||
local GAS_CAPA = 20
|
||||
local AIR_CAPA = 1000
|
||||
|
||||
local VTube = techage.VTube
|
||||
local Pipe = techage.LiquidPipe
|
||||
local Cable = techage.ElectricCable
|
||||
local power = networks.power
|
||||
local liquid = networks.liquid
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Tube Input
|
||||
--------------------------------------------------------------------------------
|
||||
minetest.register_node("techage:ta4_collider_tube_inlet", {
|
||||
description = S("TA4 Collider Tube Input"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png^techage_collider_tube_open.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-4/8, -4/8, -4/8, -1/8, 4/8, 4/8},
|
||||
{ 1/8, -4/8, -4/8, 4/8, 4/8, 4/8},
|
||||
{-4/8, 1/8, -4/8, 4/8, 4/8, 4/8},
|
||||
{-4/8, -4/8, -4/8, 4/8, -1/8, 4/8},
|
||||
},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-4/8, -4/8, -4/8, 4/8, 4/8, 4/8},
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
paramtype = "light",
|
||||
use_texture_alpha = techage.CLIP,
|
||||
groups = {cracky = 1},
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
VTube:after_place_node(pos)
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode)
|
||||
VTube:after_dig_node(pos)
|
||||
techage.del_mem(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
VTube:add_secondary_node_names({"techage:ta4_collider_tube_inlet"})
|
||||
VTube:set_valid_sides("techage:ta4_collider_tube_inlet", {"F"})
|
||||
|
||||
-- Called from the detector via tube ring
|
||||
techage.register_node({"techage:ta4_collider_tube_inlet"}, {
|
||||
on_transfer = function(pos, in_dir, topic, payload)
|
||||
if topic == "distance" then
|
||||
return pos
|
||||
elseif topic == "enumerate" and payload then
|
||||
return payload - 1
|
||||
elseif topic == "check" then
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.check_received = true
|
||||
return true
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- Used by the detector to check the tube connection
|
||||
function techage.tube_inlet_command(pos, command, payload)
|
||||
if command == "distance" then
|
||||
local pos2 = techage.transfer(pos, "F", command, payload, VTube, {"techage:ta4_magnet"})
|
||||
if type(pos2) == "table" then
|
||||
local dist = math.abs(pos.x - pos2.x) + math.abs(pos.z - pos2.z)
|
||||
if pos.y == pos2.y and dist == VTube.max_tube_length + 1 then
|
||||
return true
|
||||
end
|
||||
return 0
|
||||
else
|
||||
return pos2
|
||||
end
|
||||
end
|
||||
return techage.transfer(pos, "F", command, payload, VTube, {"techage:ta4_magnet"})
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_collider_tube_inlet",
|
||||
recipe = {
|
||||
{'', '', ''},
|
||||
{'techage:ta4_vtubeS', 'techage:ta4_colliderblock', ''},
|
||||
{'', '', ''},
|
||||
},
|
||||
})
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Pipe Input (gas)
|
||||
--------------------------------------------------------------------------------
|
||||
minetest.register_node("techage:ta4_collider_pipe_inlet", {
|
||||
description = S("TA4 Collider Pipe Input"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png^techage_appl_hole_pipe.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
networks = {
|
||||
pipe2 = {},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
Pipe:after_place_node(pos)
|
||||
nvm.liquid = {}
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode)
|
||||
Pipe:after_dig_node(pos)
|
||||
techage.del_mem(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
liquid.register_nodes({"techage:ta4_collider_pipe_inlet"}, Pipe, "tank", {"F"}, {
|
||||
capa = GAS_CAPA,
|
||||
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, GAS_CAPA)
|
||||
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, GAS_CAPA)
|
||||
end,
|
||||
})
|
||||
|
||||
techage.register_node({"techage:ta4_collider_pipe_inlet"}, {
|
||||
on_transfer = function(pos, in_dir, topic, payload)
|
||||
-- called from heatexchanger
|
||||
if topic == "detector" then
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.detector_received = true
|
||||
return true
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- Used by the detector to check for gas pressure
|
||||
function techage.gas_inlet_check(pos, node, meta, nvm)
|
||||
nvm.liquid = nvm.liquid or {}
|
||||
if nvm.liquid.amount == GAS_CAPA and nvm.liquid.name == "techage:isobutane" then
|
||||
return true
|
||||
end
|
||||
return false, "no gas"
|
||||
end
|
||||
|
||||
-- Used by the detector to check for cooler connection
|
||||
function techage.cooler_check(pos, node, meta, nvm)
|
||||
if nvm.detector_received then
|
||||
nvm.detector_received = nil
|
||||
return true
|
||||
end
|
||||
return false, "Cooler defect"
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_collider_pipe_inlet",
|
||||
recipe = {
|
||||
{'', '', ''},
|
||||
{'techage:ta3_pipeS', 'techage:ta4_colliderblock', ''},
|
||||
{'', '', ''},
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Pipe Output (air)
|
||||
--------------------------------------------------------------------------------
|
||||
local function init_air(nvm)
|
||||
nvm.liquid = {
|
||||
amount = AIR_CAPA,
|
||||
name = "air",
|
||||
}
|
||||
return nvm.liquid
|
||||
end
|
||||
|
||||
minetest.register_node("techage:ta4_collider_pipe_outlet", {
|
||||
description = S("TA4 Collider Pipe Output"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"default_steel_block.png^techage_appl_hole_pipe.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
networks = {
|
||||
pipe2 = {},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
init_air(nvm)
|
||||
Pipe:after_place_node(pos)
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode)
|
||||
Pipe:after_dig_node(pos)
|
||||
techage.del_mem(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
liquid.register_nodes({"techage:ta4_collider_pipe_outlet"}, Pipe, "tank", {"U"}, {
|
||||
capa = AIR_CAPA,
|
||||
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, AIR_CAPA)
|
||||
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, AIR_CAPA)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Used by the detector to check the vacuum
|
||||
function techage.air_outlet_check(pos, node, meta, nvm)
|
||||
nvm.liquid = nvm.liquid or {}
|
||||
if nvm.liquid.amount == 0 then
|
||||
return true
|
||||
end
|
||||
return false, "no vacuum"
|
||||
end
|
||||
|
||||
function techage.air_outlet_reset(pos)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
init_air(nvm)
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_collider_pipe_outlet",
|
||||
recipe = {
|
||||
{'', 'techage:ta3_pipeS', ''},
|
||||
{'', 'techage:ta4_colliderblock', ''},
|
||||
{'', '', ''},
|
||||
},
|
||||
})
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Cable Input (power)
|
||||
--------------------------------------------------------------------------------
|
||||
minetest.register_node("techage:ta4_collider_cable_inlet", {
|
||||
description = S("TA4 Collider Cable Input"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png",
|
||||
"default_steel_block.png^techage_appl_hole_electric.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
networks = {
|
||||
pipe2 = {},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
Cable:after_place_node(pos)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end,
|
||||
|
||||
on_timer = function(pos, elapsed)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if nvm.running then
|
||||
nvm.consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED)
|
||||
else
|
||||
nvm.consumed = 0
|
||||
end
|
||||
return true
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode)
|
||||
Cable:after_dig_node(pos)
|
||||
techage.del_mem(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Used by the detector to check for power
|
||||
function techage.power_inlet_check(pos, node, meta, nvm)
|
||||
if nvm.consumed == PWR_NEEDED then
|
||||
return true
|
||||
end
|
||||
return false, "no power"
|
||||
end
|
||||
|
||||
-- Used by the detector to turn on/off the node
|
||||
function techage.power_inlet_turn_on_off(pos, nvm, on)
|
||||
nvm.running = on
|
||||
end
|
||||
|
||||
power.register_nodes({"techage:ta4_collider_cable_inlet"}, Cable, "con", {"F"})
|
||||
|
||||
techage.register_node({"techage:ta4_collider_cable_inlet"}, {
|
||||
on_node_load = function(pos)
|
||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_collider_cable_inlet",
|
||||
recipe = {
|
||||
{'', '', ''},
|
||||
{'techage:electric_cableS', 'techage:ta4_colliderblock', ''},
|
||||
{'', '', ''},
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,333 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2023 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA4 Magnet as part of the Collider
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
local S = techage.S
|
||||
local S2P = minetest.string_to_pos
|
||||
local P2S = minetest.pos_to_string
|
||||
|
||||
local PWR_NEEDED = 5
|
||||
local CYCLE_TIME = 2
|
||||
local CAPACITY = 10
|
||||
|
||||
local Cable = techage.ElectricCable
|
||||
local Pipe = techage.LiquidPipe
|
||||
local VTube = techage.VTube
|
||||
local power = networks.power
|
||||
local liquid = networks.liquid
|
||||
|
||||
local function is_junction(pos, side)
|
||||
local node = techage.get_node_lvm(techage.get_pos(pos, side))
|
||||
return node and techage.string_compare(node.name, "techage:ta3_junction")
|
||||
end
|
||||
|
||||
-- Turn the magnet to the right direction
|
||||
local function handle_legacy_magnet(pos)
|
||||
if M(pos):get_string("version") ~= "V2" then
|
||||
if is_junction(pos, "B") and not is_junction(pos, "F") then
|
||||
local node = techage.get_node_lvm(pos)
|
||||
node.param2 = (node.param2 + 2) % 4
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
end
|
||||
M(pos):set_string("version", "V2")
|
||||
end
|
||||
|
||||
minetest.register_node("techage:ta4_colliderblock", {
|
||||
description = S("TA4 Collider Steel Block"),
|
||||
tiles = {
|
||||
"default_steel_block.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("techage:ta4_detector_magnet", {
|
||||
description = S("TA4 Collider Detector Magnet"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png",
|
||||
"techage_collider_magnet.png",
|
||||
"techage_collider_magnet.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("techage:ta4_magnet", {
|
||||
description = S("TA4 Collider Magnet"),
|
||||
inventory_image = minetest.inventorycube(
|
||||
"techage_collider_magnet.png^techage_appl_hole_electric.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png^techage_appl_hole_pipe.png^techage_collider_magnet_sign.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_tube.png"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_collider_magnet.png^techage_appl_hole_electric.png",
|
||||
"techage_collider_magnet.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_tube.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_tube.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png^techage_collider_magnet_sign.png",
|
||||
"techage_collider_magnet.png^techage_collider_magnet_appl.png^techage_appl_hole_pipe.png^techage_collider_magnet_sign.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
use_texture_alpha = techage.CLIP,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-11/16, -11/16, -11/16, 11/16, 11/16, -2/16},
|
||||
{-11/16, -11/16, 2/16, 11/16, 11/16, 11/16},
|
||||
{-11/16, 2/16, -11/16, 11/16, 11/16, 11/16},
|
||||
{-11/16, -11/16, -11/16, 11/16, -2/16, 11/16},
|
||||
},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-4/8, -4/8, -4/8, 4/8, 4/8, 4/8},
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {-11/16, -11/16, -11/16, 11/16, 11/16, 11/16},
|
||||
},
|
||||
wield_scale = {x = 0.8, y = 0.8, z = 0.8},
|
||||
paramtype2 = "facedir",
|
||||
paramtype = "light",
|
||||
use_texture_alpha = techage.CLIP,
|
||||
groups = {cracky = 1},
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
if pos.y > techage.collider_min_depth then
|
||||
minetest.remove_node(pos)
|
||||
minetest.add_item(pos, ItemStack("techage:ta4_magnet"))
|
||||
return
|
||||
end
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.liquid = {}
|
||||
Pipe:after_place_node(pos)
|
||||
Cable:after_place_node(pos)
|
||||
VTube:after_place_node(pos)
|
||||
M(pos):set_string("infotext", S("TA4 Collider Magnet") .. " #0")
|
||||
M(pos):set_string("version", "V2")
|
||||
end,
|
||||
|
||||
-- To be called by the detector
|
||||
on_cyclic_check = function(pos)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.liquid = nvm.liquid or {}
|
||||
nvm.consumed = power.consume_power(pos, Cable, 6, PWR_NEEDED)
|
||||
if nvm.tube_damage then
|
||||
nvm.tube_damage = nil
|
||||
nvm.running = nil
|
||||
return -1
|
||||
elseif nvm.liquid.amount == CAPACITY and
|
||||
nvm.liquid.name == "techage:isobutane" and
|
||||
nvm.consumed == PWR_NEEDED then
|
||||
nvm.running = true
|
||||
return 0
|
||||
end
|
||||
nvm.running = nil
|
||||
return -2
|
||||
end,
|
||||
|
||||
on_turn_off = function(pos)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.running = nil
|
||||
end,
|
||||
|
||||
tubelib2_on_update2 = function(pos, outdir, tlib2, node)
|
||||
if tlib2.tube_type == "vtube" then
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.tube_damage = true
|
||||
elseif tlib2.tube_type == "pipe2" then
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.liquid = nvm.liquid or {}
|
||||
nvm.liquid.amount = 0
|
||||
end
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode)
|
||||
Pipe:after_dig_node(pos)
|
||||
Cable:after_dig_node(pos)
|
||||
VTube:after_dig_node(pos)
|
||||
techage.del_mem(pos)
|
||||
end,
|
||||
})
|
||||
|
||||
power.register_nodes({"techage:ta4_magnet"}, Cable, "con", {"U"})
|
||||
liquid.register_nodes({"techage:ta4_magnet"}, Pipe, "tank", {"F"}, {
|
||||
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,
|
||||
})
|
||||
|
||||
VTube:add_secondary_node_names({"techage:ta4_magnet"})
|
||||
VTube:set_valid_sides("techage:ta4_magnet", {"R", "L"})
|
||||
|
||||
local function send_to_next(pos, in_dir, topic, payload)
|
||||
return techage.transfer(pos, in_dir, topic, payload, VTube,
|
||||
{"techage:ta4_magnet", "techage:ta4_collider_tube_inlet"})
|
||||
end
|
||||
|
||||
--[[
|
||||
Commands
|
||||
--------
|
||||
|
||||
distance : Check distance between all magnets.
|
||||
Returns pos of next magnet or the number of the defect magnet.
|
||||
enumerate : Give each magnet a unique number (1...n)
|
||||
pos : Read the position
|
||||
test : Test all magnet attributs.
|
||||
Returns true or false, err
|
||||
]]--
|
||||
techage.register_node({"techage:ta4_magnet"}, {
|
||||
on_transfer = function(pos, in_dir, topic, payload)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if topic == "distance" then
|
||||
local pos2 = send_to_next(pos, in_dir, topic, payload)
|
||||
if type(pos2) == "table" then
|
||||
local dist = math.abs(pos.x - pos2.x) + math.abs(pos.z - pos2.z)
|
||||
if pos.y == pos2.y and dist == VTube.max_tube_length + 1 then
|
||||
return pos
|
||||
end
|
||||
return nvm.number or 0
|
||||
else
|
||||
return pos2
|
||||
end
|
||||
elseif topic == "enumerate" and payload then
|
||||
handle_legacy_magnet(pos)
|
||||
payload = tonumber(payload) or 1
|
||||
nvm.number = payload
|
||||
M(pos):set_string("infotext", S("TA4 Collider Magnet") .. " #" .. payload)
|
||||
return send_to_next(pos, in_dir, topic, payload + 1)
|
||||
elseif topic == "pos" then
|
||||
if payload and tonumber(payload) == nvm.number then
|
||||
nvm.tube_damage = nil
|
||||
return pos
|
||||
else
|
||||
return send_to_next(pos, in_dir, topic, payload)
|
||||
end
|
||||
elseif topic == "test" then
|
||||
if payload and tonumber(payload) == nvm.number 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.consumed ~= PWR_NEEDED then
|
||||
return false, "no power"
|
||||
elseif nvm.tube_damage then
|
||||
nvm.tube_damage = nil
|
||||
return false, "no vacuum"
|
||||
end
|
||||
return true
|
||||
else
|
||||
return send_to_next(pos, in_dir, topic, payload)
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("techage:ta4_magnet_base", {
|
||||
description = S("TA4 Collider Magnet Base"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"default_steel_block.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-6/16, -8/16, -6/16, 6/16, 5/16, 6/16},
|
||||
},
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
is_ground_content = false,
|
||||
paramtype = "light",
|
||||
use_texture_alpha = techage.CLIP,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_colliderblock",
|
||||
recipe = {
|
||||
{'techage:aluminum', '', 'default:steel_ingot'},
|
||||
{'', '', ''},
|
||||
{'default:steel_ingot', '', 'techage:aluminum'},
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_detector_magnet 2",
|
||||
recipe = {
|
||||
{'default:steel_ingot', '', 'techage:aluminum'},
|
||||
{'dye:red', 'basic_materials:gold_wire', 'dye:brown'},
|
||||
{'techage:aluminum', '', 'default:steel_ingot'},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_magnet",
|
||||
recipe = {
|
||||
{'techage:ta3_pipeS', '', 'techage:electric_cableS'},
|
||||
{'techage:ta4_round_ceramic', 'techage:ta4_detector_magnet', 'techage:ta4_round_ceramic'},
|
||||
{'', '', ''},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_magnet_base 4",
|
||||
recipe = {
|
||||
{'techage:aluminum', 'default:steel_ingot', ''},
|
||||
{'techage:aluminum', 'default:steel_ingot', ''},
|
||||
{'techage:aluminum', 'default:steel_ingot', ''},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "Repair Magnets",
|
||||
name = "techage:magnets",
|
||||
nodenames = {"techage:ta4_magnet", "techage:ta4_collider_pipe_inlet"},
|
||||
run_at_every_load = false,
|
||||
action = function(pos, node)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if nvm.liquid and nvm.liquid.name == "techage:hydrogen" then
|
||||
nvm.liquid.name = "techage:isobutane"
|
||||
end
|
||||
end,
|
||||
})
|
||||
@@ -0,0 +1,130 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA4 Vacuum Tube as part of the Collider
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
local S = techage.S
|
||||
|
||||
local VTube = tubelib2.Tube:new({
|
||||
dirs_to_check = {1,2,3,4},
|
||||
max_tube_length = 5,
|
||||
tube_type = "vtube",
|
||||
show_infotext = false,
|
||||
primary_node_names = {"techage:ta4_vtubeS", "techage:ta4_vtubeA"},
|
||||
secondary_node_names = {"techage:ta4_magnet"},
|
||||
after_place_tube = function(pos, param2, tube_type, num_tubes)
|
||||
minetest.swap_node(pos, {name = "techage:ta4_vtube"..tube_type, param2 = param2})
|
||||
end,
|
||||
})
|
||||
|
||||
techage.VTube = VTube
|
||||
|
||||
minetest.register_node("techage:ta4_vtubeS", {
|
||||
description = S("TA4 Vacuum Tube"),
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_collider_tube.png^[transformR90",
|
||||
"techage_collider_tube.png^[transformR90",
|
||||
"techage_collider_tube.png",
|
||||
"techage_collider_tube.png",
|
||||
'techage_collider_tube_open.png',
|
||||
'techage_collider_tube_open.png',
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-8/16, -8/16, -8/16, -6/16, 8/16, 8/16},
|
||||
{ 6/16, -8/16, -8/16, 8/16, 8/16, 8/16},
|
||||
{-8/16, 6/16, -8/16, 8/16, 8/16, 8/16},
|
||||
{-8/16, -8/16, -8/16, 8/16, -6/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, pointed_thing)
|
||||
if not VTube:after_place_tube(pos, placer, pointed_thing) then
|
||||
minetest.remove_node(pos)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
VTube:after_dig_tube(pos, oldnode, oldmetadata)
|
||||
end,
|
||||
|
||||
paramtype2 = "facedir", -- important!
|
||||
on_rotate = screwdriver.disallow, -- important!
|
||||
paramtype = "light",
|
||||
use_texture_alpha = techage.CLIP,
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 2},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_node("techage:ta4_vtubeA", {
|
||||
description = S("TA4 Vacuum Tube"),
|
||||
drawtype = "nodebox",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_collider_tube.png^[transformR90",
|
||||
'techage_collider_tube.png^techage_collider_tube_open.png',
|
||||
"techage_collider_tube.png",
|
||||
"techage_collider_tube.png",
|
||||
"techage_collider_tube.png^[transformR90",
|
||||
'techage_collider_tube.png^techage_collider_tube_open.png',
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-8/16, -8/16, -8/16, -6/16, 8/16, 8/16},
|
||||
{ 6/16, -8/16, -8/16, 8/16, 8/16, 8/16},
|
||||
{-8/16, 6/16, -8/16, 8/16, 8/16, 8/16},
|
||||
{-8/16, -8/16, 6/16, 8/16, 8/16, 8/16},
|
||||
{-8/16, -8/16, -8/16, 8/16, -6/16, -6/16},
|
||||
},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16},
|
||||
},
|
||||
|
||||
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
||||
VTube:after_dig_tube(pos, oldnode, oldmetadata)
|
||||
end,
|
||||
|
||||
paramtype2 = "facedir", -- important!
|
||||
on_rotate = screwdriver.disallow, -- important!
|
||||
paramtype = "light",
|
||||
use_texture_alpha = techage.CLIP,
|
||||
sunlight_propagates = true,
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 1, not_in_creative_inventory=1},
|
||||
drop = "techage:ta4_vtubeS",
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_vtubeS 4",
|
||||
recipe = {
|
||||
{'', 'default:steel_ingot', ''},
|
||||
{'techage:aluminum', 'dye:blue', 'techage:aluminum'},
|
||||
{'', 'default:steel_ingot', ''},
|
||||
},
|
||||
})
|
||||
@@ -0,0 +1,208 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
TA4 Detector Worlker as part of the Collider
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
local S = techage.S
|
||||
|
||||
local AssemblyPlan = {
|
||||
-- y-offs, path, facedir-offs, name
|
||||
-- 0 = forward, 1 = right, 2 = backward, 3 = left
|
||||
|
||||
-- level 1
|
||||
-- left/right
|
||||
{ 1, {3,3,3,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {3,3,3}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {3,3,3,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {1,1,1,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {1,1,1}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {1,1,1,0}, 0, "techage:ta4_colliderblock"},
|
||||
-- front
|
||||
{ 1, {3,3,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {3,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {1,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {1,1,2}, 0, "techage:ta4_colliderblock"},
|
||||
-- back
|
||||
{ 1, {3,3,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {3,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {0}, 2, "techage:ta4_collider_pipe_inlet"},
|
||||
{ 1, {1,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 1, {1,1,0}, 0, "techage:ta4_colliderblock"},
|
||||
-- middle
|
||||
{ 1, {3,3}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 1, {3}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 1, {1}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 1, {1,1}, 0, "techage:ta4_detector_magnet"},
|
||||
|
||||
-- level 2
|
||||
-- left/right
|
||||
{ 2, {3,3,3,2}, 1, "techage:ta4_collider_pipe_inlet"},
|
||||
{ 2, {3,3,3}, 1, "techage:ta4_collider_tube_inlet"},
|
||||
{ 2, {3,3,3,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 2, {1,1,1,2}, 3, "techage:ta4_collider_pipe_inlet"},
|
||||
{ 2, {1,1,1}, 3, "techage:ta4_collider_tube_inlet"},
|
||||
{ 2, {1,1,1,0}, 0, "techage:ta4_colliderblock"},
|
||||
-- front
|
||||
{ 2, {3,3,2}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 2, {3,2}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 2, {2}, 0, "default:obsidian_glass"},
|
||||
{ 2, {1,2}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 2, {1,1,2}, 0, "techage:ta4_detector_magnet"},
|
||||
-- back
|
||||
{ 2, {3,3,0}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 2, {3,0}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 2, {0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 2, {1,0}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 2, {1,1,0}, 0, "techage:ta4_detector_magnet"},
|
||||
|
||||
-- level 3
|
||||
-- left/right
|
||||
{ 3, {3,3,3,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {3,3,3}, 1, "techage:ta4_collider_cable_inlet"},
|
||||
{ 3, {3,3,3,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {1,1,1,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {1,1,1}, 3, "techage:ta4_collider_cable_inlet"},
|
||||
{ 3, {1,1,1,0}, 0, "techage:ta4_colliderblock"},
|
||||
-- front
|
||||
{ 3, {3,3,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {3,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {1,2}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {1,1,2}, 0, "techage:ta4_colliderblock"},
|
||||
-- back
|
||||
{ 3, {3,3,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {3,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {0}, 2, "techage:ta4_collider_pipe_inlet"},
|
||||
{ 3, {1,0}, 0, "techage:ta4_colliderblock"},
|
||||
{ 3, {1,1,0}, 0, "techage:ta4_colliderblock"},
|
||||
-- middle
|
||||
{ 3, {3,3}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 3, {3}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 3, {}, 0, "techage:ta4_collider_pipe_outlet"},
|
||||
{ 3, {1}, 0, "techage:ta4_detector_magnet"},
|
||||
{ 3, {1,1}, 0, "techage:ta4_detector_magnet"},
|
||||
|
||||
-- Core block
|
||||
{ 1, {}, 0, "techage:ta4_detector_core"},
|
||||
}
|
||||
|
||||
local t = {}
|
||||
for name, cnt in pairs(techage.assemble.count_items(AssemblyPlan)) do
|
||||
t[#t + 1] = " - " .. cnt .. " " .. name
|
||||
end
|
||||
local LABEL = table.concat(t, "\n")
|
||||
|
||||
local function build(pos, player_name)
|
||||
minetest.chat_send_player(player_name, S("[TA4] Detector is being built!"))
|
||||
local inv = M(pos):get_inventory()
|
||||
techage.assemble.build_inv(pos, inv, AssemblyPlan, player_name)
|
||||
end
|
||||
|
||||
local function remove(pos, player_name)
|
||||
minetest.chat_send_player(player_name, S("[TA4] Detector is being removed!"))
|
||||
local inv = M(pos):get_inventory()
|
||||
techage.assemble.remove_inv(pos, inv, AssemblyPlan, player_name)
|
||||
end
|
||||
|
||||
|
||||
local function formspec()
|
||||
return "size[8,8.2]"..
|
||||
"list[context;src;5,0;3,3;]"..
|
||||
"label[0.2,-0.2;" .. S("Item list") .. ":\n" .. LABEL .. "]" ..
|
||||
"button_exit[0,3.5;4,1;build;" .. S("Build detector") .. "]" ..
|
||||
"button_exit[4,3.5;4,1;remove;" .. S("Remove detector") .. "]" ..
|
||||
"list[current_player;main;0,4.5;8,4;]"..
|
||||
"listring[context;src]"..
|
||||
"listring[current_player;main]"
|
||||
end
|
||||
|
||||
minetest.register_node("techage:ta4_collider_detector_worker", {
|
||||
description = S("TA4 Collider Detector Worker"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"default_steel_block.png^techage_collider_detector_appl.png^techage_collider_detector_banner.png",
|
||||
"default_steel_block.png^techage_collider_detector_banner.png",
|
||||
"default_steel_block.png^techage_collider_detector_banner.png",
|
||||
"default_steel_block.png^techage_collider_detector_banner.png",
|
||||
"default_steel_block.png^techage_collider_detector_banner.png",
|
||||
"default_steel_block.png^techage_collider_detector_appl.png^techage_collider_detector_banner.png",
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky = 1},
|
||||
on_rotate = screwdriver.disallow,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
|
||||
after_place_node = function(pos, placer, itemstack)
|
||||
if pos.y > (techage.collider_min_depth - 2) then
|
||||
minetest.remove_node(pos)
|
||||
minetest.add_item(pos, ItemStack("techage:ta4_collider_detector_worker"))
|
||||
return
|
||||
end
|
||||
local inv = M(pos):get_inventory()
|
||||
inv:set_size("src", 9)
|
||||
M(pos):set_string("formspec", formspec())
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return
|
||||
end
|
||||
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if fields.build then
|
||||
if not nvm.assemble_locked then
|
||||
build(pos, player:get_player_name())
|
||||
end
|
||||
elseif fields.remove then
|
||||
if not nvm.assemble_locked then
|
||||
local nvm = techage.get_nvm({x=pos.x, y=pos.y + 1, z=pos.z})
|
||||
if not nvm.locked then
|
||||
remove(pos, player:get_player_name())
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
after_dig_node = function(pos, oldnode)
|
||||
techage.del_mem(pos)
|
||||
end,
|
||||
|
||||
can_dig = function(pos, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return false
|
||||
end
|
||||
local nvm = techage.get_nvm(pos)
|
||||
if nvm.assemble_locked or nvm.assemble_build then
|
||||
minetest.after(30, function(pos)
|
||||
local nvm = techage.get_nvm(pos)
|
||||
nvm.assemble_locked = false
|
||||
end, pos)
|
||||
return false
|
||||
end
|
||||
local inv = M(pos):get_inventory()
|
||||
return inv:is_empty("src")
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
minetest.register_craft({
|
||||
output = "techage:ta4_collider_detector_worker",
|
||||
recipe = {
|
||||
{'techage:aluminum', 'default:chest', 'default:steel_ingot'},
|
||||
{'', 'basic_materials:gear_steel', ''},
|
||||
{'default:steel_ingot', 'default:mese_crystal', 'techage:aluminum'},
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user