TA4 Energy Storage System added

This commit is contained in:
Joachim Stolberg 2019-09-13 23:01:55 +02:00
parent 232f41d2dd
commit 2575976616
17 changed files with 515 additions and 720 deletions

View File

@ -431,9 +431,9 @@ function NodeStates:on_receive_message(pos, topic, payload)
elseif topic == "state" then elseif topic == "state" then
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if node.name == "ignore" then -- unloaded node? if node.name == "ignore" then -- unloaded node?
return "blocked" return "unloaded"
end end
return self:get_state_string(tubelib2.get_mem(pos)) return techage.get_state_string(tubelib2.get_mem(pos))
elseif topic == "counter" then elseif topic == "counter" then
return mem.techage_item_meter or 1 return mem.techage_item_meter or 1
elseif topic == "clear_counter" then elseif topic == "clear_counter" then

View File

@ -18,7 +18,7 @@ local S = techage.S
local CYCLE_TIME = 2 local CYCLE_TIME = 2
local PWR_PERF = 10 local PWR_PERF = 10
local PWR_CAPA = 3000 local PWR_CAPA = 2000
local Power = techage.ElectricCable local Power = techage.ElectricCable
local power = techage.power local power = techage.power
@ -130,9 +130,13 @@ minetest.register_node("techage:ta3_akku", {
on_construct = tubelib2.init_mem, on_construct = tubelib2.init_mem,
after_place_node = function(pos, placer, itemstack) after_place_node = function(pos, placer, itemstack)
local meta = M(pos)
-- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!!
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
State:node_init(pos, mem, "") local own_num = techage.add_node(pos, "techage:ta3_akku")
meta:set_string("owner", placer:get_player_name())
meta:set_string("infotext", S("TA3 Akku Box").." "..own_num)
State:node_init(pos, mem, own_num)
mem.capa = get_capa(itemstack) mem.capa = get_capa(itemstack)
on_rightclick(pos) on_rightclick(pos)
end, end,
@ -159,6 +163,26 @@ techage.power.register_node({"techage:ta3_akku"}, {
power_network = Power, power_network = Power,
}) })
-- for logical communication
techage.register_node({"techage:ta3_akku"}, {
on_recv_message = function(pos, src, topic, payload)
local mem = tubelib2.get_mem(pos)
if topic == "capa" then
return techage.power.percent(PWR_CAPA, mem.capa)
else
return State:on_receive_message(pos, topic, payload)
end
end,
on_node_load = function(pos)
local meta = M(pos)
if meta:get_string("node_number") == "" then
local own_num = techage.add_node(pos, "techage:ta3_akku")
meta:set_string("node_number", own_num)
meta:set_string("infotext", S("TA3 Akku Box").." "..own_num)
end
end,
})
techage.register_entry_page("ta3ps", "akku", techage.register_entry_page("ta3ps", "akku",
S("TA3 Akku Box"), S("TA3 Akku Box"),
S("Used to store electrical energy. Charged in about 10 min, provides energy for 10 min.@n".. S("Used to store electrical energy. Charged in about 10 min, provides energy for 10 min.@n"..

View File

@ -17,6 +17,8 @@ local P = minetest.string_to_pos
local M = minetest.get_meta local M = minetest.get_meta
local S = techage.S local S = techage.S
local BLOCKING_TIME = 2
local Param2ToDir = { local Param2ToDir = {
[0] = 6, [0] = 6,
[1] = 5, [1] = 5,
@ -57,6 +59,9 @@ local function formspec(pos)
"button[1.5,3.3;2,1;update;"..S("Update").."]" "button[1.5,3.3;2,1;update;"..S("Update").."]"
end end
local function update_formspec(pos)
M(pos):set_string("formspec", formspec(pos))
end
minetest.register_node("techage:ta3_power_terminal", { minetest.register_node("techage:ta3_power_terminal", {
description = S("TA3 Power Terminal"), description = S("TA3 Power Terminal"),
@ -81,16 +86,23 @@ minetest.register_node("techage:ta3_power_terminal", {
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local outdir = techage.side_to_outdir("B", node.param2) local outdir = techage.side_to_outdir("B", node.param2)
local jpos = tubelib2.get_pos(pos, outdir) local jpos = tubelib2.get_pos(pos, outdir)
local mem = tubelib2.init_mem(pos)
mem.blocked_until = 0
local meta = M(pos) local meta = M(pos)
meta:set_string("junction_pos", minetest.serialize(jpos)) meta:set_string("junction_pos", minetest.serialize(jpos))
meta:set_string("formspec", formspec(pos)) meta:set_string("formspec", formspec(pos))
end, end,
on_receive_fields = function(pos, formname, fields, player) on_receive_fields = function(pos, formname, fields, player)
if fields.update then local mem = tubelib2.get_mem(pos)
mem.blocked_until = mem.blocked_until or minetest.get_gametime()
if fields.update and mem.blocked_until < minetest.get_gametime() then
M(pos):set_string("formspec", formspec(pos)) M(pos):set_string("formspec", formspec(pos))
mem.blocked_until = minetest.get_gametime() + BLOCKING_TIME
minetest.after(BLOCKING_TIME + 1, update_formspec, pos)
end end
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
M(pos):set_string("formspec", formspec(pos)) M(pos):set_string("formspec", formspec(pos))
end, end,

View File

@ -1,176 +0,0 @@
--[[
TechAge
=======
Copyright (C) 2019 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
TA3 Akku Box
]]--
-- for lazy programmers
local M = minetest.get_meta
local S = techage.S
local CYCLE_TIME = 2
local PWR_PERF = 10
local PWR_CAPA = 3000
local Power = techage.ElectricCable
local power = techage.power
local function in_range(val, min, max)
if val < min then return min end
if val > max then return max end
return val
end
local function formspec(self, pos, mem)
return "size[5,3]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"image[0,0.5;1,2;"..techage.power.formspec_power_bar(PWR_CAPA, mem.capa).."]"..
"label[0.2,2.5;Load]"..
"button[1.1,1;1.8,1;update;"..S("Update").."]"..
"image_button[3,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]"..
"image[4,0.5;1,2;"..techage.power.formspec_load_bar(-(mem.delivered or 0), PWR_PERF).."]"..
"label[4.2,2.5;Flow]"
end
local function start_node(pos, mem, state)
mem.running = true
mem.delivered = 0
power.secondary_start(pos, mem, PWR_PERF, PWR_PERF)
end
local function stop_node(pos, mem, state)
mem.running = false
mem.delivered = 0
power.secondary_stop(pos, mem)
end
local State = techage.NodeStates:new({
node_name_passive = "techage:ta3_akku",
cycle_time = CYCLE_TIME,
standby_ticks = 0,
formspec_func = formspec,
start_node = start_node,
stop_node = stop_node,
})
local function node_timer(pos, elapsed)
local mem = tubelib2.get_mem(pos)
if mem.running then
mem.delivered = power.secondary_alive(pos, mem, mem.capa, PWR_CAPA)
mem.capa = mem.capa - mem.delivered
mem.capa = in_range(mem.capa, 0, PWR_CAPA)
end
return mem.running
end
local function on_receive_fields(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
local mem = tubelib2.get_mem(pos)
State:state_button_event(pos, mem, fields)
if fields.update then
local mem = tubelib2.get_mem(pos)
M(pos):set_string("formspec", formspec(State, pos, mem))
end
end
local function on_rightclick(pos)
local mem = tubelib2.get_mem(pos)
M(pos):set_string("formspec", formspec(State, pos, mem))
end
local function get_capa(itemstack)
local meta = itemstack:get_meta()
if meta then
return in_range(meta:get_int("capa") * (PWR_CAPA/100), 0, 3000)
end
return 0
end
local function set_capa(pos, oldnode, digger, capa)
local node = ItemStack(oldnode.name)
local meta = node:get_meta()
capa = techage.power.percent(PWR_CAPA, capa)
capa = (math.floor((capa or 0) / 5)) * 5
meta:set_int("capa", capa)
local text = S("TA3 Akku Box").." ("..capa.." %)"
meta:set_string("description", text)
local inv = minetest.get_inventory({type="player", name=digger:get_player_name()})
local left_over = inv:add_item("main", node)
if left_over:get_count() > 0 then
minetest.add_item(pos, node)
end
end
minetest.register_node("techage:ta3_akku", {
description = S("TA3 Akku Box"),
tiles = {
-- up, down, right, left, back, front
"techage_filling_ta3.png^techage_frame_ta3_top.png",
"techage_filling_ta3.png^techage_frame_ta3.png",
"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_hole_electric.png",
"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_source.png",
"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_source.png",
"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_source.png",
},
on_construct = tubelib2.init_mem,
after_place_node = function(pos, placer, itemstack)
-- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!!
local mem = tubelib2.get_mem(pos)
State:node_init(pos, mem, "")
mem.capa = get_capa(itemstack)
on_rightclick(pos)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
local mem = tubelib2.get_mem(pos)
set_capa(pos, oldnode, digger, mem.capa)
end,
on_receive_fields = on_receive_fields,
on_rightclick = on_rightclick,
on_timer = node_timer,
drop = "", -- don't remove, item will be added via 'set_capa'
paramtype2 = "facedir",
groups = {cracky=2, crumbly=2, choppy=2},
on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_wood_defaults(),
})
techage.power.register_node({"techage:ta3_akku"}, {
conn_sides = {"R"},
power_network = Power,
})
techage.register_entry_page("ta3ps", "akku",
S("TA3 Akku Box"),
S("Used to store electrical energy. Charged in about 10 min, provides energy for 10 min.@n"..
"It take and deliver up to 10 units electrical power."),
"techage:ta3_akku")
minetest.register_craft({
output = "techage:ta3_akku",
recipe = {
{"default:tin_ingot", "default:tin_ingot", "default:wood"},
{"default:copper_ingot", "default:copper_ingot", "techage:electric_cableS"},
{"techage:iron_ingot", "techage:iron_ingot", "default:wood"},
},
})

View File

@ -8,7 +8,7 @@
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
TA4 Generator TA4 Dummy Generator for the TES
]]-- ]]--
@ -16,88 +16,29 @@
local M = minetest.get_meta local M = minetest.get_meta
local S = techage.S local S = techage.S
local STANDBY_TICKS = 4
local COUNTDOWN_TICKS = 4
local CYCLE_TIME = 2 local CYCLE_TIME = 2
local PWR_CAPA = 80
local Cable = techage.ElectricCable local Cable = techage.ElectricCable
local power = techage.power local power = techage.power
local function formspec(self, pos, mem) local function swap_node(pos, name)
return "size[8,7]".. local node = minetest.get_node(pos)
default.gui_bg.. if node.name == name then
default.gui_bg_img..
default.gui_slots..
"image[6,0.5;1,2;"..power.formspec_power_bar(PWR_CAPA, mem.provided).."]"..
"image_button[5,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]"..
"button[2,1.5;2,1;update;"..S("Update").."]"..
"list[current_player;main;0,3;8,4;]"..
default.get_hotbar_bg(0, 3)
end
local function can_start(pos, mem, state)
return (mem.firebox_trigger or 0) > 0 -- by means of firebox
end
local function start_node(pos, mem, state)
mem.generating = true -- needed for power distribution
power.generator_start(pos, mem, PWR_CAPA)
end
local function stop_node(pos, mem, state)
mem.generating = false
power.generator_stop(pos, mem)
mem.provided = 0
end
local State = techage.NodeStates:new({
node_name_passive = "techage:generator",
node_name_active = "techage:generator_on",
cycle_time = CYCLE_TIME,
standby_ticks = STANDBY_TICKS,
formspec_func = formspec,
infotext_name = S("TA3 Generator"),
can_start = can_start,
start_node = start_node,
stop_node = stop_node,
})
local function node_timer(pos, elapsed)
local mem = tubelib2.get_mem(pos)
if mem.generating then
mem.firebox_trigger = (mem.firebox_trigger or 0) - 1
if mem.firebox_trigger <= 0 then
State:nopower(pos, mem)
mem.generating = false
power.generator_stop(pos, mem)
mem.provided = 0
else
mem.provided = power.generator_alive(pos, mem)
State:keep_running(pos, mem, COUNTDOWN_TICKS)
end
end
return State:is_active(mem)
end
local function on_receive_fields(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then
return return
end end
local mem = tubelib2.get_mem(pos) node.name = name
State:state_button_event(pos, mem, fields) minetest.swap_node(pos, node)
if fields.update then
M(pos):set_string("formspec", formspec(State, pos, mem))
end
end end
local function on_rightclick(pos) -- to detect the missing turbine
local function node_timer(pos, elapsed)
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
M(pos):set_string("formspec", formspec(State, pos, mem)) mem.remote_trigger = (mem.remote_trigger or 0) - 1
if mem.generating then if mem.remote_trigger <= 0 then
minetest.get_node_timer(pos):start(CYCLE_TIME) swap_node(pos, "techage:ta4_generator")
mem.running = false
end end
return true
end end
minetest.register_node("techage:ta4_generator", { minetest.register_node("techage:ta4_generator", {
@ -112,20 +53,13 @@ minetest.register_node("techage:ta4_generator", {
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png^[transformFX]", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png^[transformFX]",
}, },
on_construct = tubelib2.init_mem,
after_place_node = function(pos, placer) after_place_node = function(pos, placer)
-- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!! local mem = tubelib2.init_mem(pos)
local mem = tubelib2.get_mem(pos) mem.running = false
local number = techage.add_node(pos, "techage:generator") mem.remote_trigger = 0
State:node_init(pos, mem, number)
on_rightclick(pos)
end, end,
on_receive_fields = on_receive_fields,
on_rightclick = on_rightclick,
on_timer = node_timer, on_timer = node_timer,
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {cracky=2, crumbly=2, choppy=2}, groups = {cracky=2, crumbly=2, choppy=2},
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
@ -163,10 +97,11 @@ minetest.register_node("techage:ta4_generator_on", {
}, },
}, },
on_receive_fields = on_receive_fields, on_rightclick = function(pos)
on_rightclick = on_rightclick, minetest.get_node_timer(pos):start(CYCLE_TIME)
on_timer = node_timer, end,
on_timer = node_timer,
drop = "", drop = "",
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory=1},
@ -179,50 +114,46 @@ minetest.register_node("techage:ta4_generator_on", {
minetest.register_craft({ minetest.register_craft({
output = "techage:ta4_generator", output = "techage:ta4_generator",
recipe = { recipe = {
{"basic_materials:steel_bar", "dye:green", "default:wood"}, {"", "dye:blue", ""},
{"", "basic_materials:gear_steel", "techage:electric_cableS"}, {"", "techage:generator", ""},
{"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, {"", "techage:ta4_wlanchip", ""},
}, },
}) })
-- need a dummy power connection
techage.power.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, { techage.power.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, {
conn_sides = {"R"}, conn_sides = {"R"},
power_network = Cable, power_network = Cable,
}) })
-- for logical communication -- controlled by the turbine
techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, { techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, {
on_transfer = function(pos, in_dir, topic, payload) on_transfer = function(pos, in_dir, topic, payload)
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
if topic == "power_level" then if topic == "power" then
local mem = tubelib2.get_mem(pos) mem.remote_trigger = 2
mem.power_level = payload return techage.power.power_available(pos, mem, 0)
elseif topic == "start" then
mem.remote_trigger = 2
swap_node(pos, "techage:ta4_generator_on")
mem.running = true
minetest.get_node_timer(pos):start(CYCLE_TIME)
return true
elseif topic == "stop" then
swap_node(pos, "techage:ta4_generator")
mem.running = false
mem.remote_trigger = 0
minetest.get_node_timer(pos):stop()
return true
elseif topic == "trigger" then elseif topic == "trigger" then
mem.firebox_trigger = 3 mem.remote_trigger = 2
mem.power_level = payload return true
if mem.generating then
return math.max((mem.provided or PWR_CAPA) / PWR_CAPA, 0.02)
else
return 0
end end
end
end,
on_recv_message = function(pos, src, topic, payload)
local mem = tubelib2.get_mem(pos)
if topic == "load" then
return techage.power.percent(PWR_CAPA, mem.provided)
else
return State:on_receive_message(pos, topic, payload)
end
end,
on_node_load = function(pos)
State:on_node_load(pos)
end, end,
}) })
techage.register_entry_page("ta4es", "ta4_generator", techage.register_entry_page("ta4es", "ta4_generator",
S("TA3 Generator"), S("TA4 Generator"),
S("Part of the Power Station. Has to be placed side by side with the TA3 Turbine. ".. S("Part of TA4 Energy Systems. Has to be placed side by side with the TA4 Turbine. "..
"Connect the Generator with your TA3 machines by means of Electric Cables and Junction Boxes@n".. "Connect the Generator with your power network@n"),
"(see TA3 Power Station)"), "techage:ta4_generator")
"techage:generator")

View File

@ -13,208 +13,189 @@
]]-- ]]--
-- for lazy programmers -- for lazy programmers
local P = minetest.string_to_pos local S2P = minetest.string_to_pos
local P2S = minetest.pos_to_string
local M = minetest.get_meta local M = minetest.get_meta
local S = techage.S local S = techage.S
local CYCLE_TIME = 4 local CYCLE_TIME = 2
local STANDBY_TICKS = 2 local PWR_PERF = 60
local COUNTDOWN_TICKS = 2 local GRVL_CAPA = 1333
local HEAT_STEP = 10 local PWR_CAPA = {
local WATER_CONSUMPTION = 0.5 [3] = GRVL_CAPA * 3 * 3 * 3, -- ~0.5 days
local MAX_WATER = 10 [4] = GRVL_CAPA * 5 * 5 * 5, -- ~2.5 days
[5] = GRVL_CAPA * 7 * 7 * 7, -- ~6 days
local Pipe = techage.BiogasPipe
local Water = {
["bucket:bucket_river_water"] = true,
["bucket:bucket_water"] = true,
["bucket:bucket_empty"] = true,
} }
local Cable = techage.ElectricCable
local Pipe = techage.BiogasPipe
local power = techage.power
local function in_range(val, min, max)
if val < min then return min end
if val > max then return max end
return val
end
-- commands for 'techage:heatexchanger1'
local function turbine_cmnd(pos, cmnd)
return techage.transfer(
pos,
"R", -- outdir
cmnd, -- topic
nil, -- payload
Pipe, -- Pipe
{"techage:ta4_turbine", "techage:ta4_turbine_on"})
end
local function heatexchanger3_cmnd(pos, cmnd)
return techage.transfer(
{x = pos.x, y = pos.y + 1, z = pos.z},
"U", -- outdir
cmnd, -- topic
nil, -- payload
nil, -- Pipe
{"techage:heatexchanger3"})
end
local function inlet_cmnd(pos, cmnd, payload)
return techage.transfer(
pos,
"L", -- outdir
cmnd, -- topic
payload, -- payload
Pipe, -- Pipe
{"techage:ta4_pipe_inlet"})
end
local function play_sound(pos)
local mem = tubelib2.get_mem(pos)
if mem.running then
mem.handle = minetest.sound_play("techage_booster", {
pos = pos,
gain = 0.5,
max_hear_distance = 10})
end
end
local function stop_sound(pos)
local mem = tubelib2.get_mem(pos)
if mem.running and mem.handle then
minetest.sound_stop(mem.handle)
mem.handle = nil
end
end
local function swap_node(pos, name)
local node = minetest.get_node(pos)
if node.name == name then
return
end
node.name = name
minetest.swap_node(pos, node)
end
local function charging(pos, mem, is_charging)
if mem.capa >= mem.capa_max then
return
end
if is_charging ~= mem.was_charging then
mem.was_charging = is_charging
if is_charging then
turbine_cmnd(pos, "stop")
play_sound(pos)
else
turbine_cmnd(pos, "start")
stop_sound(pos)
end
elseif is_charging then
play_sound(pos)
end
end
local function glowing(pos, mem, should_glow)
print("glowing", P2S(mem.win_pos), should_glow)
if mem.win_pos then
if should_glow then
swap_node(mem.win_pos, "techage:glow_gravel")
else
swap_node(mem.win_pos, "default:gravel")
end
end
end
local function formspec(self, pos, mem) local function formspec(self, pos, mem)
local temp = mem.temperature or 20 return "size[5,3]"..
local ratio = mem.power_ratio or 0
return "size[8,7]"..
default.gui_bg.. default.gui_bg..
default.gui_bg_img.. default.gui_bg_img..
default.gui_slots.. default.gui_slots..
"image_button[0,0.2;1,1;techage_form_inventory.png;storage;;true;false;]".. "image[0,0.5;1,2;"..techage.power.formspec_power_bar(mem.capa_max, mem.capa).."]"..
"list[context;water;1,0.2;1,1;]".. "label[0.2,2.5;Load]"..
"image_button[0,1.6;1,1;techage_form_input.png;input;;true;false;]".. "button[1.1,1;1.8,1;update;"..S("Update").."]"..
"list[context;input;1,1.6;1,1;]".. "image_button[3,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]"..
"image[1,1.6;1,1;bucket_water.png]".. "image[4,0.5;1,2;"..techage.power.formspec_load_bar(-(mem.delivered or 0), PWR_PERF).."]"..
"image[1,1.6;1,1;techage_form_mask.png]".. "label[4.2,2.5;Flow]"
"image[2,0.5;1,2;techage_form_temp_bg.png^[lowpart:"..
temp..":techage_form_temp_fg.png]"..
"image[7,0.5;1,2;"..techage.power.formspec_power_bar(1, ratio).."]"..
"image_button[6,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]"..
"button[3,1.5;2,1;update;"..S("Update").."]"..
"list[current_player;main;0,3;8,4;]"..
"listring[current_name;water]"..
"listring[current_player;main]"..
default.get_hotbar_bg(0, 3)
end end
local function can_start(pos, mem, state) local function can_start(pos, mem, state)
return mem.temperature and mem.temperature > 80 print("can_start")
if turbine_cmnd(pos, "power") then
local radius = inlet_cmnd(pos, "radius")
print("radius = "..radius)
if radius then
mem.capa_max = PWR_CAPA[tonumber(radius)] or 0
local owner = M(pos):get_string("owner") or ""
return inlet_cmnd(pos, "volume", owner)
end
end
return false
end end
local function start_node(pos, mem, state) local function start_node(pos, mem, state)
print("start_node", P2S(pos))
mem.running = true mem.running = true
mem.power_ratio = 0 mem.delivered = 0
mem.was_charging = true
play_sound(pos)
mem.win_pos = inlet_cmnd(pos, "window")
power.secondary_start(pos, mem, PWR_PERF, PWR_PERF)
end end
local function stop_node(pos, mem, state) local function stop_node(pos, mem, state)
mem.running = false mem.running = false
mem.power_ratio = 0 mem.delivered = 0
end turbine_cmnd(pos, "stop")
power.secondary_stop(pos, mem)
-- check the positions above
local function no_space(pos)
local node1 = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z})
local node2 = minetest.get_node({x=pos.x, y=pos.y+2, z=pos.z})
return node1.name ~= "air" or node2.name ~= "air"
end end
local State = techage.NodeStates:new({ local State = techage.NodeStates:new({
node_name_passive = "techage:boiler2", node_name_passive = "techage:heatexchanger1",
cycle_time = CYCLE_TIME, cycle_time = CYCLE_TIME,
standby_ticks = STANDBY_TICKS, standby_ticks = 0,
has_item_meter = false,
formspec_func = formspec,
can_start = can_start, can_start = can_start,
start_node = start_node, start_node = start_node,
stop_node = stop_node, stop_node = stop_node,
}) })
local function get_water(pos)
local inv = M(pos):get_inventory()
local items = inv:get_stack("water", 1)
if items:get_count() > 0 then
local taken = items:take_item(1)
inv:set_stack("water", 1, items)
return true
end
return false
end
local function water_temperature(pos, mem)
mem.temperature = mem.temperature or 20
if mem.fire_trigger then
mem.temperature = math.min(mem.temperature + HEAT_STEP, 100)
else
mem.temperature = math.max(mem.temperature - HEAT_STEP, 20)
end
mem.fire_trigger = false
if mem.water_level == 0 then
if get_water(pos) then
mem.water_level = 100
else
mem.temperature = 20
end
end
return mem.temperature
end
local function steaming(pos, mem, temp)
local wc = WATER_CONSUMPTION * (mem.power_ratio or 1)
mem.water_level = math.max((mem.water_level or 0) - wc, 0)
if temp >= 80 then
if mem.running then
State:keep_running(pos, mem, COUNTDOWN_TICKS)
else
State:fault(pos, mem)
end
else
State:stop(pos, mem)
minetest.get_node_timer(pos):start(CYCLE_TIME)
end
end
local function node_timer(pos, elapsed) local function node_timer(pos, elapsed)
print("node_timer1")
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
local temp = water_temperature(pos, mem) if mem.running and turbine_cmnd(pos, "power") then
if State:is_active(mem) then mem.capa = mem.capa or 0
steaming(pos, mem, temp) mem.capa_max = mem.capa_max or 0
mem.delivered = mem.delivered or 0
mem.delivered = power.secondary_alive(pos, mem, mem.capa, mem.capa_max)
mem.capa = mem.capa - mem.delivered
mem.capa = in_range(mem.capa, 0, mem.capa_max)
glowing(pos, mem, mem.capa > mem.capa_max * 0.8)
charging(pos, mem, mem.delivered < 0)
end end
return mem.temperature > 20 return mem.running
end
local function on_receive_fields(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
local mem = tubelib2.get_mem(pos)
mem.temperature = mem.temperature or 20
State:state_button_event(pos, mem, fields)
if fields.update then
if mem.temperature > 20 then
minetest.get_node_timer(pos):start(CYCLE_TIME)
end
M(pos):set_string("formspec", formspec(State, pos, mem))
end
end
local function on_rightclick(pos)
local mem = tubelib2.get_mem(pos)
M(pos):set_string("formspec", formspec(State, pos, mem))
end end
local function can_dig(pos, player) local function can_dig(pos, player)
local inv = M(pos):get_inventory()
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
return inv:is_empty("input") and not mem.running return not mem.running
end
local function move_to_water(pos)
local inv = M(pos):get_inventory()
local water_stack = inv:get_stack("water", 1)
local input_stack = inv:get_stack("input", 1)
if input_stack:get_name() == "bucket:bucket_empty" then
if input_stack:get_count() == 1 then
if water_stack:get_count() > 0 then
water_stack:set_count(water_stack:get_count() - 1)
input_stack = ItemStack("bucket:bucket_water")
inv:set_stack("water", 1, water_stack)
inv:set_stack("input", 1, input_stack)
end
end
elseif water_stack:get_count() < MAX_WATER then
if water_stack:get_count() == 0 then
water_stack = ItemStack("default:water_source")
else
water_stack:set_count(water_stack:get_count() + 1)
end
input_stack = ItemStack("bucket:bucket_empty")
inv:set_stack("water", 1, water_stack)
inv:set_stack("input", 1, input_stack)
end
end
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then
return 0
end
if listname == "input" and Water[stack:get_name()] then
return stack:get_count()
end
return 0
end
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
if minetest.is_protected(pos, player:get_player_name()) then
return 0
end
if listname == "input" then
return stack:get_count()
end
return 0
end end
local function orientate_node(pos, name) local function orientate_node(pos, name)
@ -242,73 +223,10 @@ minetest.register_node("techage:heatexchanger3", {
"techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png", "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png",
"techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png", "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png",
}, },
after_place_node = function(pos, placer) after_place_node = function(pos, placer)
return orientate_node(pos, "techage:heatexchanger2") return orientate_node(pos, "techage:heatexchanger2")
end, end,
paramtype2 = "facedir",
groups = {crumbly = 2, cracky = 2, snappy = 2},
--on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
-- Middle
minetest.register_node("techage:heatexchanger2", {
description = S("TA4 Heat Exchanger 2"),
tiles = {
-- up, down, right, left, back, front
"techage_hole_ta4.png",
"techage_hole_ta4.png",
"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_turb.png",
"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_core.png",
"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsM.png",
"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsM.png",
},
after_place_node = function(pos, placer)
return orientate_node(pos, "techage:heatexchanger1")
end,
paramtype2 = "facedir",
groups = {crumbly = 2, cracky = 2, snappy = 2},
--on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("techage:heatexchanger1", {
description = S("TA4 Heat Exchanger 1"),
tiles = {
-- up, down, right, left, back, front
"techage_hole_ta4.png",
"techage_filling_ta4.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_biogas.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_biogas.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_ribsB.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_ribsB.png",
},
on_construct = function(pos)
tubelib2.init_mem(pos)
local inv = M(pos):get_inventory()
inv:set_size('water', 1)
inv:set_size('input', 1)
end,
after_place_node = function(pos, placer)
if no_space(pos) then
minetest.remove_node(pos)
return true
end
-- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!!
local mem = tubelib2.get_mem(pos)
State:node_init(pos, mem, "")
local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
if node.name == "techage:boiler1" then
on_rightclick(pos)
end
end,
after_dig_node = function(pos)
end,
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {crumbly = 2, cracky = 2, snappy = 2}, groups = {crumbly = 2, cracky = 2, snappy = 2},
@ -317,99 +235,137 @@ minetest.register_node("techage:heatexchanger1", {
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),
}) })
techage.power.register_node({"techage:heatexchanger1", "techage:heatexchanger3"}, { -- Middle node with the formspec from the bottom node
conn_sides = {"R", "L"}, minetest.register_node("techage:heatexchanger2", {
power_network = Pipe, description = S("TA4 Heat Exchanger 2"),
tiles = {
-- up, down, right, left, back, front
"techage_hole_ta4.png",
"techage_hole_ta4.png",
"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_turb.png",
"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_core.png",
"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png",
"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png",
},
selection_box = {
type = "fixed",
fixed = {-1/2, -1.5/2, -1/2, 1/2, 1/2, 1/2},
},
after_place_node = function(pos, placer)
if orientate_node(pos, "techage:heatexchanger1") then
return true
end
local pos1 = {x = pos.x, y = pos.y - 1, z = pos.z}
local mem = tubelib2.get_mem(pos1)
local own_num = M(pos1):get_string("node_number")
M(pos):set_string("formspec", formspec(State, pos1, mem))
M(pos):set_string("infotext", S("TA4 Heat Exchanger").." "..own_num)
end,
on_rightclick = function(pos)
local pos1 = {x = pos.x, y = pos.y - 1, z = pos.z}
local mem = tubelib2.get_mem(pos1)
M(pos):set_string("formspec", formspec(State, pos1, mem))
end,
on_receive_fields = function(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
local pos1 = {x = pos.x, y = pos.y - 1, z = pos.z}
local mem = tubelib2.get_mem(pos1)
State:state_button_event(pos1, mem, fields)
M(pos):set_string("formspec", formspec(State, pos1, mem))
end,
paramtype2 = "facedir",
groups = {crumbly = 2, cracky = 2, snappy = 2},
on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
-- Base
minetest.register_node("techage:heatexchanger1", {
description = S("TA4 Heat Exchanger 1"),
tiles = {
-- up, down, right, left, back, front
"techage_hole_ta4.png",
"techage_filling_ta4.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_biogas.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_biogas.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png",
},
on_construct = tubelib2.init_mem,
after_place_node = function(pos, placer)
-- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!!
local mem = tubelib2.get_mem(pos)
local meta = M(pos)
local own_num = techage.add_node(pos, "techage:heatexchanger1")
meta:set_string("owner", placer:get_player_name())
State:node_init(pos, mem, own_num)
mem.capa = 0
end,
on_timer = node_timer,
paramtype2 = "facedir",
groups = {crumbly = 2, cracky = 2, snappy = 2},
on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
techage.power.register_node({"techage:heatexchanger1"}, {
conn_sides = {"F", "B"},
power_network = Cable,
})
Cable:add_secondary_node_names({"techage:heatexchanger1", "techage:heatexchanger3"})
-- for logical communication
techage.register_node({"techage:heatexchanger1"}, {
on_recv_message = function(pos, src, topic, payload)
local mem = tubelib2.get_mem(pos)
if topic == "capa" then
return mem.capa or 0
else
return State:on_receive_message(pos, topic, payload)
end
end,
}) })
-- boiler2: Main part, needed as generator minetest.register_craft({
--minetest.register_node("techage:heatexchanger3", { output = "techage:heatexchanger1",
-- description = S("TA4 Heat Exchanger"), recipe = {
-- tiles = {"techage_boiler2.png"}, {"default:tin_ingot", "techage:electric_cableS", "default:steel_ingot"},
-- drawtype = "mesh", {"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"},
-- mesh = "techage_boiler.obj", {"", "techage:baborium_ingot", ""},
-- selection_box = { },
-- type = "fixed", })
-- fixed = {-10/32, -48/32, -10/32, 10/32, 16/32, 10/32},
-- },
-- can_dig = can_dig, minetest.register_craft({
-- on_timer = node_timer, output = "techage:heatexchanger2",
-- allow_metadata_inventory_put = allow_metadata_inventory_put, recipe = {
-- allow_metadata_inventory_take = allow_metadata_inventory_take, {"default:tin_ingot", "", "default:steel_ingot"},
-- allow_metadata_inventory_move = function(pos) return 0 end, {"", "techage:ta4_wlanchip", ""},
-- on_receive_fields = on_receive_fields, {"", "techage:baborium_ingot", ""},
-- on_rightclick = on_rightclick, },
})
-- on_construct = function(pos) minetest.register_craft({
-- tubelib2.init_mem(pos) output = "techage:heatexchanger3",
-- local inv = M(pos):get_inventory() recipe = {
-- inv:set_size('water', 1) {"default:tin_ingot", "dye:blue", "default:steel_ingot"},
-- inv:set_size('input', 1) {"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"},
-- end, {"", "techage:baborium_ingot", ""},
},
-- after_place_node = function(pos, placer) })
-- -- secondary 'after_place_node', called by power. Don't use tubelib2.init_mem(pos)!!!
-- local mem = tubelib2.get_mem(pos)
-- State:node_init(pos, mem, "")
-- local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
-- if node.name == "techage:boiler1" then
-- on_rightclick(pos)
-- end
-- end,
-- on_metadata_inventory_put = function(pos)
-- minetest.after(0.5, move_to_water, pos)
-- end,
-- groups = {cracky=1},
-- on_rotate = screwdriver.disallow,
-- is_ground_content = false,
-- sounds = default.node_sound_metal_defaults(),
--})
--techage.power.register_node({"techage:boiler2"}, {
-- conn_sides = {"U"},
-- power_network = Pipe,
--})
--techage.register_node({"techage:boiler2"}, {
-- on_transfer = function(pos, in_dir, topic, payload)
-- if topic == "trigger" then
-- local mem = tubelib2.get_mem(pos)
-- mem.fire_trigger = true
-- if not minetest.get_node_timer(pos):is_started() then
-- minetest.get_node_timer(pos):start(CYCLE_TIME)
-- end
-- if mem.running then
-- mem.power_ratio = techage.transfer(pos, 6, "trigger", nil, Pipe, {
-- "techage:cylinder", "techage:cylinder_on"}) or 0
-- return mem.power_ratio
-- else
-- return 0
-- end
-- end
-- end
--})
--minetest.register_craft({
-- output = "techage:boiler1",
-- recipe = {
-- {"techage:iron_ingot", "", "techage:iron_ingot"},
-- {"default:bronze_ingot", "", "default:bronze_ingot"},
-- {"techage:iron_ingot", "default:bronze_ingot", "techage:iron_ingot"},
-- },
--})
--minetest.register_craft({
-- output = "techage:boiler2",
-- recipe = {
-- {"techage:iron_ingot", "techage:steam_pipeS", "techage:iron_ingot"},
-- {"default:bronze_ingot", "", "default:bronze_ingot"},
-- {"techage:iron_ingot", "", "techage:iron_ingot"},
-- },
--})
--techage.register_entry_page("ta2", "boiler1", --techage.register_entry_page("ta2", "boiler1",
-- S("TA2 Boiler Base"), -- S("TA2 Boiler Base"),

View File

@ -22,27 +22,23 @@ local PN090 = "techage_gaspipe_knee.png^[transformR90"
local PN180 = "techage_gaspipe_knee.png^[transformR180" local PN180 = "techage_gaspipe_knee.png^[transformR180"
local PN270 = "techage_gaspipe_knee.png^[transformR270" local PN270 = "techage_gaspipe_knee.png^[transformR270"
local HEXR1 = "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png" local HEXR1 = "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png"
local HEXR2 = "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsM.png" local HEXR2 = "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png"
local HEXR3 = "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_ribsB.png" local HEXR3 = "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png"
local TURBN = "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png" local TURBN = "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png"
local GENER = "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png^[transformFX]" local GENER = "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png^[transformFX]"
local GRAVL = "default_gravel.png" local GRAVL = "default_gravel.png"
local FAN = "techage_filling_ta4.png^techage_appl_compressor.png^techage_frame_ta4.png" local INLET = "basic_materials_concrete_block.png^techage_gaspipe.png^[transformR90"
local COREE = "techage_tes_core_elem.png" local GLASS = "default_obsidian_glass.png"
local INLET = "techage_tes_inlet_help.png"
local CPI00 = "basic_materials_concrete_block.png^techage_gaspipe.png"
local CPI90 = "basic_materials_concrete_block.png^techage_gaspipe.png^[transformR90"
local Images = { local Images = {
{false, false, false, false, false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false, false, false, false},
{CONCR, CONCR, CONCR, CONCR, CONCR, CONCR, CONCR, false, false, false, false, false}, {false, false, false, PN000, PIPEH, PIPEH, PN270, false, false, false, false},
{CONCR, GRAVL, GRAVL, GRAVL, GRAVL, GRAVL, CONCR, false, false, false, false, false}, {false, CONCR, CONCR, INLET, CONCR, CONCR, PIPEV, false, false, false, false},
{CONCR, GRAVL, GRAVL, PN000, PIPEH, PIPEH, CPI00, PIPEH, HEXR1, PIPEH, PN270, false}, {false, CONCR, GRAVL, GRAVL, GRAVL, CONCR, PN090, HEXR1, PIPEH, PN270, false},
{CONCR, GRAVL, GRAVL, COREE, GRAVL, GRAVL, CONCR, false, HEXR2, false, PIPEV, false}, {false, GLASS, GRAVL, GRAVL, GRAVL, CONCR, false, HEXR2, false, PIPEV, false},
{CONCR, GRAVL, GRAVL, PN090, PIPEH, PIPEH, CPI00, PIPEH, HEXR3, PIPEH, TURBN, GENER}, {false, CONCR, GRAVL, GRAVL, GRAVL, CONCR, PN000, HEXR3, PIPEH, TURBN, GENER},
{CONCR, GRAVL, GRAVL, INLET, GRAVL, GRAVL, CONCR, false, false, false, false, false}, {false, CONCR, CONCR, INLET, CONCR, CONCR, PIPEV, false, false, false, false},
{CONCR, CONCR, CONCR, CPI90, CONCR, CONCR, CONCR, false, PN000, FAN, false, false}, {false, false, false, PN090, PIPEH, PIPEH, PN180, false, false, false, false},
{false, false, false, PN090, PIPEH, PIPEH, PIPEH, PIPEH, PN180, false, false, false},
} }
techage.register_category_page("ta4es", techage.register_category_page("ta4es",

View File

@ -106,6 +106,25 @@ local function check_volume(pos, in_dir, owner)
return true return true
end end
-- provide position behind the obsidian_glass
local function check_window(pos, in_dir)
local radius = get_radius(pos, in_dir)
if radius then
local dir = tubelib2.Dir6dToVector[in_dir]
local cpos = vector.add(pos, vector.multiply(dir, radius))
-- calculate size
local pos1 = {x = cpos.x - radius, y = cpos.y - radius, z = cpos.z - radius}
local pos2 = {x = cpos.x + radius, y = cpos.y + radius, z = cpos.z + radius}
local poses,_ = minetest.find_nodes_in_area(pos1, pos2, {"default:obsidian_glass"})
if #poses == 1 then
local ndir = vector.direction(poses[1], cpos)
ndir = vector.normalize(ndir)
local npos = vector.add(poses[1], ndir)
return npos
end
end
end
-- for logical communication -- for logical communication
techage.register_node({"techage:ta4_pipe_inlet"}, { techage.register_node({"techage:ta4_pipe_inlet"}, {
on_transfer = function(pos, in_dir, topic, payload) on_transfer = function(pos, in_dir, topic, payload)
@ -113,6 +132,8 @@ techage.register_node({"techage:ta4_pipe_inlet"}, {
return get_radius(pos, in_dir) return get_radius(pos, in_dir)
elseif topic == "volume" then elseif topic == "volume" then
return check_volume(pos, in_dir, payload) return check_volume(pos, in_dir, payload)
elseif topic == "window" then
return check_window(pos, in_dir)
end end
return false return false
end end

View File

@ -8,7 +8,7 @@
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
TA4 Heat Exchanger TA4 Nodes
]]-- ]]--
@ -17,10 +17,8 @@ local P = minetest.string_to_pos
local M = minetest.get_meta local M = minetest.get_meta
local S = techage.S local S = techage.S
local Pipe = techage.BiogasPipe
minetest.register_node("techage:glow_gravel", { minetest.register_node("techage:glow_gravel", {
description = "Techage Gravel", description = S("Techage Gravel"),
tiles = {{ tiles = {{
name = "techage_gravel4.png", name = "techage_gravel4.png",
animation = { animation = {
@ -37,16 +35,3 @@ minetest.register_node("techage:glow_gravel", {
drop = "", drop = "",
}) })
minetest.register_node("techage:ta4_tes_coreelem", {
description = S("TA4 TES Core Element"),
tiles = {
-- up, down, right, left, back, front
"techage_tes_core_elem_top.png",
"techage_tes_core_elem_top.png",
"techage_tes_core_elem.png",
},
groups = {crumbly = 2, cracky = 2, snappy = 2},
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})

View File

@ -16,12 +16,9 @@
local M = minetest.get_meta local M = minetest.get_meta
local S = techage.S local S = techage.S
local Pipe = techage.SteamPipe local CYCLE_TIME = 2
local function transfer_generator(pos, topic, payload) local Pipe = techage.BiogasPipe
return techage.transfer(pos, "R", topic, payload, nil,
{"techage:ta4_generator", "techage:ta4_generator_on"})
end
local function swap_node(pos, name) local function swap_node(pos, name)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
@ -37,9 +34,8 @@ local function play_sound(pos)
if mem.running then if mem.running then
mem.handle = minetest.sound_play("techage_turbine", { mem.handle = minetest.sound_play("techage_turbine", {
pos = pos, pos = pos,
gain = 1, gain = 0.5,
max_hear_distance = 15}) max_hear_distance = 10})
minetest.after(2, play_sound, pos)
end end
end end
@ -51,27 +47,48 @@ local function stop_sound(pos)
end end
end end
-- called with any pipe change local function generator_cmnd(pos, cmnd)
local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) return techage.transfer(
local mem = tubelib2.get_mem(pos) pos,
swap_node(pos, "techage:ta4_turbine") "R", -- outdir
mem.running = false cmnd, -- topic
stop_sound(pos) nil, -- payload
nil, -- network
{"techage:ta4_generator", "techage:ta4_generator_on"})
end end
-- to detect the missing "steam pressure"
local function node_timer(pos, elapsed)
local mem = tubelib2.get_mem(pos)
mem.remote_trigger = (mem.remote_trigger or 0) - 1
if mem.remote_trigger <= 0 then
swap_node(pos, "techage:ta4_turbine")
stop_sound(pos)
mem.running = false
end
play_sound(pos)
return true
end
minetest.register_node("techage:ta4_turbine", { minetest.register_node("techage:ta4_turbine", {
description = S("TA4 Turbine"), description = S("TA4 Turbine"),
tiles = { tiles = {
-- up, down, right, left, back, front -- up, down, right, left, back, front
"techage_filling_ta4.png^techage_frame_ta4_top.png^techage_steam_hole.png", "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_hole_biogas.png",
"techage_filling_ta4.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_steam_hole.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_biogas.png",
"techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png",
}, },
on_construct = tubelib2.init_mem, after_place_node = function(pos, placer)
local mem = tubelib2.init_mem(pos)
mem.running = false
mem.remote_trigger = 0
end,
on_timer = node_timer,
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {cracky=2, crumbly=2, choppy=2}, groups = {cracky=2, crumbly=2, choppy=2},
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
@ -82,10 +99,10 @@ minetest.register_node("techage:ta4_turbine", {
minetest.register_node("techage:ta4_turbine_on", { minetest.register_node("techage:ta4_turbine_on", {
tiles = { tiles = {
-- up, down, right, left, back, front -- up, down, right, left, back, front
"techage_filling_ta4.png^techage_frame_ta4_top.png^techage_steam_hole.png", "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_hole_biogas.png",
"techage_filling_ta4.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_steam_hole.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_biogas.png",
{ {
image = "techage_filling4_ta4.png^techage_appl_turbine4.png^techage_frame4_ta4.png", image = "techage_filling4_ta4.png^techage_appl_turbine4.png^techage_frame4_ta4.png",
backface_culling = false, backface_culling = false,
@ -107,8 +124,13 @@ minetest.register_node("techage:ta4_turbine_on", {
}, },
}, },
}, },
after_tube_update = after_tube_update,
on_rightclick = function(pos)
minetest.get_node_timer(pos):start(CYCLE_TIME)
end,
on_timer = node_timer,
drop = "",
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory=1},
diggable = false, diggable = false,
@ -127,30 +149,26 @@ techage.power.register_node({"techage:ta4_turbine", "techage:ta4_turbine_on"}, {
techage.register_node({"techage:ta4_turbine", "techage:ta4_turbine_on"}, { techage.register_node({"techage:ta4_turbine", "techage:ta4_turbine_on"}, {
on_transfer = function(pos, in_dir, topic, payload) on_transfer = function(pos, in_dir, topic, payload)
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
if topic == "trigger" then if topic == "power" then
return transfer_generator(pos, topic, payload) mem.remote_trigger = 2
return generator_cmnd(pos, topic)
elseif topic == "start" then elseif topic == "start" then
if transfer_cooler(pos, topic, payload) then mem.remote_trigger = 2
swap_node(pos, "techage:ta4_turbine_on") swap_node(pos, "techage:ta4_turbine_on")
mem.running = true mem.running = true
minetest.get_node_timer(pos):start(CYCLE_TIME)
play_sound(pos) play_sound(pos)
return true return generator_cmnd(pos, topic)
end
return false
elseif topic == "running" then
if not transfer_cooler(pos, topic, payload) then
swap_node(pos, "techage:ta4_turbine")
mem.running = false
stop_sound(pos)
return false
end
return true
elseif topic == "stop" then elseif topic == "stop" then
transfer_cooler(pos, topic, payload)
swap_node(pos, "techage:ta4_turbine") swap_node(pos, "techage:ta4_turbine")
mem.running = false mem.running = false
mem.remote_trigger = 0
minetest.get_node_timer(pos):stop()
stop_sound(pos) stop_sound(pos)
return true return generator_cmnd(pos, topic)
elseif topic == "trigger" then
mem.remote_trigger = 2
return generator_cmnd(pos, topic)
end end
end end
}) })
@ -158,24 +176,13 @@ techage.register_node({"techage:ta4_turbine", "techage:ta4_turbine_on"}, {
minetest.register_craft({ minetest.register_craft({
output = "techage:ta4_turbine", output = "techage:ta4_turbine",
recipe = { recipe = {
{"basic_materials:steel_bar", "techage:steam_pipeS", "default:wood"}, {"", "dye:blue", ""},
{"techage:steam_pipeS", "basic_materials:gear_steel", ""}, {"", "techage:turbine", ""},
{"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, {"", "techage:ta4_wlanchip", ""},
}, },
}) })
techage.register_entry_page("ta4es", "turbine", techage.register_entry_page("ta4es", "turbine",
S("TA3 Turbine"), S("TA4 Turbine"),
S("Part of the Power Station. Has to be placed side by side with the TA3 Generator.@n".. S("Part of TA4 Energy Systems. Has to be placed side by side with the TA4 Generator.@n"),
"(see TA3 Power Station)"),
"techage:ta4_turbine") "techage:ta4_turbine")
minetest.register_lbm({
label = "[techage] Turbine sound",
name = "techage:power_station",
nodenames = {"techage:ta4_turbine_on"},
run_at_every_load = true,
action = function(pos, node)
play_sound(pos)
end
})

View File

@ -194,11 +194,11 @@ else
dofile(MP.."/wind_turbine/signallamp.lua") dofile(MP.."/wind_turbine/signallamp.lua")
-- TA4 Energy Storage -- TA4 Energy Storage
-- dofile(MP.."/energy_storage/heatexchanger.lua") dofile(MP.."/energy_storage/heatexchanger.lua")
-- dofile(MP.."/energy_storage/generator.lua") dofile(MP.."/energy_storage/generator.lua")
-- dofile(MP.."/energy_storage/turbine.lua") dofile(MP.."/energy_storage/turbine.lua")
-- dofile(MP.."/energy_storage/inlet.lua") dofile(MP.."/energy_storage/inlet.lua")
-- dofile(MP.."/energy_storage/nodes.lua") dofile(MP.."/energy_storage/nodes.lua")
-- dofile(MP.."/energy_storage/help.lua") dofile(MP.."/energy_storage/help.lua")
end end

View File

@ -67,7 +67,7 @@ function techage.register_junction(name, size, boxes, network, node, index)
ndef.paramtype = "light" ndef.paramtype = "light"
ndef.sunlight_propagates = true ndef.sunlight_propagates = true
ndef.is_ground_content = false ndef.is_ground_content = false
ndef.drop = name.."0" ndef.drop = name..(index or "0")
minetest.register_node(name..idx, ndef) minetest.register_node(name..idx, ndef)
-- Register in addition for power distribution -- Register in addition for power distribution
techage.power.register_node({name..idx}, {power_network = network}) techage.power.register_node({name..idx}, {power_network = network})

View File

@ -508,7 +508,8 @@ end
-- Power terminal function -- Power terminal function
function techage.power.power_accounting(pos, mem) function techage.power.power_accounting(pos, mem)
if mem.pwr_master_pos then if mem.pwr_master_pos and (mem.pwr_power_provided_cnt or 0) > 0 then
mem.pwr_power_provided_cnt = (mem.pwr_power_provided_cnt or 0) - 1
mem = tubelib2.get_mem(mem.pwr_master_pos) mem = tubelib2.get_mem(mem.pwr_master_pos)
return { return {
prim_available = mem.mst_available1 or 0, prim_available = mem.mst_available1 or 0,

View File

@ -163,8 +163,7 @@ minetest.register_node("techage:power_lineA", {
}) })
minetest.register_node("techage:power_pole", { minetest.register_node("techage:power_pole", {
description = S("TA Power Pole Top 4"), description = S("TA Power Pole Top (for up to 6 connections)"),
--tiles = {"techage_power_pole.png"},
tiles = { tiles = {
"default_wood.png^techage_power_pole_top.png", "default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole_top.png", "default_wood.png^techage_power_pole_top.png",
@ -191,7 +190,43 @@ minetest.register_node("techage:power_pole", {
minetest.remove_node(pos) minetest.remove_node(pos)
return true return true
end end
local node = minetest.get_node(pos)
node.name = "techage:power_pole_conn"
minetest.swap_node(pos, node)
end, end,
on_rotate = screwdriver.disallow, -- important!
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false,
groups = {cracky=2, crumbly=2, choppy=2},
})
minetest.register_node("techage:power_pole_conn", {
description = S("TA Power Pole Top 4 conn"),
tiles = {
"default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole.png"
},
paramtype2 = "facedir", -- important!
drawtype = "nodebox",
node_box = {
type = "connected",
fixed = {{ -4/32, -16/32, -4/32, 4/32, 16/32, 4/32}},
connect_left = {{-16/32, -6/32, -1/32, 1/32, -4/32, 1/32},
{-16/32, -4/32, -2/32, -12/32, 4/32, 2/32}},
connect_right = {{ -1/32, -6/32, -1/32, 16/32, -4/32, 1/32},
{12/32, -4/32, -2/32, 16/32, 4/32, 2/32}},
connect_back = {{-1/32, -6/32, -1/32, 1/32, -4/32, 16/32},
{-2/32, -4/32, 12/32, 2/32, 4/32, 16/32}},
connect_front = {{-1/32, -6/32, -16/32, 1/32, -4/32, 1/32},
{-2/32, -4/32, -16/32, 2/32, 4/32, -12/32}},
},
connects_to = {"techage:power_line", "techage:power_lineS", "techage:power_lineA"},
can_dig = function(pos, digger) can_dig = function(pos, digger)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
if meta:get_string("owner") == digger:get_player_name() then if meta:get_string("owner") == digger:get_player_name() then
@ -203,17 +238,17 @@ minetest.register_node("techage:power_pole", {
return false return false
end, end,
drop = "techage:power_pole",
on_rotate = screwdriver.disallow, -- important! on_rotate = screwdriver.disallow, -- important!
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
groups = {cracky=2, crumbly=2, choppy=2}, groups = {cracky=2, crumbly=2, choppy=2, not_in_creative_inventory = 1},
sounds = default.node_sound_defaults(), sounds = default.node_sound_defaults(),
}) })
minetest.register_node("techage:power_pole2", { minetest.register_node("techage:power_pole2", {
description = S("TA Power Pole Top 2"), description = S("TA Power Pole Top 2 (for landlines)"),
--tiles = {"techage_power_pole.png"},
tiles = { tiles = {
"default_wood.png^techage_power_pole_top.png", "default_wood.png^techage_power_pole_top.png",
"default_wood.png^techage_power_pole_top.png", "default_wood.png^techage_power_pole_top.png",
@ -296,7 +331,7 @@ minetest.register_node("techage:power_pole3", {
sounds = default.node_sound_defaults(), sounds = default.node_sound_defaults(),
}) })
techage.power.register_node({"techage:power_pole"}, { techage.power.register_node({"techage:power_pole", "techage:power_pole_conn"}, {
power_network = Cable, power_network = Cable,
}) })

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 B

After

Width:  |  Height:  |  Size: 222 B

View File

@ -72,9 +72,9 @@ local function read_state(itemstack, user, pointed_thing)
if load and load ~= "" and load ~= "unsupported" then if load and load ~= "" and load ~= "unsupported" then
minetest.chat_send_player(user:get_player_name(), ndef.description.." "..number..": load = "..load.." % ") minetest.chat_send_player(user:get_player_name(), ndef.description.." "..number..": load = "..load.." % ")
end end
local power = techage.send_single("0", number, "power", nil) local capa = techage.send_single("0", number, "capa", nil)
if power and power ~= "" and power ~= "unsupported" then if capa and capa ~= "" and capa ~= "unsupported" then
minetest.chat_send_player(user:get_player_name(), ndef.description.." "..number..": power = "..power.." % ") minetest.chat_send_player(user:get_player_name(), ndef.description.." "..number..": capa = "..capa.." % ")
end end
local owner = M(pos):get_string("owner") or "" local owner = M(pos):get_string("owner") or ""
if owner ~= "" then if owner ~= "" then

View File

@ -235,8 +235,11 @@ techage.power.register_node({"techage:ta4_wind_turbine"}, {
techage.register_node({"techage:ta4_wind_turbine"}, { techage.register_node({"techage:ta4_wind_turbine"}, {
on_recv_message = function(pos, src, topic, payload) on_recv_message = function(pos, src, topic, payload)
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
print("on_recv_message", topic)
if topic == "state" then if topic == "state" then
local node = minetest.get_node(pos)
if node.name == "ignore" then -- unloaded node?
return "unloaded"
end
if mem.error then if mem.error then
return "error" return "error"
elseif mem.running and mem.providing then elseif mem.running and mem.providing then