bugfixes for power terminal and tank/pump lines

distiller protopype added
master
Joachim Stolberg 2019-11-08 21:10:05 +01:00
parent f7b69840a0
commit 1a248ff49c
33 changed files with 656 additions and 115 deletions

View File

@ -50,8 +50,8 @@ minetest.register_entity(":techage:position_cube", {
}, },
--use_texture_alpha = true, --use_texture_alpha = true,
physical = false, physical = false,
visual_size = {x = 1.2, y = 1.2}, visual_size = {x = 1.1, y = 1.1},
collisionbox = {-0.6,-0.6,-0.6, 0.6,0.6,0.6}, collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55},
glow = 8, glow = 8,
}, },
on_step = function(self, dtime) on_step = function(self, dtime)

View File

@ -64,6 +64,16 @@ local function net_def2(node_name, net_name)
return ndef and ndef.networks and ndef.networks[net_name] or {} return ndef and ndef.networks and ndef.networks[net_name] or {}
end end
local function connected(tlib2, pos, dir)
local param2, npos = tlib2:get_primary_node_param2(pos, dir)
if param2 then
local d1, d2, num = tlib2:decode_param2(npos, param2)
if not num then return end
return Flip[dir] == d1 or Flip[dir] == d2
end
return false
end
-- Calculate the node outdir based on node.param2 and nominal dir (according to side) -- Calculate the node outdir based on node.param2 and nominal dir (according to side)
local function dir_to_outdir(dir, param2) local function dir_to_outdir(dir, param2)
if dir < 5 then if dir < 5 then
@ -115,7 +125,7 @@ local function node_connections(pos, tlib2)
val = val * 2 val = val * 2
local side = DirToSide[outdir_to_dir(dir, node.param2)] local side = DirToSide[outdir_to_dir(dir, node.param2)]
if sides[side] then if sides[side] then
if tlib2:connected(pos, dir) then if connected(tlib2, pos, dir) then
val = val + 1 val = val + 1
end end
end end
@ -139,7 +149,7 @@ end
-- check if the given pipe dir into the node is valid -- check if the given pipe dir into the node is valid
local function valid_indir(indir, node, net_name) local function valid_indir(indir, node, net_name)
local ndef = net_def2(node.name, net_name) local ndef = net_def2(node.name, net_name)
if not ndef or not ndef.sides or ndef.blocker then return false end if not ndef or not ndef.sides then return false end
local side = DirToSide[indir_to_dir(indir, node.param2)] local side = DirToSide[indir_to_dir(indir, node.param2)]
if not ndef.sides[side] then return false end if not ndef.sides[side] then return false end
return true return true
@ -148,14 +158,17 @@ end
-- do the walk through the tubelib2 network -- do the walk through the tubelib2 network
-- indir is the direction which should not be covered by the walk -- indir is the direction which should not be covered by the walk
-- (coming from there or is a different network) -- (coming from there or is a different network)
local function connection_walk(pos, indir, node, tlib2, clbk) local function connection_walk(pos, indir, node, tlib2, lvl, clbk)
if clbk then clbk(pos, indir, node) end if clbk then clbk(pos, indir, node) end
for _,outdir in pairs(get_node_connections(pos, tlib2.tube_type)) do --techage.mark_position("singleplayer", pos, "walk", "", 1)
if outdir ~= Flip[indir] then if lvl == 1 or net_def2(node.name, tlib2.tube_type).ntype == "junc" then
local pos2, indir2 = tlib2:get_connected_node_pos(pos, outdir) for _,outdir in pairs(get_node_connections(pos, tlib2.tube_type)) do
local node = techage.get_node_lvm(pos2) if outdir ~= Flip[indir] then
if pos2 and not pos_already_reached(pos2) and valid_indir(indir2, node, tlib2.tube_type) then local pos2, indir2 = tlib2:get_connected_node_pos(pos, outdir)
connection_walk(pos2, indir2, node, tlib2, clbk) local node = techage.get_node_lvm(pos2)
if pos2 and not pos_already_reached(pos2) and valid_indir(indir2, node, tlib2.tube_type) then
connection_walk(pos2, indir2, node, tlib2, lvl + 1, clbk)
end
end end
end end
end end
@ -170,7 +183,7 @@ local function collect_network_nodes(pos, outdir, tlib2)
local node = techage.get_node_lvm(pos) local node = techage.get_node_lvm(pos)
local net_name = tlib2.tube_type local net_name = tlib2.tube_type
-- outdir corresponds to the indir coming from -- outdir corresponds to the indir coming from
connection_walk(pos, outdir, node, tlib2, function(pos, indir, node) connection_walk(pos, outdir, node, tlib2, 1, function(pos, indir, node)
local ntype = net_def2(node.name, net_name).ntype local ntype = net_def2(node.name, net_name).ntype
if ntype then if ntype then
if not netw[ntype] then netw[ntype] = {} end if not netw[ntype] then netw[ntype] = {} end
@ -233,7 +246,7 @@ function techage.networks.connection_walk(pos, outdir, tlib2, clbk)
NumNodes = 0 NumNodes = 0
pos_already_reached(pos) -- don't consider the start pos pos_already_reached(pos) -- don't consider the start pos
local node = techage.get_node_lvm(pos) local node = techage.get_node_lvm(pos)
connection_walk(pos, outdir, node, tlib2, clbk) connection_walk(pos, outdir, node, tlib2, 1, clbk)
return NumNodes return NumNodes
end end

View File

@ -30,7 +30,7 @@ minetest.register_node("techage:ta4_reactor", {
description = S("TA4 Reactor"), description = S("TA4 Reactor"),
tiles = {"techage_reactor_side.png"}, tiles = {"techage_reactor_side.png"},
drawtype = "mesh", drawtype = "mesh",
mesh = "techage_boiler_huge.obj", mesh = "techage_cylinder_12h.obj",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-1/2, -23/32, -1/2, 1/2, 32/32, 1/2}, fixed = {-1/2, -23/32, -1/2, 1/2, 32/32, 1/2},

View File

@ -22,7 +22,7 @@ minetest.register_node("techage:coalboiler_base", {
description = S("TA3 Boiler Base"), description = S("TA3 Boiler Base"),
tiles = {"techage_coal_boiler_mesh_base.png"}, tiles = {"techage_coal_boiler_mesh_base.png"},
drawtype = "mesh", drawtype = "mesh",
mesh = "techage_boiler_large.obj", mesh = "techage_cylinder_12.obj",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32}, fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32},

View File

@ -223,7 +223,7 @@ minetest.register_node("techage:coalboiler_top", {
description = S("TA3 Boiler Top"), description = S("TA3 Boiler Top"),
tiles = {"techage_coal_boiler_mesh_top.png"}, tiles = {"techage_coal_boiler_mesh_top.png"},
drawtype = "mesh", drawtype = "mesh",
mesh = "techage_boiler_large.obj", mesh = "techage_cylinder_12.obj",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-13/32, -48/32, -13/32, 13/32, 16/32, 13/32}, fixed = {-13/32, -48/32, -13/32, 13/32, 16/32, 13/32},

View File

@ -81,7 +81,7 @@ minetest.register_node("techage:coalfirebox", {
inventory_image = "techage_coal_boiler_inv.png", inventory_image = "techage_coal_boiler_inv.png",
tiles = {"techage_coal_boiler_mesh_top.png"}, tiles = {"techage_coal_boiler_mesh_top.png"},
drawtype = "mesh", drawtype = "mesh",
mesh = "techage_boiler_large.obj", mesh = "techage_cylinder_12.obj",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32}, fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32},
@ -235,7 +235,7 @@ minetest.register_node("techage:oilfirebox", {
inventory_image = "techage_oil_boiler_inv.png", inventory_image = "techage_oil_boiler_inv.png",
tiles = {"techage_coal_boiler_mesh_top.png"}, tiles = {"techage_coal_boiler_mesh_top.png"},
drawtype = "mesh", drawtype = "mesh",
mesh = "techage_boiler_large.obj", mesh = "techage_cylinder_12.obj",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32}, fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32},

View File

@ -13,7 +13,7 @@
]]-- ]]--
-- for lazy programmers -- for lazy programmers
local P2P = minetest.string_to_pos local S2P = minetest.string_to_pos
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local M = minetest.get_meta local M = minetest.get_meta
local N = function(pos) return minetest.get_node(pos).name end local N = function(pos) return minetest.get_node(pos).name end
@ -62,8 +62,10 @@ local function collect_network_data(pos, mem)
add(data.fcel, mem, mem.pwr_available, mem.provided) add(data.fcel, mem, mem.pwr_available, mem.provided)
elseif node.name == "techage:ta4_electrolyzer" or node.name == "techage:ta4_electrolyzer_on" then elseif node.name == "techage:ta4_electrolyzer" or node.name == "techage:ta4_electrolyzer_on" then
add(data.elec, mem, -(mem.pwr_could_need or 0), -(mem.consumed or 0)) add(data.elec, mem, -(mem.pwr_could_need or 0), -(mem.consumed or 0))
elseif mem.pwr_needed and mem.pwr_needed > 0 and (mem.pwr_node_alive_cnt or 0) > 0 then elseif mem.pwr_needed and mem.pwr_needed > 0 then
add(data.other, mem, -(mem.pwr_needed or 0), (-mem.pwr_needed or 0)) local nomi = -mem.pwr_needed
local real = (mem.pwr_node_alive_cnt or 0) > 0 and -mem.pwr_needed
add(data.other, mem, nomi, real)
end end
end end
) )
@ -74,7 +76,7 @@ local function formspec(pos, mem)
local data, nnodes = collect_network_data(pos, mem) local data, nnodes = collect_network_data(pos, mem)
local get = function(kind) local get = function(kind)
return (data[kind].load or 0).." / "..(data[kind].num or 0).." : ".. return (data[kind].load or 0).." / "..(data[kind].num or 0).." : "..
(data[kind].curr or 0).." / "..(data[kind].nomi or 0).. " ku" (data[kind].real or 0).." / "..(data[kind].nomi or 0).. " ku"
end end
local alarm = "" local alarm = ""

View File

@ -416,6 +416,8 @@ techage.manual_DE.aText = {
"Teil des Kraftwerks. \n".. "Teil des Kraftwerks. \n"..
"Der Ölbrenner kann nur mit Öl gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die vom Kraftwerk angefordert wird. Unter Volllast brennt Öl 20 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n".. "Der Ölbrenner kann nur mit Öl gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die vom Kraftwerk angefordert wird. Unter Volllast brennt Öl 20 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n"..
"\n".. "\n"..
"Der Ölbrenner kann nur 50 Einheiten Öl aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam.\n"..
"\n"..
"\n".. "\n"..
"\n", "\n",
"Teil des Kraftwerk. Muss mit Wasser gefüllt werden. Wem kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt\\, schaltet sich der Boiler ab.\n".. "Teil des Kraftwerk. Muss mit Wasser gefüllt werden. Wem kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt\\, schaltet sich der Boiler ab.\n"..
@ -497,6 +499,8 @@ techage.manual_DE.aText = {
"\n", "\n",
"Der kleine Stromgenerator wird mit Erdöl betrieben und kann für kleine Verbraucher mit bis zu 12 ku genutzt werden. Unter Volllast brennt Erdöl 100 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n".. "Der kleine Stromgenerator wird mit Erdöl betrieben und kann für kleine Verbraucher mit bis zu 12 ku genutzt werden. Unter Volllast brennt Erdöl 100 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n"..
"\n".. "\n"..
"Der Stromgenerator kann nur 50 Einheiten Öl aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam.\n"..
"\n"..
"\n".. "\n"..
"\n", "\n",
"Der Akku Block dient zur Speicherung von überschüssiger Energie und gibt bei Stromausfall automatisch Strom ab (soweit vorhanden).\n".. "Der Akku Block dient zur Speicherung von überschüssiger Energie und gibt bei Stromausfall automatisch Strom ab (soweit vorhanden).\n"..
@ -524,6 +528,8 @@ techage.manual_DE.aText = {
"\n", "\n",
"Ist Teil des TA3 Industrieofen. Muss mit Öl befeuert werden.\n".. "Ist Teil des TA3 Industrieofen. Muss mit Öl befeuert werden.\n"..
"\n".. "\n"..
"Der Ölbrenner kann nur 50 Einheiten Öl aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam.\n"..
"\n"..
"\n".. "\n"..
"\n", "\n",
"Ist Teil des TA3 Industrieofen. Siehe TA3 Industrieofen.\n".. "Ist Teil des TA3 Industrieofen. Siehe TA3 Industrieofen.\n"..
@ -790,6 +796,10 @@ techage.manual_DE.aText = {
"\n".. "\n"..
"Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden.\n".. "Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden.\n"..
"\n".. "\n"..
"Hinweis 1: Die Pumpe darf nicht direkt neben den Tank platziert werden. Es muss immer mindestens ein Stück gelbe Leitung dazwischen sein.\n"..
"\n"..
"Hinweis 2: Nach dem Starten markiert die Pumpe 10 x die Blöcke\\, von und zu denen gepumpt wird.\n"..
"\n"..
"\n".. "\n"..
"\n", "\n",
"", "",

View File

@ -75,6 +75,7 @@ local function get_radius(pos, in_dir)
return radius return radius
end end
end end
return 1
end end
local function check_volume(pos, in_dir, owner) local function check_volume(pos, in_dir, owner)

View File

@ -164,6 +164,8 @@ else
dofile(MP.."/oil/drillbox.lua") dofile(MP.."/oil/drillbox.lua")
dofile(MP.."/oil/pumpjack.lua") dofile(MP.."/oil/pumpjack.lua")
dofile(MP.."/oil/generator.lua") dofile(MP.."/oil/generator.lua")
--dofile(MP.."/oil/distiller.lua")
--dofile(MP.."/oil/reboiler.lua")
-- Nodes2 -- Nodes2
if techage.basalt_stone_enabled then if techage.basalt_stone_enabled then
@ -216,7 +218,6 @@ else
-- Chemistry -- Chemistry
--dofile(MP.."/chemistry/ta4_reactor.lua") --dofile(MP.."/chemistry/ta4_reactor.lua")
--dofile(MP.."/chemistry/ta4_doser.lua") --dofile(MP.."/chemistry/ta4_doser.lua")
--dofile(MP.."/chemistry/ta4_distiller.lua")
-- Hydrogen -- Hydrogen
dofile(MP.."/hydrogen/hydrogen.lua") dofile(MP.."/hydrogen/hydrogen.lua")

View File

@ -111,14 +111,17 @@ end
-- Add given amount of liquid to the remote inventory. -- Add given amount of liquid to the remote inventory.
-- return leftover amount -- return leftover amount
function techage.liquid.put(pos, outdir, name, amount) function techage.liquid.put(pos, outdir, name, amount, player_name)
for _,item in ipairs(get_network_table(pos, outdir, "tank")) do for _,item in ipairs(get_network_table(pos, outdir, "tank")) do
local liquid = LQD(item.pos) local liquid = LQD(item.pos)
if liquid and liquid.put and liquid.peek then if liquid and liquid.put and liquid.peek then
-- wrong items? -- wrong items?
local peek = liquid.peek(item.pos, item.indir) local peek = liquid.peek(item.pos, item.indir)
if peek and peek ~= name then return amount or 0 end if peek and peek ~= name then return amount or 0 end
--techage.mark_position("singleplayer", item.pos, "put", "", 1) ------------------- debug if player_name then
local num = techage.get_node_number(pos)
techage.mark_position(player_name, item.pos, "("..num..") put", "", 1)
end
amount = liquid.put(item.pos, item.indir, name, amount) amount = liquid.put(item.pos, item.indir, name, amount)
if not amount or amount == 0 then break end if not amount or amount == 0 then break end
end end
@ -128,13 +131,16 @@ end
-- Take given amount of liquid for the remote inventory. -- Take given amount of liquid for the remote inventory.
-- return taken amount and item name -- return taken amount and item name
function techage.liquid.take(pos, outdir, name, amount) function techage.liquid.take(pos, outdir, name, amount, player_name)
local taken = 0 local taken = 0
local item_name = nil local item_name = nil
for _,item in ipairs(get_network_table(pos, outdir, "tank")) do for _,item in ipairs(get_network_table(pos, outdir, "tank")) do
local liquid = LQD(item.pos) local liquid = LQD(item.pos)
if liquid and liquid.take then if liquid and liquid.take then
--techage.mark_position("singleplayer", item.pos, "take", "", 1) ------------------- debug if player_name then
local num = techage.get_node_number(pos)
techage.mark_position(player_name, item.pos, "("..num..") take", "", 1)
end
local val, name = liquid.take(item.pos, item.indir, name, amount - taken) local val, name = liquid.take(item.pos, item.indir, name, amount - taken)
if val and name then if val and name then
taken = taken + val taken = taken + val

View File

@ -25,6 +25,7 @@ local Pipe = tubelib2.Tube:new({
dirs_to_check = {1,2,3,4,5,6}, dirs_to_check = {1,2,3,4,5,6},
max_tube_length = MAX_PIPE_LENGHT, max_tube_length = MAX_PIPE_LENGHT,
show_infotext = false, show_infotext = false,
force_to_use_tubes = true,
tube_type = "pipe", tube_type = "pipe",
primary_node_names = {"techage:ta3_pipeS", "techage:ta3_pipeA"}, primary_node_names = {"techage:ta3_pipeS", "techage:ta3_pipeA"},
secondary_node_names = {}, secondary_node_names = {},

View File

@ -21,11 +21,31 @@ local networks = techage.networks
local liquid = techage.liquid local liquid = techage.liquid
local Flip = techage.networks.Flip local Flip = techage.networks.Flip
local STANDBY_TICKS = 10 local STANDBY_TICKS = 5
local COUNTDOWN_TICKS = 10 local COUNTDOWN_TICKS = 5
local CYCLE_TIME = 2 local CYCLE_TIME = 2
local CAPA = 4 local CAPA = 4
-- to mark the pump source and destinstion node
local DebugCache = {}
local function set_starter_name(pos, clicker)
local key = minetest.hash_node_position(pos)
DebugCache[key] = {starter = clicker:get_player_name(), count = 10}
end
local function get_starter_name(pos)
local key = minetest.hash_node_position(pos)
local def = DebugCache[key]
if def then
def.count = (def.count or 0) - 1
if def.count > 0 then
return def.starter
end
DebugCache[key] = nil
end
end
local State3 = techage.NodeStates:new({ local State3 = techage.NodeStates:new({
node_name_passive = "techage:t3_pump", node_name_passive = "techage:t3_pump",
node_name_active = "techage:t3_pump_on", node_name_active = "techage:t3_pump_on",
@ -44,9 +64,10 @@ local State4 = techage.NodeStates:new({
local function pumping(pos, mem, state, capa) local function pumping(pos, mem, state, capa)
local outdir = M(pos):get_int("outdir") local outdir = M(pos):get_int("outdir")
local taken, name = liquid.take(pos, Flip[outdir], nil, capa) local starter = get_starter_name(pos)
local taken, name = liquid.take(pos, Flip[outdir], nil, capa, starter)
if taken > 0 then if taken > 0 then
local leftover = liquid.put(pos, outdir, name, taken) local leftover = liquid.put(pos, outdir, name, taken, starter)
if leftover and leftover > 0 then if leftover and leftover > 0 then
liquid.put(pos, Flip[outdir], name, leftover) liquid.put(pos, Flip[outdir], name, leftover)
state:blocked(pos, mem) state:blocked(pos, mem)
@ -89,10 +110,12 @@ end
local function on_rightclick(pos, node, clicker) local function on_rightclick(pos, node, clicker)
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
if node.name == "techage:t3_pump" then if node.name == "techage:t3_pump" then
set_starter_name(pos, clicker)
State3:start(pos, mem) State3:start(pos, mem)
elseif node.name == "techage:t3_pump_on" then elseif node.name == "techage:t3_pump_on" then
State3:stop(pos, mem) State3:stop(pos, mem)
elseif node.name == "techage:t4_pump" then elseif node.name == "techage:t4_pump" then
set_starter_name(pos, clicker)
State4:start(pos, mem) State4:start(pos, mem)
elseif node.name == "techage:t4_pump_on" then elseif node.name == "techage:t4_pump_on" then
State4:stop(pos, mem) State4:stop(pos, mem)
@ -187,7 +210,6 @@ local nworks = {
pipe = { pipe = {
sides = {L = 1, R = 1}, -- Pipe connection side sides = {L = 1, R = 1}, -- Pipe connection side
ntype = "pump", ntype = "pump",
blocker = true, -- for the connection_walk
}, },
} }

View File

@ -238,15 +238,15 @@ minetest.register_node("techage:oiltank", {
paramtype = "light", paramtype = "light",
node_box = { node_box = {
type = "fixed", type = "fixed",
fixed = {-6/8, -6/8, -6/8, 6/8, 6/8, 6/8}, fixed = {-6/8, -4/8, -6/8, 6/8, 6/8, 6/8},
}, },
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-6/8, -6/8, -6/8, 6/8, 6/8, 6/8}, fixed = {-6/8, -4/8, -6/8, 6/8, 6/8, 6/8},
}, },
collision_box = { collision_box = {
type = "fixed", type = "fixed",
fixed = {-6/8, -6/8, -6/8, 6/8, 6/8, 6/8}, fixed = {-6/8, -4/8, -6/8, 6/8, 6/8, 6/8},
}, },
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)

View File

@ -38,6 +38,9 @@ Die Feuerbox muss mit Kohle, Holzkohle oder Erdöl gefüllt werden. Die Brenndau
Teil des Kraftwerks. Teil des Kraftwerks.
Der Ölbrenner kann nur mit Öl gefüllt werden. Die Brenndauer ist abhängig von der Leistung, die vom Kraftwerk angefordert wird. Unter Volllast brennt Öl 20 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit). Der Ölbrenner kann nur mit Öl gefüllt werden. Die Brenndauer ist abhängig von der Leistung, die vom Kraftwerk angefordert wird. Unter Volllast brennt Öl 20 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).
Der Ölbrenner kann nur 50 Einheiten Öl aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam.
[ta3_oilbox|image] [ta3_oilbox|image]
@ -162,6 +165,9 @@ siehe TA Stromschalter.
Der kleine Stromgenerator wird mit Erdöl betrieben und kann für kleine Verbraucher mit bis zu 12 ku genutzt werden. Unter Volllast brennt Erdöl 100 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit). Der kleine Stromgenerator wird mit Erdöl betrieben und kann für kleine Verbraucher mit bis zu 12 ku genutzt werden. Unter Volllast brennt Erdöl 100 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).
Der Stromgenerator kann nur 50 Einheiten Öl aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam.
[ta3_tinygenerator|image] [ta3_tinygenerator|image]
@ -194,6 +200,7 @@ Der Industrieofen benötigt Strom (für das Gebläse) sowie Öl für den Brenner
Die Brennzeit für Öl beträgt 80 s. Die Brennzeit für Öl beträgt 80 s.
[ta3_furnace|plan] [ta3_furnace|plan]
@ -201,6 +208,8 @@ Die Brennzeit für Öl beträgt 80 s.
Ist Teil des TA3 Industrieofen. Muss mit Öl befeuert werden. Ist Teil des TA3 Industrieofen. Muss mit Öl befeuert werden.
Der Ölbrenner kann nur 50 Einheiten Öl aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam.
[ta3_furnacefirebox|image] [ta3_furnacefirebox|image]
@ -568,6 +577,10 @@ Mit der Pumpe können Flüssigkeiten von Tanks oder Behältern zu anderen Tanks
Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden. Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden.
Hinweis 1: Die Pumpe darf nicht direkt neben den Tank platziert werden. Es muss immer mindestens ein Stück gelbe Leitung dazwischen sein.
Hinweis 2: Nach dem Starten markiert die Pumpe 10 x die Blöcke, von und zu denen gepumpt wird.
[ta3_pump|image] [ta3_pump|image]

9
models/size.py Normal file
View File

@ -0,0 +1,9 @@
lOut = []
for line in file("techage_boiler_large.obj"):
words = line.split(" ")
if words[0] == "v":
words[1] = "%1.6f" % (float(words[1]) * 1.2)
words[3] = "%1.6f" % (float(words[3]) * 1.2)
line = " ".join(words)
lOut.append(line.strip())
file("techage_boiler_bigger.obj", "wt").write("\n".join(lOut))

View File

@ -0,0 +1,124 @@
# Blender v2.78 (sub 0) OBJ File: 'oven.blend'
# www.blender.org
o Cylinder
v 0.000000 -0.500000 -0.720000
v 0.000000 0.500000 -0.720000
v 0.275532 -0.500000 -0.665194
v 0.275532 0.500000 -0.665194
v 0.509117 -0.500000 -0.509117
v 0.509117 0.500000 -0.509117
v 0.665194 -0.500000 -0.275532
v 0.665194 0.500000 -0.275532
v 0.720000 -0.500000 0.000000
v 0.720000 0.500000 0.000000
v 0.665194 -0.500000 0.275532
v 0.665194 0.500000 0.275532
v 0.509117 -0.500000 0.509117
v 0.509117 0.500000 0.509117
v 0.275532 -0.500000 0.665194
v 0.275532 0.500000 0.665194
v 0.000000 -0.500000 0.720000
v 0.000000 0.500000 0.720000
v -0.275532 -0.500000 0.665194
v -0.275532 0.500000 0.665194
v -0.509117 -0.500000 0.509117
v -0.509117 0.500000 0.509117
v -0.665194 -0.500000 0.275532
v -0.665194 0.500000 0.275532
v -0.720000 -0.500000 -0.000000
v -0.720000 0.500000 -0.000000
v -0.665194 -0.500000 -0.275532
v -0.665194 0.500000 -0.275532
v -0.509117 -0.500000 -0.509117
v -0.509117 0.500000 -0.509117
v -0.275532 -0.500000 -0.665194
v -0.275532 0.500000 -0.665194
vt 0.5486 0.5000
vt 0.5486 1.0000
vt 0.4725 1.0000
vt 0.4725 0.5000
vt 0.4142 1.0000
vt 0.4142 0.5000
vt 1.0000 0.5000
vt 1.0000 1.0000
vt 0.9239 1.0000
vt 0.9239 0.5000
vt 0.8415 1.0000
vt 0.8415 0.5000
vt 0.7654 1.0000
vt 0.7654 0.5000
vt 0.4142 0.5000
vt 0.4142 0.0000
vt 0.4725 0.0000
vt 0.4725 0.5000
vt 0.5486 0.0000
vt 0.5486 0.5000
vt 0.6310 0.0000
vt 0.6310 0.5000
vt 0.7071 0.0000
vt 0.7071 0.5000
vt 0.7654 0.0000
vt 0.7654 0.5000
vt 0.8415 0.0000
vt 0.8415 0.5000
vt 0.9239 0.0000
vt 0.9239 0.5000
vt 1.0000 0.0000
vt 1.0000 0.5000
vt 0.7654 0.5000
vt 0.7654 1.0000
vt 0.7071 1.0000
vt 0.7071 0.5000
vt 0.3244 0.4749
vt 0.3827 0.5370
vt 0.4142 0.6181
vt 0.4142 0.7059
vt 0.3827 0.7870
vt 0.3244 0.8491
vt 0.2483 0.8827
vt 0.1659 0.8827
vt 0.0898 0.8491
vt 0.0315 0.7870
vt 0.0000 0.7059
vt 0.0000 0.6181
vt 0.0315 0.5370
vt 0.0898 0.4749
vt 0.1659 0.4414
vt 0.2483 0.4414
vt 0.6310 1.0000
vt 0.6310 0.5000
vt 0.0000 0.2646
vt 0.0000 0.1768
vt 0.0315 0.0957
vt 0.0898 0.0336
vt 0.1659 0.0000
vt 0.2483 0.0000
vt 0.3244 0.0336
vt 0.3827 0.0957
vt 0.4142 0.1768
vt 0.4142 0.2646
vt 0.3827 0.3457
vt 0.3244 0.4078
vt 0.2483 0.4414
vt 0.1659 0.4414
vt 0.0898 0.4078
vt 0.0315 0.3457
s off
f 1/1 2/2 4/3 3/4
f 3/4 4/3 6/5 5/6
f 5/7 6/8 8/9 7/10
f 7/10 8/9 10/11 9/12
f 9/12 10/11 12/13 11/14
f 11/15 12/16 14/17 13/18
f 13/18 14/17 16/19 15/20
f 15/20 16/19 18/21 17/22
f 17/22 18/21 20/23 19/24
f 19/24 20/23 22/25 21/26
f 21/26 22/25 24/27 23/28
f 23/28 24/27 26/29 25/30
f 25/30 26/29 28/31 27/32
f 27/33 28/34 30/35 29/36
f 4/37 2/38 32/39 30/40 28/41 26/42 24/43 22/44 20/45 18/46 16/47 14/48 12/49 10/50 8/51 6/52
f 29/36 30/35 32/53 31/54
f 31/54 32/53 2/2 1/1
f 1/55 3/56 5/57 7/58 9/59 11/60 13/61 15/62 17/63 19/64 21/65 23/66 25/67 27/68 29/69 31/70

View File

@ -18,7 +18,7 @@ minetest.register_node("techage:pillar", {
description = S("TA4 Pillar"), description = S("TA4 Pillar"),
tiles = {"techage_concrete.png"}, tiles = {"techage_concrete.png"},
drawtype = "mesh", drawtype = "mesh",
mesh = "techage_pillar.obj", mesh = "techage_cylinder_07.obj",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-8/32, -16/32, -8/32, 8/32, 16/32, 8/32}, fixed = {-8/32, -16/32, -8/32, 8/32, 16/32, 8/32},

226
oil/distiller.lua Normal file
View File

@ -0,0 +1,226 @@
--[[
TechAge
=======
Copyright (C) 2019 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
TA3 Distillation Tower
]]--
local S2P = minetest.string_to_pos
local P2S = minetest.pos_to_string
local M = minetest.get_meta
local S = techage.S
local Pipe = techage.LiquidPipe
local networks = techage.networks
local liquid = techage.liquid
local function orientation(pos, names)
local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
for _,name in ipairs(names) do
if node.name == name then
local param2 = node.param2
node = minetest.get_node(pos)
node.param2 = param2
minetest.swap_node(pos, node)
return
end
end
minetest.remove_node(pos)
return true
end
local function after_place_node(pos, placer)
Pipe:after_place_node(pos)
end
local function tubelib2_on_update2(pos, dir, tlib2, node)
liquid.update_network(pos)
end
local function after_dig_node(pos, oldnode, oldmetadata, digger)
Pipe:after_dig_node(pos)
end
minetest.register_node("techage:ta3_distiller_base", {
description = S("TA3 Distillation Tower Base"),
tiles = {
-- up, down, right, left, back, front
"techage_concrete.png^techage_appl_arrowXL.png^techage_appl_hole_pipe.png",
"techage_concrete.png",
"techage_concrete.png",
"techage_concrete.png",
"techage_concrete.png^techage_appl_hole_pipe.png",
"techage_concrete.png",
},
drawtype = "nodebox",
paramtype = "light",
node_box = {
type = "fixed",
fixed = {-6/8, -4/8, -6/8, 6/8, 4/8, 6/8},
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
collision_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
after_place_node = after_place_node,
tubelib2_on_update2 = tubelib2_on_update2,
after_dig_node = after_dig_node,
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
groups = {cracky=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:ta3_distiller1", {
description = S("TA3 Distillation Tower 1"),
tiles = {"techage_distiller1.png"},
drawtype = "mesh",
mesh = "techage_cylinder_14.obj",
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
collision_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
after_place_node = function(pos, placer)
local res = orientation(pos, {"techage:ta3_distiller_base"})
M(pos):set_int("outdir", networks.side_to_outdir(pos, "R"))
after_place_node(pos, placer)
return res
end,
tubelib2_on_update2 = tubelib2_on_update2,
after_dig_node = after_dig_node,
paramtype = "light",
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
groups = {cracky=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:ta3_distiller2", {
description = S("TA3 Distillation Tower 2"),
tiles = {"techage_distiller2.png"},
drawtype = "mesh",
mesh = "techage_cylinder_14.obj",
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
collision_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
after_place_node = function(pos, placer)
return orientation(pos, {"techage:ta3_distiller1", "techage:ta3_distiller3"})
end,
paramtype = "light",
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
groups = {cracky=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:ta3_distiller3", {
description = S("TA3 Distillation Tower 3"),
tiles = {"techage_distiller3.png"},
drawtype = "mesh",
mesh = "techage_cylinder_14.obj",
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
collision_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
after_place_node = function(pos, placer)
local res = orientation(pos, {"techage:ta3_distiller2"})
return res
end,
tubelib2_on_update2 = tubelib2_on_update2,
after_dig_node = after_dig_node,
paramtype = "light",
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
groups = {cracky=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:ta3_distiller4", {
description = S("TA3 Distillation Tower 4"),
tiles = {"techage_distiller4.png"},
drawtype = "mesh",
mesh = "techage_cylinder_14.obj",
selection_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
collision_box = {
type = "fixed",
fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
},
after_place_node = function(pos, placer)
local res = orientation(pos, {"techage:ta3_distiller3"})
after_place_node(pos, placer)
return res
end,
tubelib2_on_update2 = tubelib2_on_update2,
after_dig_node = after_dig_node,
paramtype = "light",
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
groups = {cracky=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
Pipe:add_secondary_node_names({
"techage:ta3_distiller_base",
"techage:ta3_distiller1", "techage:ta3_distiller2",
"techage:ta3_distiller3", "techage:ta3_distiller4",
})
techage.register_node({"techage:ta3_distiller1"}, {
on_recv_message = function(pos, src, topic, payload)
if topic == "put" then
local pos2 = {x = pos.x, y = pos.y + payload.height, z = pos.z}
local outdir = 6
if payload.height ~= 7 then
outdir = M(pos):get_int("outdir")
end
techage.mark_position("singleplayer", pos2, "put", "", 1)------------------------debug
return liquid.put(pos2, outdir, payload.name, payload.amount)
end
end,
})

190
oil/reboiler.lua Normal file
View File

@ -0,0 +1,190 @@
--[[
TechAge
=======
Copyright (C) 2019 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
TA3 Oil Reboiler
]]--
local S2P = minetest.string_to_pos
local P2S = minetest.pos_to_string
local M = minetest.get_meta
local S = techage.S
local Pipe = techage.LiquidPipe
local networks = techage.networks
local liquid = techage.liquid
local Flip = techage.networks.Flip
local CYCLE_TIME = 4
local CAPA = 12
local function swap_node(pos)
local node = techage.get_node_lvm(pos)
if node.name == "techage:ta3_reboiler" then
node.name = "techage:ta3_reboiler_on"
else
node.name = "techage:ta3_reboiler"
end
minetest.swap_node(pos, node)
end
--local function pumping(pos, mem, state, capa)
-- local outdir = M(pos):get_int("outdir")
-- local taken, name = liquid.take(pos, Flip[outdir], nil, capa)
-- if taken > 0 then
-- local leftover = liquid.put(pos, outdir, name, taken)
-- if leftover and leftover > 0 then
-- liquid.put(pos, Flip[outdir], name, leftover)
-- state:blocked(pos, mem)
-- return
-- end
-- state:keep_running(pos, mem, COUNTDOWN_TICKS)
-- return
-- end
-- state:idle(pos, mem)
--end
local function after_place_node(pos, placer)
M(pos):set_int("outdir", networks.side_to_outdir(pos, "R"))
Pipe:after_place_node(pos)
end
local function node_timer(pos, elapsed)
local mem = tubelib2.get_mem(pos)
pumping(pos, mem, State3, CAPA)
return State3:is_active(mem)
end
local function tubelib2_on_update2(pos, outdir, tlib2, node)
liquid.update_network(pos, outdir)
end
local function after_dig_node(pos, oldnode, oldmetadata, digger)
Pipe:after_dig_node(pos)
end
local _liquid = {
capa = CAPA,
peek = liquid.srv_peek,
put = function(pos, indir, name, amount)
--start timer
return liquid.srv_put(pos, indir, name, amount)
end,
take = liquid.srv_take,
}
local _networks = {
pipe = {
sides = {L = true, R = true}, -- Pipe connection sides
ntype = "tank",
},
}
local function on_rightclick(pos, node, clicker)
swap_node(pos)
end
minetest.register_node("techage:ta3_reboiler", {
description = S("TA3 Oil Reboiler"),
tiles = {
-- up, down, right, left, back, front
"techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png",
"techage_filling_ta3.png^techage_frame_ta3.png",
"techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png",
"techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png",
"techage_filling_ta3.png^techage_appl_reboiler.png^techage_frame_ta3.png^[transformFX",
"techage_filling_ta3.png^techage_appl_reboiler.png^techage_frame_ta3.png",
},
after_place_node = function(pos, placer)
local mem = tubelib2.init_mem(pos)
mem.liquid = {}
local meta = M(pos)
meta:set_string("infotext", S("TA3 Oil Reboiler"))
meta:set_int("outdir", networks.side_to_outdir(pos, "R"))
Pipe:after_place_node(pos)
end,
tubelib2_on_update2 = tubelib2_on_update2,
on_timer = node_timer,
after_dig_node = after_dig_node,
on_rightclick = on_rightclick,
liquid = _liquid,
networks = _networks,
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
groups = {cracky=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:ta3_reboiler_on", {
description = S("TA3 Oil Reboiler"),
tiles = {
-- up, down, right, left, back, front
"techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png",
"techage_filling_ta3.png^techage_frame_ta3.png",
"techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png",
"techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png",
{
image = "techage_filling4_ta3.png^techage_appl_reboiler4.png^techage_frame4_ta3.png^[transformFX",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 2.0,
},
},
{
image = "techage_filling4_ta3.png^techage_appl_reboiler4.png^techage_frame4_ta3.png",
backface_culling = false,
animation = {
type = "vertical_frames",
aspect_w = 32,
aspect_h = 32,
length = 2.0,
},
},
},
tubelib2_on_update2 = tubelib2_on_update2,
on_timer = node_timer,
after_dig_node = after_dig_node,
on_rightclick = on_rightclick,
liquid = _liquid,
networks = _networks,
paramtype2 = "facedir",
on_rotate = screwdriver.disallow,
groups = {cracky=2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
Pipe:add_secondary_node_names({"techage:ta3_reboiler", "techage:ta3_reboiler_on"})
--minetest.register_craft({
-- output = "techage:t3_pump 2",
-- recipe = {
-- {"group:wood", "techage:iron_ingot", "group:wood"},
-- {"techage:ta3_pipeS", "techage:usmium_nuggets", "techage:ta3_pipeS"},
-- {"group:wood", "techage:iron_ingot", "group:wood"},
-- },
--})
--minetest.register_craft({
-- output = "techage:t4_pump",
-- recipe = {
-- {"default:tin_ingot", "dye:blue", "default:steel_ingot"},
-- {"", "techage:t3_pump", ""},
-- {"", "", ""},
-- },
--})

View File

@ -1,77 +0,0 @@
--[[
TechAge
=======
Copyright (C) 2019 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
TA4 Junction Pipes
]]--
-- for lazy programmers
local M = minetest.get_meta
local S = techage.S
local Pipe = techage.BiogasPipe
local power = techage.power
local size1 = 1/8
local size2 = 2/8
local size3 = 13/32
--local size3 = 1/8
local Boxes = {
{
{-size1, -size1, size1, size1, size1, 0.5 }, -- z+
{-size2, -size2, size3, size2, size2, 0.5 }, -- z+
},
{
{-size1, -size1, -size1, 0.5, size1, size1}, -- x+
{ size3, -size2, -size2, 0.5, size2, size2}, -- x+
},
{
{-size1, -size1, -0.5, size1, size1, size1}, -- z-
{-size2, -size2, -0.5, size2, size2, -size3}, -- z-
},
{
{-0.5, -size1, -size1, size1, size1, size1}, -- x-
{-0.5, -size2, -size2, -size3, size2, size2}, -- x-
},
{
{-size1, -0.5, -size1, size1, size1, size1}, -- y-
{-size2, -0.5, -size2, size2, -size3, size2}, -- y-
},
{
{-size1, -size1, -size1, size1, 0.5, size1}, -- y+
{-size2, size3, -size2, size2, 0.5, size2}, -- y+
}
}
techage.register_junction("techage:ta4_junctionpipe", 1/8, Boxes, Pipe, {
description = S("TA4 Junction Pipe"),
tiles = {"techage_gaspipe_junction.png"},
groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1},
sounds = default.node_sound_metal_defaults(),
on_construct = tubelib2.init_mem,
after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir)
local name = "techage:ta4_junctionpipe"..techage.junction_type(pos, Pipe)
minetest.swap_node(pos, {name = name, param2 = 0})
power.network_changed(pos, tubelib2.get_mem(pos))
end,
is_power_available = function(pos)
return techage.power.power_accounting(pos, tubelib2.get_mem(pos))
end,
}, 25)
minetest.register_craft({
output = "techage:ta4_junctionpipe25 2",
recipe = {
{"", "techage:ta4_pipeS", ""},
{"techage:ta4_pipeS", "", "techage:ta4_pipeS"},
{"", "techage:ta4_pipeS", ""},
},
})

View File

@ -214,7 +214,7 @@ minetest.register_node("techage:boiler1", {
description = S("TA2 Boiler Base"), description = S("TA2 Boiler Base"),
tiles = {"techage_boiler.png"}, tiles = {"techage_boiler.png"},
drawtype = "mesh", drawtype = "mesh",
mesh = "techage_boiler.obj", mesh = "techage_cylinder_09.obj",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-8/32, -16/32, -8/32, 8/32, 16/32, 8/32}, fixed = {-8/32, -16/32, -8/32, 8/32, 16/32, 8/32},
@ -232,7 +232,7 @@ minetest.register_node("techage:boiler2", {
description = S("TA2 Boiler Top"), description = S("TA2 Boiler Top"),
tiles = {"techage_boiler2.png"}, tiles = {"techage_boiler2.png"},
drawtype = "mesh", drawtype = "mesh",
mesh = "techage_boiler.obj", mesh = "techage_cylinder_09.obj",
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-10/32, -48/32, -10/32, 10/32, 16/32, 10/32}, fixed = {-10/32, -48/32, -10/32, 10/32, 16/32, 10/32},

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB