further nodes adapter to new APIs

This commit is contained in:
Joachim Stolberg 2020-02-06 20:51:30 +01:00
parent c0a4e9d3d8
commit a3935db108
23 changed files with 1080 additions and 325 deletions

View File

@ -201,7 +201,7 @@ end
-- if outdirs is given, only this dirs are used -- if outdirs is given, only this dirs are used
local function connection_walk(pos, outdirs, indir, node, tlib2, clbk) local function connection_walk(pos, outdirs, indir, node, tlib2, clbk)
if clbk then clbk(pos, indir, node) end if clbk then clbk(pos, indir, node) end
techage.mark_position("singleplayer", pos, "walk", "", 1) --techage.mark_position("singleplayer", pos, "walk", "", 1)
--print("connection_walk", node.name, outdirs or is_junction(pos, node.name, tlib2.tube_type)) --print("connection_walk", node.name, outdirs or is_junction(pos, node.name, tlib2.tube_type))
if outdirs or is_junction(pos, node.name, tlib2.tube_type) then if outdirs or is_junction(pos, node.name, tlib2.tube_type) then
for _,outdir in pairs(outdirs or get_node_connections(pos, tlib2.tube_type)) do for _,outdir in pairs(outdirs or get_node_connections(pos, tlib2.tube_type)) do

View File

@ -3,7 +3,7 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information

View File

@ -3,7 +3,7 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
@ -14,8 +14,6 @@
local S = techage.S local S = techage.S
local M = minetest.get_meta local M = minetest.get_meta
local Cable = techage.ElectricCable
local power = techage.power
local Pipe = techage.LiquidPipe local Pipe = techage.LiquidPipe
local networks = techage.networks local networks = techage.networks
local liquid = techage.liquid local liquid = techage.liquid
@ -67,7 +65,7 @@ minetest.register_node("techage:ta4_reactor_fillerpipe", {
networks = { networks = {
pipe2 = { pipe2 = {
sides = {U=1}, -- Pipe connection sides sides = {U = 1}, -- Pipe connection sides
ntype = "tank", ntype = "tank",
}, },
}, },

View File

@ -95,7 +95,7 @@ local function on_receive_fields(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then if minetest.is_protected(pos, player:get_player_name()) then
return return
end end
local nvm,_ = techage.get_nvm(pos, true) local nvm = techage.get_nvm(pos)
State:state_button_event(pos, nvm, fields) State:state_button_event(pos, nvm, fields)
end end
@ -207,6 +207,7 @@ minetest.register_node("techage:generator_on", {
Cable:add_secondary_node_names({"techage:generator", "techage:generator_on"}) Cable:add_secondary_node_names({"techage:generator", "techage:generator_on"})
-- controlled by the turbine
techage.register_node({"techage:generator", "techage:generator_on"}, { techage.register_node({"techage:generator", "techage:generator_on"}, {
on_transfer = function(pos, in_dir, topic, payload) on_transfer = function(pos, in_dir, topic, payload)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)

View File

@ -3,12 +3,12 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
TA4 Dummy Generator for the TES TA4 TES Generator
]]-- ]]--
@ -16,31 +16,121 @@
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 = 60
local Cable = techage.ElectricCable local Cable = techage.ElectricCable
local power = techage.power local power = techage.power
local networks = techage.networks
local function swap_node(pos, name) local function formspec(self, pos, nvm)
local node = techage.get_node_lvm(pos) return "size[4,4]"..
if node.name == name then "box[0,-0.1;3.8,0.5;#c6e8ff]"..
return "label[1,-0.1;"..minetest.colorize( "#000000", S("Generator")).."]"..
end default.gui_bg..
node.name = name default.gui_bg_img..
minetest.swap_node(pos, node) default.gui_slots..
power.formspec_label_bar(0, 0.8, S("power"), PWR_CAPA, nvm.provided)..
"image_button[2.8,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]"..
"tooltip[2.8,2;1,1;"..self:get_state_tooltip(nvm).."]"
end end
-- to detect the missing turbine local function transfer_turbine(pos, topic, payload)
return techage.transfer(pos, "L", topic, payload, nil,
{"techage:ta4_turbine", "techage:ta4_turbine_on"})
end
local function can_start(pos, nvm, state)
return (nvm.heatexchanger_trigger or 0) > 0 -- by means of heatexchanger
end
local function start_node(pos, nvm, state)
local outdir = M(pos):get_int("outdir")
power.generator_start(pos, Cable, CYCLE_TIME, outdir)
transfer_turbine(pos, "start")
nvm.running = true
end
local function stop_node(pos, nvm, state)
local outdir = M(pos):get_int("outdir")
power.generator_stop(pos, Cable, outdir)
nvm.provided = 0
transfer_turbine(pos, "stop")
nvm.running = false
end
local State = techage.NodeStates:new({
node_name_passive = "techage:ta4_generator",
node_name_active = "techage:ta4_generator_on",
cycle_time = CYCLE_TIME,
standby_ticks = STANDBY_TICKS,
formspec_func = formspec,
infotext_name = S("TA4 Generator"),
can_start = can_start,
start_node = start_node,
stop_node = stop_node,
})
local function node_timer(pos, elapsed) local function node_timer(pos, elapsed)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
nvm.remote_trigger = (nvm.remote_trigger or 0) - 1 nvm.heatexchanger_trigger = (nvm.heatexchanger_trigger or 0) - 1
if nvm.remote_trigger <= 0 then if nvm.heatexchanger_trigger <= 0 then
swap_node(pos, "techage:ta4_generator") State:nopower(pos, nvm)
nvm.running = false stop_node(pos, nvm, State)
transfer_turbine(pos, "stop")
else
local outdir = M(pos):get_int("outdir")
nvm.provided = power.generator_alive(pos, Cable, CYCLE_TIME, outdir)
State:keep_running(pos, nvm, COUNTDOWN_TICKS)
end end
return true if techage.is_activeformspec(pos) then
M(pos):set_string("formspec", formspec(State, pos, nvm))
end
return State:is_active(nvm)
end end
local function on_receive_fields(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
local nvm,_ = techage.get_nvm(pos, true)
State:state_button_event(pos, nvm, fields)
end
local function on_rightclick(pos, node, clicker)
local nvm = techage.get_nvm(pos)
techage.set_activeformspec(pos, clicker)
M(pos):set_string("formspec", formspec(State, pos, nvm))
end
local function after_place_node(pos)
local nvm = techage.get_nvm(pos)
local number = techage.add_node(pos, "techage:ta4_generator")
State:node_init(pos, nvm, number)
M(pos):set_int("outdir", networks.side_to_outdir(pos, "R"))
M(pos):set_string("formspec", formspec(State, pos, nvm))
Cable:after_place_node(pos)
end
local function after_dig_node(pos, oldnode)
Cable:after_dig_node(pos)
techage.del_mem(pos)
end
local function tubelib2_on_update2(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2)
end
local net_def = {
ele1 = {
sides = {R = 1},
ntype = "gen2",
nominal = PWR_CAPA,
},
}
minetest.register_node("techage:ta4_generator", { minetest.register_node("techage:ta4_generator", {
description = S("TA4 Generator"), description = S("TA4 Generator"),
tiles = { tiles = {
@ -52,7 +142,15 @@ minetest.register_node("techage:ta4_generator", {
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png",
"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_receive_fields = on_receive_fields,
on_rightclick = on_rightclick,
on_timer = node_timer, on_timer = node_timer,
after_place_node = after_place_node,
after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2,
networks = net_def,
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,
@ -90,11 +188,14 @@ minetest.register_node("techage:ta4_generator_on", {
}, },
}, },
on_rightclick = function(pos) on_receive_fields = on_receive_fields,
minetest.get_node_timer(pos):start(CYCLE_TIME) on_rightclick = on_rightclick,
end,
on_timer = node_timer, on_timer = node_timer,
after_place_node = after_place_node,
after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2,
networks = net_def,
drop = "", drop = "",
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory=1},
@ -104,6 +205,36 @@ minetest.register_node("techage:ta4_generator_on", {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
Cable:add_secondary_node_names({"techage:ta4_generator", "techage:ta4_generator_on"})
-- controlled by the turbine
techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, {
on_transfer = function(pos, in_dir, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "trigger" then
print("trigger", nvm.provided)
nvm.heatexchanger_trigger = 3
if nvm.running then
return nvm.provided or 0.1
else
return 0
end
end
end,
on_recv_message = function(pos, src, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "load" then
return techage.power.percent(PWR_CAPA, nvm.provided)
else
return State:on_receive_message(pos, topic, payload)
end
end,
on_node_load = function(pos)
M(pos):set_int("outdir", networks.side_to_outdir(pos, "R"))
State:on_node_load(pos)
end,
})
minetest.register_craft({ minetest.register_craft({
output = "techage:ta4_generator", output = "techage:ta4_generator",
recipe = { recipe = {
@ -113,41 +244,4 @@ minetest.register_craft({
}, },
}) })
-- need a dummy power connection
techage.power.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, {
conn_sides = {"R"},
power_network = Cable,
after_place_node = function(pos, placer)
local nvm = techage.get_nvm(pos)
nvm.running = false
nvm.remote_trigger = 0
end,
})
-- controlled by the turbine
techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, {
on_transfer = function(pos, in_dir, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "power" then
nvm.remote_trigger = 2
return techage.power.power_network_available(pos)
elseif topic == "start" then
nvm.remote_trigger = 2
swap_node(pos, "techage:ta4_generator_on")
nvm.running = true
minetest.get_node_timer(pos):start(CYCLE_TIME)
return true
elseif topic == "stop" then
swap_node(pos, "techage:ta4_generator")
nvm.running = false
nvm.remote_trigger = 0
minetest.get_node_timer(pos):stop()
return true
elseif topic == "trigger" then
nvm.remote_trigger = 2
return true
end
end,
})

View File

@ -3,7 +3,7 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information

View File

@ -0,0 +1,274 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
TA4 Heat Exchanger1 (bottom part)
]]--
-- for lazy programmers
local S2P = minetest.string_to_pos
local P2S = minetest.pos_to_string
local M = minetest.get_meta
local S = techage.S
local CYCLE_TIME = 2
local PWR_PERF = 60
local GRVL_CAPA = 700
local PWR_CAPA = {
[3] = GRVL_CAPA * 3 * 3 * 3, -- 18900 Cyc = 630 min = 31.5 Tage bei einem ku, oder 31,5 * 24 kuh = 756 kuh = 12,6 h bei 60 ku
[5] = GRVL_CAPA * 5 * 5 * 5, -- ~2.5 days
[7] = GRVL_CAPA * 7 * 7 * 7, -- ~6 days
}
local Cable = techage.ElectricCable
local Pipe = techage.LiquidPipe
local power = techage.power
local in_range = techage.in_range
local function swap_node(pos, name)
local node = techage.get_node_lvm(pos)
if node.name == name then
return
end
node.name = name
minetest.swap_node(pos, node)
end
local function glowing(pos, nvm, should_glow)
if nvm.win_pos then
if should_glow then
swap_node(nvm.win_pos, "techage:glow_gravel")
else
swap_node(nvm.win_pos, "default:gravel")
end
end
end
local function turbine_cmnd(pos, topic, payload)
return techage.transfer(pos, "R", topic, payload, Pipe,
{"techage:ta4_turbine", "techage:ta4_turbine_on"})
end
local function inlet_cmnd(pos, topic, payload)
return techage.transfer(pos, "L", topic, payload, Pipe,
{"techage:ta4_pipe_inlet"})
end
local function play_sound(pos)
local mem = techage.get_mem(pos)
if not mem.handle or mem.handle == -1 then
mem.handle = minetest.sound_play("techage_booster", {
pos = pos,
gain = 0.2,
max_hear_distance = 10,
loop = true})
if mem.handle == -1 then
minetest.after(1, play_sound, pos)
end
end
local nvm = techage.get_nvm(pos)
nvm.charging = true
end
local function stop_sound(pos)
local mem = techage.get_mem(pos)
if mem.handle then
minetest.sound_stop(mem.handle)
mem.handle = nil
end
local nvm = techage.get_nvm(pos)
nvm.charging = false
end
local function on_power(pos)
play_sound(pos)
end
local function on_nopower(pos)
nvm.needed = 0
stop_sound(pos)
end
local function start_node(pos, nvm)
nvm.running = true
nvm.needed = 0
nvm.win_pos = inlet_cmnd(pos, "window")
power.consumer_start(pos, Cable, CYCLE_TIME)
minetest.get_node_timer(pos):start(CYCLE_TIME)
return true
end
local function stop_node(pos, nvm)
nvm.running = false
nvm.needed = 0
power.consumer_stop(pos, Cable)
minetest.get_node_timer(pos):stop()
stop_sound(pos)
return true
end
local function after_place_node(pos, placer, itemstack)
local nvm = techage.get_nvm(pos)
nvm.capa = 0
M(pos):set_string("owner", placer:get_player_name())
Cable:after_place_node(pos)
Pipe:after_place_node(pos)
end
local function can_dig(pos, player)
if minetest.is_protected(pos, player:get_player_name()) then
return false
end
local nvm = techage.get_nvm(pos)
return not nvm.running
end
local function after_dig_node(pos, oldnode, oldmetadata, digger)
Cable:after_dig_node(pos)
Pipe:after_dig_node(pos)
techage.del_mem(pos)
end
local function tubelib2_on_update2(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2)
end
local function can_start(pos, nvm)
-- the heat exchanger shall be able to start even without
-- having power. Therefore, no "if power.power_available(pos, Cable) then"
local diameter = inlet_cmnd(pos, "diameter")
if diameter then
nvm.capa_max = PWR_CAPA[tonumber(diameter)] or 0
if nvm.capa_max ~= 0 then
local owner = M(pos):get_string("owner") or ""
return inlet_cmnd(pos, "volume", owner)
else
return S("wrong storage diameter")..": "..diameter
end
else
return S("inlet/pipe error")
end
return S("did you check the plan?")
end
local function node_timer(pos, elapsed)
local nvm = techage.get_nvm(pos)
nvm.capa = nvm.capa or 0
local taken = 0
local given = 0
if nvm.capa < (nvm.capa_max * 0.9) then
taken = power.consumer_alive(pos, Cable, CYCLE_TIME)
end
if nvm.capa > 0 then
given = turbine_cmnd(pos, "trigger") or 0
end
if taken > 0 and not nvm.charging then
play_sound(pos)
elseif taken == 0 and nvm.charging then
stop_sound(pos)
end
nvm.needed = taken - given
nvm.capa = in_range(nvm.capa + nvm.needed, 0, nvm.capa_max)
glowing(pos, nvm, nvm.capa > nvm.capa_max * 0.8)
print("node_timer TES "..P2S(pos), nvm.needed, nvm.capa, nvm.capa_max)
return true
end
local net_def = {
ele1 = {
sides = {F = 1, B = 1},
ntype = "con2",
nominal = PWR_PERF,
},
pipe2 = {
sides = {L = 1, R = 1},
ntype = "con1",
},
}
minetest.register_node("techage:heatexchanger1", {
description = S("TA4 Heat Exchanger 1"),
tiles = {
-- up, down, right, left, back, front
"techage_hole_ta4.png^techage_appl_arrow_white.png",
"techage_filling_ta4.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_pipe.png",
"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_pipe.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_timer = node_timer,
after_place_node = after_place_node,
can_dig = can_dig,
after_dig_node = after_dig_node,
--tubelib2_on_update2 = tubelib2_on_update2,
networks = net_def,
paramtype2 = "facedir",
groups = {crumbly = 2, cracky = 2, snappy = 2},
on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
Pipe:add_secondary_node_names({"techage:heatexchanger1"})
Cable:add_secondary_node_names({"techage:heatexchanger1"})
-- command interface
techage.register_node({"techage:heatexchanger1"}, {
on_transfer = function(pos, indir, topic, payload)
print("on_transfer")
local nvm = techage.get_nvm(pos)
-- used by heatexchanger2
if topic == "state" then
return nvm.capa_max, nvm.capa, PWR_PERF, math.max(nvm.needed, 0)
elseif topic == "integrity" then
return inlet_cmnd(pos, "volume", payload)
elseif topic == "state" then
return inlet_cmnd(pos, "volume", payload)
elseif topic == "can_start" then
return can_start(pos, nvm)
elseif topic == "start" then
return start_node(pos, nvm)
elseif topic == "stop" then
return stop_node(pos, nvm)
end
end,
on_recv_message = function(pos, src, topic, payload)
local nvm = techage.get_nvm(pos)
if topic == "load" then
return techage.power.percent(nvm.capa_max, nvm.capa)
elseif topic == "size" then
return (nvm.capa_max or 0) / GRVL_CAPA
else
return "unsupported"
end
end,
on_node_load = function(pos, node)
local nvm = techage.get_nvm(pos)
if nvm.running and nvm.charging then
play_sound(pos)
end
end,
})
minetest.register_craft({
output = "techage:heatexchanger1",
recipe = {
{"default:tin_ingot", "techage:electric_cableS", "default:steel_ingot"},
{"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"},
{"", "techage:baborium_ingot", ""},
},
})

View File

@ -0,0 +1,171 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
TA4 Heat Exchanger2 (middle part)
]]--
-- for lazy programmers
local S2P = minetest.string_to_pos
local P2S = minetest.pos_to_string
local M = minetest.get_meta
local S = techage.S
local power = techage.power
local CYCLE_TIME = 2
local function he1_cmnd(pos, topic, payload)
return techage.transfer({x = pos.x, y = pos.y - 1, z = pos.z},
nil, topic, payload, nil,
{"techage:heatexchanger1"})
end
local function formspec(self, pos, nvm)
local capa_max, capa, needed_max, needed = he1_cmnd(pos, "state")
local arrow = "image[2.5,1.5;1,1;techage_form_arrow_bg.png^[transformR90]"
if needed > 0 then
arrow = "image[2.5,1.5;1,1;techage_form_arrow_fg.png^[transformR90]"
end
return "size[6,4]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
"box[0,-0.1;5.8,0.5;#c6e8ff]"..
"label[2,-0.1;"..minetest.colorize( "#000000", S("Heat Exchanger")).."]"..
power.formspec_label_bar(0, 0.8, S("Thermal"), capa_max, capa, "")..
power.formspec_label_bar(3.5, 0.8, S("Input"), needed_max, needed)..
arrow..
"image_button[2.5,3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]"..
"tooltip[2.5,3;1,1;"..self:get_state_tooltip(nvm).."]"
end
local function can_start(pos, nvm, state)
print("can_start", he1_cmnd(pos, "can_start"))
return he1_cmnd(pos, "can_start") or S("did you check the plan?")
end
local function start_node(pos, nvm, state)
he1_cmnd(pos, "start")
end
local function stop_node(pos, nvm, state)
he1_cmnd(pos, "stop")
end
local function check_TES_integrity(pos, nvm)
nvm.ticks = (nvm.ticks or 0) + 1
if (nvm.ticks % 100) == 0 then -- not to often
return he1_cmnd(pos, "integrity", "singleplayer")
end
return true
end
local State = techage.NodeStates:new({
node_name_passive = "techage:heatexchanger2",
cycle_time = CYCLE_TIME,
infotext_name = S("TA4 Heat Exchanger"),
standby_ticks = 0,
can_start = can_start,
start_node = start_node,
stop_node = stop_node,
formspec_func = formspec,
})
local function node_timer(pos, elapsed)
print("node_timer")
local nvm = techage.get_nvm(pos)
local res = check_TES_integrity(pos, nvm)
if res ~= true then
State:fault(pos, nvm, res)
he1_cmnd(pos, "stop")
end
if techage.is_activeformspec(pos) then
M(pos):set_string("formspec", formspec(State, pos, nvm))
return true
end
return false
end
local function can_dig(pos, player)
if minetest.is_protected(pos, player:get_player_name()) then
return false
end
local nvm = techage.get_nvm(pos)
return not nvm.running
end
local function on_rightclick(pos, node, clicker)
techage.set_activeformspec(pos, clicker)
local nvm = techage.get_nvm(pos)
M(pos):set_string("formspec", formspec(State, pos, nvm))
minetest.get_node_timer(pos):start(CYCLE_TIME)
end
local function after_place_node(pos, placer)
if techage.orientate_node(pos, "techage:heatexchanger1") then
return true
end
local nvm = techage.get_nvm(pos)
local own_num = techage.add_node(pos, "techage:heatexchanger2")
State:node_init(pos, nvm, own_num)
M(pos):set_string("formspec", formspec(State, pos, nvm))
M(pos):set_string("infotext", S("TA4 Heat Exchanger").." "..own_num)
end
local function on_receive_fields(pos, formname, fields, player)
if minetest.is_protected(pos, player:get_player_name()) then
return
end
local nvm = techage.get_nvm(pos)
State:state_button_event(pos, nvm, fields)
M(pos):set_string("formspec", formspec(State, pos, nvm))
end
-- Middle node with the formspec from the bottom node
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_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},
},
on_receive_fields = on_receive_fields,
on_rightclick = on_rightclick,
on_timer = node_timer,
after_place_node = after_place_node,
can_dig = can_dig,
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_craft({
output = "techage:heatexchanger2",
recipe = {
{"default:tin_ingot", "", "default:steel_ingot"},
{"", "techage:ta4_wlanchip", ""},
{"", "techage:baborium_ingot", ""},
},
})

View File

@ -0,0 +1,84 @@
--[[
TechAge
=======
Copyright (C) 2019-2020 Joachim Stolberg
GPL v3
See LICENSE.txt for more information
TA4 Heat Exchanger3 (top part)
]]--
-- for lazy programmers
local M = minetest.get_meta
local S = techage.S
local Pipe = techage.LiquidPipe
local function orientate_node(pos, name)
local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
if node.name == name then
local param2 = node.param2
node = minetest.get_node(pos)
node.param2 = param2
minetest.swap_node(pos, node)
else
minetest.remove_node(pos)
return true
end
end
local function after_place_node(pos)
if orientate_node(pos, "techage:heatexchanger2") then
return true
end
Pipe:after_place_node(pos)
end
local function after_dig_node(pos, oldnode)
Pipe:after_dig_node(pos)
end
minetest.register_node("techage:heatexchanger3", {
description = S("TA4 Heat Exchanger 3"),
tiles = {
-- up, down, right, left, back, front
"techage_filling_ta4.png^techage_frame_ta4_top.png",
"techage_hole_ta4.png",
"techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_hole_pipe.png",
"techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_hole_pipe.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 = after_place_node,
after_dig_node = after_dig_node,
paramtype2 = "facedir",
groups = {crumbly = 2, cracky = 2, snappy = 2},
on_rotate = screwdriver.disallow,
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
Pipe:add_secondary_node_names({"techage:heatexchanger3"})
techage.register_node({"techage:heatexchanger3"}, {
on_transfer = function(pos, in_dir, topic, payload)
return true
end
})
minetest.register_craft({
output = "techage:heatexchanger3",
recipe = {
{"default:tin_ingot", "dye:blue", "default:steel_ingot"},
{"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"},
{"", "techage:baborium_ingot", ""},
},
})
techage.orientate_node = orientate_node

View File

@ -21,6 +21,14 @@ local S = techage.S
local Pipe = techage.LiquidPipe local Pipe = techage.LiquidPipe
local function after_place_node(pos, placer, itemstack)
Pipe:after_place_node(pos)
end
local function after_dig_node(pos, oldnode, oldmetadata, digger)
Pipe:after_dig_node(pos)
end
minetest.register_node("techage:ta4_pipe_inlet", { minetest.register_node("techage:ta4_pipe_inlet", {
description = S("TA4 Pipe Inlet"), description = S("TA4 Pipe Inlet"),
tiles = { tiles = {
@ -33,6 +41,9 @@ minetest.register_node("techage:ta4_pipe_inlet", {
"basic_materials_concrete_block.png^techage_tes_inlet.png", "basic_materials_concrete_block.png^techage_tes_inlet.png",
}, },
after_place_node = after_place_node,
after_dig_node = after_dig_node,
paramtype2 = "facedir", -- important! paramtype2 = "facedir", -- important!
on_rotate = screwdriver.disallow, -- important! on_rotate = screwdriver.disallow, -- important!
groups = {crumbly = 2, cracky = 2, snappy = 2}, groups = {crumbly = 2, cracky = 2, snappy = 2},
@ -40,11 +51,7 @@ minetest.register_node("techage:ta4_pipe_inlet", {
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),
}) })
-- for mechanical pipe connections Pipe:add_secondary_node_names({"techage:ta4_pipe_inlet"})
techage.power.register_node({"techage:ta4_pipe_inlet"}, {
conn_sides = {"F", "B"},
power_network = Pipe,
})
local Numbers = { local Numbers = {
shell = { shell = {
@ -63,6 +70,7 @@ local function chat(owner, text)
if owner ~= nil then if owner ~= nil then
minetest.chat_send_player(owner, string.char(0x1b).."(c@#ff0000)".."[Techage] Error: "..text.."!") minetest.chat_send_player(owner, string.char(0x1b).."(c@#ff0000)".."[Techage] Error: "..text.."!")
end end
return text
end end
local function get_radius(pos, in_dir) local function get_radius(pos, in_dir)
@ -91,18 +99,14 @@ local function check_volume(pos, in_dir, owner)
"basic_materials:concrete_block", "default:obsidian_glass", "basic_materials:concrete_block", "default:obsidian_glass",
"techage:glow_gravel"}) "techage:glow_gravel"})
if node_tbl["default:obsidian_glass"] > 1 then if node_tbl["default:obsidian_glass"] > 1 then
chat(owner, "one window maximum") return chat(owner, "one window maximum")
return false
elseif node_tbl["default:obsidian_glass"] + node_tbl["basic_materials:concrete_block"] ~= Numbers.shell[radius] then elseif node_tbl["default:obsidian_glass"] + node_tbl["basic_materials:concrete_block"] ~= Numbers.shell[radius] then
chat(owner, "wrong number of shell nodes") return chat(owner, "wrong number of shell nodes")
return false
elseif node_tbl["default:gravel"] + node_tbl["techage:glow_gravel"] ~= Numbers.filling[radius] then elseif node_tbl["default:gravel"] + node_tbl["techage:glow_gravel"] ~= Numbers.filling[radius] then
chat(owner, "wrong number of gravel nodes") return chat(owner, "wrong number of gravel nodes")
return false
end end
else else
chat(owner, "wrong diameter (should be 5, 7, or 9)") return chat(owner, "wrong diameter (should be 5, 7, or 9)")
return false
end end
return true return true
end end
@ -131,6 +135,8 @@ techage.register_node({"techage:ta4_pipe_inlet"}, {
on_transfer = function(pos, in_dir, topic, payload) on_transfer = function(pos, in_dir, topic, payload)
if topic == "diameter" then if topic == "diameter" then
return get_radius(pos, in_dir) * 2 - 1 return get_radius(pos, in_dir) * 2 - 1
elseif topic == "integrity" then
return check_volume(pos, in_dir, payload)
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 elseif topic == "window" then

View File

@ -3,12 +3,12 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
TA4 Gas Turbine TA4 TES Gas Turbine
]]-- ]]--
@ -16,10 +16,18 @@
local M = minetest.get_meta local M = minetest.get_meta
local S = techage.S local S = techage.S
local CYCLE_TIME = 2
local Pipe = techage.LiquidPipe local Pipe = techage.LiquidPipe
local function transfer_heatexchanger3(pos, topic, payload)
return techage.transfer(pos, 6, topic, payload, Pipe,
{"techage:heatexchanger3"})
end
local function transfer_generator(pos, topic, payload)
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 = techage.get_node_lvm(pos) local node = techage.get_node_lvm(pos)
if node.name == name then if node.name == name then
@ -34,7 +42,7 @@ local function play_sound(pos)
if not mem.handle or mem.handle == -1 then if not mem.handle or mem.handle == -1 then
mem.handle = minetest.sound_play("techage_turbine", { mem.handle = minetest.sound_play("techage_turbine", {
pos = pos, pos = pos,
gain = 0.5, gain = 0.4,
max_hear_distance = 10, max_hear_distance = 10,
loop = true}) loop = true})
if mem.handle == -1 then if mem.handle == -1 then
@ -51,29 +59,20 @@ local function stop_sound(pos)
end end
end end
local function generator_cmnd(pos, cmnd) local function after_place_node(pos)
return techage.transfer( Pipe:after_place_node(pos)
pos,
"R", -- outdir
cmnd, -- topic
nil, -- payload
nil, -- network
{"techage:ta4_generator", "techage:ta4_generator_on"})
end end
-- to detect the missing "steam pressure" local function after_dig_node(pos, oldnode)
local function node_timer(pos, elapsed) stop_sound(pos)
local nvm = techage.get_nvm(pos) Pipe:after_dig_node(pos)
nvm.remote_trigger = (nvm.remote_trigger or 0) - 1 techage.del_mem(pos)
if nvm.remote_trigger <= 0 then
swap_node(pos, "techage:ta4_turbine")
stop_sound(pos)
nvm.running = false
end
play_sound(pos)
return true
end end
local function tubelib2_on_update2(pos, outdir, tlib2, node)
swap_node(pos, "techage:ta4_turbine")
stop_sound(pos)
end
minetest.register_node("techage:ta4_turbine", { minetest.register_node("techage:ta4_turbine", {
description = S("TA4 Turbine"), description = S("TA4 Turbine"),
@ -86,7 +85,11 @@ minetest.register_node("techage:ta4_turbine", {
"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_timer = node_timer,
after_place_node = after_place_node,
after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2,
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,
@ -123,12 +126,8 @@ minetest.register_node("techage:ta4_turbine_on", {
}, },
}, },
on_rightclick = function(pos) tubelib2_on_update2 = tubelib2_on_update2,
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,
@ -137,43 +136,45 @@ minetest.register_node("techage:ta4_turbine_on", {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
-- for mechanical pipe connections Pipe:add_secondary_node_names({"techage:ta4_turbine", "techage:ta4_turbine_on"})
techage.power.register_node({"techage:ta4_turbine", "techage:ta4_turbine_on"}, {
conn_sides = {"L", "U"},
power_network = Pipe,
after_place_node = function(pos, placer)
local nvm = techage.get_nvm(pos)
nvm.running = false
nvm.remote_trigger = 0
end,
})
-- for logical communication
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 nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
if topic == "power" then if topic == "trigger" then -- used by heatexchanger1
nvm.remote_trigger = 2 if not transfer_heatexchanger3(pos, topic, payload) then
return generator_cmnd(pos, topic) return 0
elseif topic == "start" then end
nvm.remote_trigger = 2 local power = transfer_generator(pos, topic, payload)
if not power or power <= 0 and nvm.running then
swap_node(pos, "techage:ta4_turbine")
stop_sound(pos)
nvm.running = false
return 0
elseif power and power > 0 and not nvm.running then
swap_node(pos, "techage:ta4_turbine_on")
play_sound(pos)
nvm.running = true
end
return power
elseif topic == "start" then -- used by generator
swap_node(pos, "techage:ta4_turbine_on") swap_node(pos, "techage:ta4_turbine_on")
nvm.running = true
minetest.get_node_timer(pos):start(CYCLE_TIME)
play_sound(pos) play_sound(pos)
return generator_cmnd(pos, topic) nvm.running = true
elseif topic == "stop" then return true
elseif topic == "stop" then -- used by generator
swap_node(pos, "techage:ta4_turbine") swap_node(pos, "techage:ta4_turbine")
nvm.running = false
nvm.remote_trigger = 0
minetest.get_node_timer(pos):stop()
stop_sound(pos) stop_sound(pos)
return generator_cmnd(pos, topic) nvm.running = false
elseif topic == "trigger" then return true
nvm.remote_trigger = 2
return generator_cmnd(pos, topic)
end end
end end,
on_node_load = function(pos, node)
--print("on_node_load", node.name)
if node.name == "techage:ta4_turbine_on" then
play_sound(pos)
end
end,
}) })
minetest.register_craft({ minetest.register_craft({

View File

@ -90,7 +90,6 @@ else
-- Liquids I -- Liquids I
dofile(MP.."/liquids/liquid_pipe.lua") dofile(MP.."/liquids/liquid_pipe.lua")
dofile(MP.."/liquids/node_api.lua") dofile(MP.."/liquids/node_api.lua")
--dofile(MP.."/liquids/liquid_lib.lua")
-- Basic Machines -- Basic Machines
dofile(MP.."/basic_machines/consumer.lua") -- consumer base model dofile(MP.."/basic_machines/consumer.lua") -- consumer base model
@ -182,24 +181,26 @@ else
--dofile(MP.."/.test/accu.lua") --dofile(MP.."/.test/accu.lua")
-- Solar -- Solar
-- dofile(MP.."/solar/minicell.lua") dofile(MP.."/solar/minicell.lua")
-- dofile(MP.."/solar/solarcell.lua") dofile(MP.."/solar/solarcell.lua")
-- dofile(MP.."/solar/inverter.lua") dofile(MP.."/solar/inverter.lua")
-- -- Wind -- -- Wind
-- dofile(MP.."/wind_turbine/rotor.lua") dofile(MP.."/wind_turbine/rotor.lua")
-- dofile(MP.."/wind_turbine/pillar.lua") dofile(MP.."/wind_turbine/pillar.lua")
-- 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/heatexchanger3.lua")
-- dofile(MP.."/energy_storage/generator.lua") dofile(MP.."/energy_storage/heatexchanger2.lua")
-- dofile(MP.."/energy_storage/turbine.lua") dofile(MP.."/energy_storage/heatexchanger1.lua")
-- dofile(MP.."/energy_storage/inlet.lua") dofile(MP.."/energy_storage/generator.lua")
-- dofile(MP.."/energy_storage/nodes.lua") dofile(MP.."/energy_storage/turbine.lua")
dofile(MP.."/energy_storage/inlet.lua")
dofile(MP.."/energy_storage/nodes.lua")
-- -- Chemistry -- -- Chemistry
-- dofile(MP.."/chemistry/ta4_reactor.lua") dofile(MP.."/chemistry/ta4_reactor.lua")
-- dofile(MP.."/chemistry/ta4_stand.lua") -- dofile(MP.."/chemistry/ta4_stand.lua")
-- dofile(MP.."/chemistry/ta4_doser.lua") -- dofile(MP.."/chemistry/ta4_doser.lua")

View File

@ -70,7 +70,6 @@ local function on_rightclick(pos, node, clicker)
end end
local function node_timer(pos, elapsed) local function node_timer(pos, elapsed)
print("node_timer")
local inv = M(pos):get_inventory() local inv = M(pos):get_inventory()
if not inv:is_empty("src") then if not inv:is_empty("src") then
local taken = techage.get_items(inv, "src", 1) local taken = techage.get_items(inv, "src", 1)

View File

@ -122,7 +122,6 @@ local function on_node_state_change(pos, old_state, new_state)
end end
local function drilling(pos, crd, nvm, inv) local function drilling(pos, crd, nvm, inv)
print("drilling")
M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm))
nvm.drill_pos = nvm.drill_pos or {x=pos.x, y=pos.y-1, z=pos.z} nvm.drill_pos = nvm.drill_pos or {x=pos.x, y=pos.y-1, z=pos.z}
local owner = M(pos):get_string("owner") local owner = M(pos):get_string("owner")

View File

@ -56,7 +56,7 @@ local function get_generator_sum(tbl, tlib_type)
if def and def["gstate"] ~= STOPPED then if def and def["gstate"] ~= STOPPED then
def["galive"] = (def["galive"] or 1) - 1 def["galive"] = (def["galive"] or 1) - 1
if def["galive"] > 0 then if def["galive"] > 0 then
sum = sum + v.nominal sum = sum + (def.curr_power or v.nominal)
end end
end end
end end
@ -82,7 +82,11 @@ local function set_given(pos, given, tlib_type)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local def = nvm[tlib_type] -- power related network data local def = nvm[tlib_type] -- power related network data
if (def and def["galive"] or 0) > 0 then if (def and def["galive"] or 0) > 0 then
def["given"] = given if def.curr_power and def.curr_power < given then
def["given"] = def.curr_power
else
def["given"] = given
end
return given return given
end end
return 0 return 0

View File

@ -48,9 +48,11 @@ function techage.power.formspec_power_bar(max_power, current_power)
return "techage_form_level_bg.png^[lowpart:"..percent..":techage_form_level_fg.png" return "techage_form_level_bg.png^[lowpart:"..percent..":techage_form_level_fg.png"
end end
function techage.power.formspec_label_bar(x, y, label, max_power, current_power) function techage.power.formspec_label_bar(x, y, label, max_power, current_power, unit)
local percent, ypos local percent, ypos
current_power = current_power or 0 current_power = current_power or 0
max_power = max_power or 1
unit = unit or "ku"
if current_power == 0 then if current_power == 0 then
percent = 0 percent = 0
ypos = 2.8 ypos = 2.8
@ -64,11 +66,11 @@ function techage.power.formspec_label_bar(x, y, label, max_power, current_power)
return "container["..x..","..y.."]".. return "container["..x..","..y.."]"..
"box[0,0;2.3,3.3;#395c74]".. "box[0,0;2.3,3.3;#395c74]"..
"label[0.2,0;"..label.."]".. "label[0.2,0;"..label.."]"..
"label[0.7,0.4;"..max_power.." ku]".. "label[0.7,0.4;"..max_power.." "..unit.."]"..
"image[0,0.5;1,3;".. "image[0,0.5;1,3;"..
"techage_form_level_bg.png^[lowpart:"..percent.. "techage_form_level_bg.png^[lowpart:"..percent..
":techage_form_level_fg.png]".. ":techage_form_level_fg.png]"..
"label[0.7,"..ypos..";"..current_power.." ku]".. "label[0.7,"..ypos..";"..current_power.." "..unit.."]"..
"container_end[]" "container_end[]"
end end

View File

@ -98,6 +98,31 @@ function techage.power.update_network(pos, outdir, Cable)
delete_netID(pos, outdir, Cable) -- network walk to delete all IDs delete_netID(pos, outdir, Cable) -- network walk to delete all IDs
end end
--
-- Read the current power value from all connected devices (used for solar cells)
-- Only used by the solar inverter to collect the power of all solar cells.
-- Only one inverter per network is allowed. Therefore, we have to check,
-- if additional inverters are in the network.
-- Function returns in addition the number of found inverters.
function techage.power.get_power(pos, outdir, Cable, inverter)
local sum = 0
local num_inverter = 0
networks.connection_walk(pos, outdir, Cable, function(pos, indir, node)
techage.mark_position("singleplayer", pos, "get_power", "", 2)-----------------------------------------
local def = net_def(pos, Cable.tube_type)
if def and def.on_getpower then
sum = sum + def.on_getpower(pos)
else
local node = techage.get_node_lvm(pos)
if node.name == inverter then
num_inverter = num_inverter + 1
end
end
end)
return sum, num_inverter
end
-- --
-- Consumer related functions -- Consumer related functions
@ -154,13 +179,15 @@ end
-- --
-- Generator related functions -- Generator related functions
-- --
function techage.power.generator_start(pos, Cable, cycle_time, outdir) -- curr_power is optional, only needed for generators with variable output power
function techage.power.generator_start(pos, Cable, cycle_time, outdir, curr_power)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local tlib_type = Cable.tube_type local tlib_type = Cable.tube_type
nvm[tlib_type] = nvm[tlib_type] or {} nvm[tlib_type] = nvm[tlib_type] or {}
nvm[tlib_type]["galive"] = (cycle_time / 2) + 2 nvm[tlib_type]["galive"] = (cycle_time / 2) + 2
nvm[tlib_type]["gstate"] = RUNNING nvm[tlib_type]["gstate"] = RUNNING
nvm[tlib_type]["given"] = 0 nvm[tlib_type]["given"] = 0
nvm[tlib_type]["curr_power"] = curr_power
trigger_network(pos, outdir, Cable) trigger_network(pos, outdir, Cable)
end end
@ -173,12 +200,14 @@ function techage.power.generator_stop(pos, Cable, outdir)
nvm[tlib_type]["given"] = 0 nvm[tlib_type]["given"] = 0
end end
function techage.power.generator_alive(pos, Cable, cycle_time, outdir) -- curr_power is optional, only needed for generators with variable output power
function techage.power.generator_alive(pos, Cable, cycle_time, outdir, curr_power)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local def = nvm[Cable.tube_type] -- power related network data local def = nvm[Cable.tube_type] -- power related network data
if def then if def then
trigger_network(pos, outdir, Cable) trigger_network(pos, outdir, Cable)
def["galive"] = (cycle_time / 2) + 2 def["galive"] = (cycle_time / 2) + 2
def["curr_power"] = curr_power
return def["given"] or 0 return def["given"] or 0
end end
return 0 return 0

View File

@ -38,10 +38,10 @@ local function generator_data(gen_tbl)
tbl.pow_all = tbl.pow_all + (gen.nominal or 0) tbl.pow_all = tbl.pow_all + (gen.nominal or 0)
if nvm.ele1 and nvm.ele1.gstate and nvm.ele1.gstate ~= STOPPED then if nvm.ele1 and nvm.ele1.gstate and nvm.ele1.gstate ~= STOPPED then
tbl.num_on = tbl.num_on + 1 tbl.num_on = tbl.num_on + 1
tbl.pow_on = tbl.pow_on + (gen.nominal or 0) tbl.pow_on = tbl.pow_on + (nvm.ele1.curr_power or gen.nominal or 0)
if (nvm.ele1.galive or 0) > 0 then if (nvm.ele1.galive or 0) > 0 then
tbl.num_act = tbl.num_act + 1 tbl.num_act = tbl.num_act + 1
tbl.pow_act = tbl.pow_act + (gen.nominal or 0) tbl.pow_act = tbl.pow_act + (nvm.ele1.curr_power or gen.nominal or 0)
if (nvm.ele1.given or 0) > 0 then if (nvm.ele1.given or 0) > 0 then
tbl.num_used = tbl.num_used + 1 tbl.num_used = tbl.num_used + 1
tbl.pow_used = tbl.pow_used + (nvm.ele1.given or 0) tbl.pow_used = tbl.pow_used + (nvm.ele1.given or 0)

View File

@ -3,7 +3,7 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
@ -18,18 +18,18 @@ local S = techage.S
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 S2P = minetest.string_to_pos local S2P = minetest.string_to_pos
local Power = techage.ElectricCable local Cable = techage.ElectricCable
local Solar = techage.TA4_Cable local Solar = techage.TA4_Cable
local power = techage.power local power = techage.power
local networks = techage.networks
local CYCLE_TIME = 2 local CYCLE_TIME = 2
local PWR_PERF = 100 local PWR_PERF = 100
local function determine_power(pos, nvm) local function determine_power(pos, nvm)
-- determine DC node position -- determine DC node position
local dir = M(pos):get_int("left_dir") local outdir = M(pos):get_int("leftdir")
local pos1 = techage.get_pos(pos, dir) local max_power, num_inverter = power.get_power(pos, outdir, Solar, "techage:ta4_solar_inverter")
local max_power, num_inverter = power.get_power(pos1, "techage:ta4_solar_inverterDC")
if num_inverter == 1 then if num_inverter == 1 then
nvm.max_power = math.min(PWR_PERF, max_power) nvm.max_power = math.min(PWR_PERF, max_power)
else else
@ -43,13 +43,11 @@ local function determine_power_from_time_to_time(pos, nvm)
if time < 6.00/24.00 or time > 18.00/24.00 then if time < 6.00/24.00 or time > 18.00/24.00 then
nvm.ticks = 0 nvm.ticks = 0
nvm.max_power = 0 nvm.max_power = 0
power.generator_update(pos, nvm, nvm.max_power)
return return
end end
nvm.ticks = nvm.ticks or 0 nvm.ticks = nvm.ticks or 0
if (nvm.ticks % 10) == 0 then -- calculate max_power not to often if (nvm.ticks % 10) == 0 then -- calculate max_power not to often
determine_power(pos, nvm) determine_power(pos, nvm)
power.generator_update(pos, nvm, nvm.max_power)
else else
nvm.max_power = nvm.max_power or 0 nvm.max_power = nvm.max_power or 0
end end
@ -57,23 +55,23 @@ local function determine_power_from_time_to_time(pos, nvm)
end end
local function formspec(self, pos, nvm) local function formspec(self, pos, nvm)
determine_power(pos, nvm)
local max_power = nvm.max_power or 0 local max_power = nvm.max_power or 0
local delivered = nvm.delivered or 0 local delivered = nvm.delivered or 0
local bar_in = techage.power.formspec_power_bar(max_power, max_power) local arrow = "image[2.5,1.5;1,1;techage_form_arrow_bg.png^[transformR270]"
local bar_out = techage.power.formspec_power_bar(max_power, delivered) if nvm.running then
return "size[5,3]".. arrow = "image[2.5,1.5;1,1;techage_form_arrow_fg.png^[transformR270]"
end
return "size[6,4]"..
default.gui_bg.. default.gui_bg..
default.gui_bg_img.. default.gui_bg_img..
default.gui_slots.. default.gui_slots..
"label[0.2,0;DC]".. "box[0,-0.1;5.8,0.5;#c6e8ff]"..
"image[0,0.5;1,2;"..bar_in.."]".. "label[2.5,-0.1;"..minetest.colorize( "#000000", S("Inverter")).."]"..
"label[0,2.5;"..max_power.." ku]".. power.formspec_label_bar(0, 0.8, S("Power DC"), PWR_PERF, max_power)..
"button[1.1,1;1.8,1;update;"..S("Update").."]".. power.formspec_label_bar(3.5, 0.8, S("Power AC"), PWR_PERF, delivered)..
"image_button[3,1;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. arrow..
"label[4.2,0;AC]".. "image_button[2.5,3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]"..
"image[4,0.5;1,2;"..bar_out.."]".. "tooltip[2.5,3;1,1;"..self:get_state_tooltip(nvm).."]"
"label[4,2.5;"..delivered.." ku]"
end end
local function can_start(pos, nvm, state) local function can_start(pos, nvm, state)
@ -87,13 +85,15 @@ local function start_node(pos, nvm, state)
nvm.running = true nvm.running = true
nvm.delivered = 0 nvm.delivered = 0
nvm.ticks = 0 nvm.ticks = 0
power.generator_start(pos, nvm, nvm.max_power) local outdir = M(pos):get_int("outdir")
power.generator_start(pos, Cable, CYCLE_TIME, outdir, nvm.max_power)
end end
local function stop_node(pos, nvm, state) local function stop_node(pos, nvm, state)
nvm.running = false nvm.running = false
nvm.delivered = 0 nvm.delivered = 0
power.generator_stop(pos, nvm) local outdir = M(pos):get_int("outdir")
power.generator_stop(pos, Cable, outdir)
end end
local State = techage.NodeStates:new({ local State = techage.NodeStates:new({
@ -109,15 +109,17 @@ local State = techage.NodeStates:new({
local function node_timer(pos, elapsed) local function node_timer(pos, elapsed)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
if nvm.running then determine_power_from_time_to_time(pos, nvm)
determine_power(pos, nvm) --if nvm.max_power > 0 then
if nvm.max_power > 0 then local outdir = M(pos):get_int("outdir")
nvm.delivered = power.generator_alive(pos, nvm) nvm.delivered = power.generator_alive(pos, Cable, CYCLE_TIME, outdir, nvm.max_power)
else --else
nvm.delivered = 0 --nvm.delivered = 0
end --end
if techage.is_activeformspec(pos) then
M(pos):set_string("formspec", formspec(State, pos, nvm))
end end
return nvm.running return true
end end
local function on_receive_fields(pos, formname, fields, player) local function on_receive_fields(pos, formname, fields, player)
@ -132,19 +134,25 @@ local function on_receive_fields(pos, formname, fields, player)
end end
end end
local function on_rightclick(pos) local function on_rightclick(pos, node, clicker)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
determine_power(pos, nvm)
techage.set_activeformspec(pos, clicker)
M(pos):set_string("formspec", formspec(State, pos, nvm)) M(pos):set_string("formspec", formspec(State, pos, nvm))
end end
local function tubelib2_on_update2(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2)
end
minetest.register_node("techage:ta4_solar_inverter", { minetest.register_node("techage:ta4_solar_inverter", {
description = S("TA4 Solar Inverter AC"), description = S("TA4 Solar Inverter"),
tiles = { tiles = {
-- up, down, right, left, back, front -- up, down, right, left, back, front
"techage_filling_ta4.png^techage_frame_ta4_top.png", "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png",
"techage_filling_ta4.png^techage_frame_ta4.png", "techage_filling_ta4.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_open.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png",
}, },
@ -153,46 +161,75 @@ minetest.register_node("techage:ta4_solar_inverter", {
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
is_ground_content = false, is_ground_content = false,
after_place_node = function(pos)
local nvm = techage.get_nvm(pos)
M(pos):set_int("outdir", networks.side_to_outdir(pos, "R"))
M(pos):set_int("leftdir", networks.side_to_outdir(pos, "L"))
Cable:after_place_node(pos)
Solar:after_place_node(pos)
local number = techage.add_node(pos, "techage:ta4_solar_inverter")
State:node_init(pos, nvm, number)
M(pos):set_string("formspec", formspec(State, pos, nvm))
end,
after_dig_node = function(pos, oldnode)
Cable:after_dig_node(pos)
Solar:after_dig_node(pos)
techage.del_mem(pos)
end,
tubelib2_on_update2 = tubelib2_on_update2,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
on_rightclick = on_rightclick, on_rightclick = on_rightclick,
on_timer = node_timer, on_timer = node_timer,
networks = {
ele1 = {
sides = {R = 1},
ntype = "gen1",
nominal = PWR_PERF,
},
ele2 = {
sides = {L = 1},
ntype = "con1",
},
}
}) })
minetest.register_node("techage:ta4_solar_inverterDC", { --minetest.register_node("techage:ta4_solar_inverterDC", {
description = S("TA4 Solar Inverter DC"), -- description = S("TA4 Solar Inverter DC"),
tiles = { -- tiles = {
-- up, down, right, left, back, front -- -- up, down, right, left, back, front
"techage_filling_ta4.png^techage_frame_ta4_top.png", -- "techage_filling_ta4.png^techage_frame_ta4_top.png",
"techage_filling_ta4.png^techage_frame_ta4.png", -- "techage_filling_ta4.png^techage_frame_ta4.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_open.png", -- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_open.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png", -- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png", -- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png",
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png", -- "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverterDC.png",
}, -- },
paramtype2 = "facedir",
groups = {cracky=2, crumbly=2, choppy=2}, -- after_place_node = function(pos)
on_rotate = screwdriver.disallow, -- Solar:after_place_node(pos)
is_ground_content = false, -- end,
})
-- after_dig_node = function(pos, oldnode)
-- Solar:after_dig_node(pos)
-- end,
-- tubelib2_on_update2 = tubelib2_on_update2,
-- paramtype2 = "facedir",
-- groups = {cracky=2, crumbly=2, choppy=2},
-- on_rotate = screwdriver.disallow,
-- is_ground_content = false,
-- networks = {
-- ele2 = {
-- sides = {L = 1},
-- ntype = "con1",
-- },
-- }
--})
techage.power.register_node({"techage:ta4_solar_inverter"}, { Cable:add_secondary_node_names({"techage:ta4_solar_inverter"})
conn_sides = {"R"}, Solar:add_secondary_node_names({"techage:ta4_solar_inverter"})
power_network = Power,
after_place_node = function(pos, placer)
-- DC block direction
M(pos):set_int("left_dir", techage.power.side_to_outdir(pos, "L"))
local number = techage.add_node(pos, "techage:ta4_solar_inverter")
local nvm = techage.get_nvm(pos)
State:node_init(pos, nvm, number)
M(pos):set_string("formspec", formspec(State, pos, nvm))
end,
})
techage.power.register_node({"techage:ta4_solar_inverterDC"}, {
conn_sides = {"L"},
power_network = Solar,
})
techage.register_node({"techage:ta4_solar_inverter"}, { techage.register_node({"techage:ta4_solar_inverter"}, {
on_recv_message = function(pos, src, topic, payload) on_recv_message = function(pos, src, topic, payload)
@ -212,11 +249,11 @@ minetest.register_craft({
}, },
}) })
minetest.register_craft({ --minetest.register_craft({
output = "techage:ta4_solar_inverterDC", -- output = "techage:ta4_solar_inverterDC",
recipe = { -- recipe = {
{'default:steel_ingot', 'dye:green', 'default:steel_ingot'}, -- {'default:steel_ingot', 'dye:green', 'default:steel_ingot'},
{'techage:ta4_power_cableS', '', ''}, -- {'techage:ta4_power_cableS', '', ''},
{'default:steel_ingot', "techage:baborium_ingot", 'default:steel_ingot'}, -- {'default:steel_ingot', "techage:baborium_ingot", 'default:steel_ingot'},
}, -- },
}) --})

View File

@ -3,7 +3,7 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
@ -38,7 +38,7 @@ local function node_timer(pos, elapsed)
if light >= (minetest.LIGHT_MAX - 1) then if light >= (minetest.LIGHT_MAX - 1) then
if nvm.providing then if nvm.providing then
power.generator_stop(pos, nvm) power.generator_stop(pos, Cable, 5)
nvm.providing = false nvm.providing = false
nvm.provided = 0 nvm.provided = 0
end end
@ -46,13 +46,14 @@ local function node_timer(pos, elapsed)
else else
if nvm.capa > 0 then if nvm.capa > 0 then
if not nvm.providing then if not nvm.providing then
power.generator_start(pos, nvm, PWR_PERF) power.generator_start(pos, Cable, CYCLE_TIME, 5)
nvm.providing = true nvm.providing = true
else
nvm.provided = power.generator_alive(pos, Cable, CYCLE_TIME, 5)
nvm.capa = nvm.capa - nvm.provided
end end
nvm.provided = power.generator_alive(pos, nvm)
nvm.capa = nvm.capa - nvm.provided
else else
power.generator_stop(pos, nvm) power.generator_stop(pos, Cable, 5)
nvm.providing = false nvm.providing = false
nvm.provided = 0 nvm.provided = 0
nvm.capa = 0 nvm.capa = 0
@ -61,6 +62,36 @@ local function node_timer(pos, elapsed)
return true return true
end end
local function after_place_node(pos)
local meta = M(pos)
local number = techage.add_node(pos, "techage:ta4_solar_minicell")
meta:set_string("node_number", number)
meta:set_string("infotext", S("TA4 Streetlamp Solar Cell").." "..number)
local nvm = techage.get_nvm(pos)
nvm.capa = 0
nvm.providing = false
minetest.get_node_timer(pos):start(CYCLE_TIME)
Cable:after_place_node(pos)
end
local function after_dig_node(pos, oldnode)
Cable:after_dig_node(pos)
techage.remove_node(pos)
techage.del_mem(pos)
end
local function tubelib2_on_update2(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2)
end
local net_def = {
ele1 = {
sides = {D = 1},
ntype = "gen1",
nominal = PWR_CAPA,
},
}
minetest.register_node("techage:ta4_solar_minicell", { minetest.register_node("techage:ta4_solar_minicell", {
description = S("TA4 Streetlamp Solar Cell"), description = S("TA4 Streetlamp Solar Cell"),
tiles = { tiles = {
@ -80,28 +111,14 @@ minetest.register_node("techage:ta4_solar_minicell", {
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {cracky=2, crumbly=2, choppy=2}, groups = {cracky=2, crumbly=2, choppy=2},
is_ground_content = false, is_ground_content = false,
after_place_node = after_place_node,
after_dig_node = after_dig_node,
on_timer = node_timer, on_timer = node_timer,
tubelib2_on_update2 = tubelib2_on_update2,
}) })
techage.power.register_node({"techage:ta4_solar_minicell"}, { Cable:add_secondary_node_names({"techage:ta4_solar_minicell"})
power_network = Cable,
conn_sides = {"D"},
after_place_node = function(pos)
local meta = minetest.get_meta(pos)
local number = techage.add_node(pos, "techage:ta4_solar_minicell")
meta:set_string("node_number", number)
meta:set_string("infotext", S("TA4 Streetlamp Solar Cell").." "..number)
local nvm = techage.get_nvm(pos)
nvm.capa = 0
nvm.providing = false
minetest.get_node_timer(pos):start(CYCLE_TIME)
end,
after_dig_node = function(pos)
techage.remove_node(pos)
techage.del_mem(pos)
end,
})
techage.register_node({"techage:ta4_solar_minicell"}, { techage.register_node({"techage:ta4_solar_minicell"}, {
on_recv_message = function(pos, src, topic, payload) on_recv_message = function(pos, src, topic, payload)
@ -119,12 +136,7 @@ techage.register_node({"techage:ta4_solar_minicell"}, {
end end
end, end,
on_node_load = function(pos) on_node_load = function(pos)
local meta = M(pos) minetest.get_node_timer(pos):start(CYCLE_TIME)
local number = meta:get_string("number") or ""
if number ~= "" then
meta:set_string("node_number", number)
meta:set_string("number", nil)
end
end, end,
}) })

View File

@ -3,7 +3,7 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
@ -32,8 +32,7 @@ end
-- return the required param2 for solar modules -- return the required param2 for solar modules
local function get_param2(pos, side) local function get_param2(pos, side)
local node = techage.get_node_lvm(pos) local dir = techage.networks.side_to_outdir(pos, side)
local dir = power.side_to_dir(node.param2, side)
return (dir + 1) % 4 return (dir + 1) % 4
end end
@ -62,7 +61,7 @@ local function is_solar_module(base_pos, pos, side)
end end
-- provide the available power, which is temperature dependent -- provide the available power, which is temperature dependent
local function on_getpower1(pos, mem) local function on_getpower1(pos)
local pos1 = {x = pos.x, y = pos.y, z = pos.z} local pos1 = {x = pos.x, y = pos.y, z = pos.z}
if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then
return PWR_PERF * M(pos):get_int("temperature") / 100.0 return PWR_PERF * M(pos):get_int("temperature") / 100.0
@ -70,7 +69,7 @@ local function on_getpower1(pos, mem)
return 0 return 0
end end
local function on_getpower2(pos, mem) local function on_getpower2(pos)
local pos1 = {x = pos.x, y = pos.y+1, z = pos.z} local pos1 = {x = pos.x, y = pos.y+1, z = pos.z}
if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then
return PWR_PERF * M(pos):get_int("temperature") / 100.0 return PWR_PERF * M(pos):get_int("temperature") / 100.0
@ -78,6 +77,36 @@ local function on_getpower2(pos, mem)
return 0 return 0
end end
local function after_place_node(pos)
M(pos):set_int("temperature", temperature(pos))
M(pos):set_int("left_param2", get_param2(pos, "L"))
M(pos):set_int("right_param2", get_param2(pos, "R"))
Cable:after_place_node(pos)
end
local function after_dig_node(pos, oldnode)
Cable:after_dig_node(pos)
end
local function tubelib2_on_update2(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2)
end
local net_def1 = {
ele2 = {
sides = {F=1, B=1},
ntype = "junc",
on_getpower = on_getpower1,
},
}
local net_def2 = {
ele2 = {
sides = {F=1, B=1},
ntype = "junc",
on_getpower = on_getpower2,
},
}
minetest.register_node("techage:ta4_solar_module", { minetest.register_node("techage:ta4_solar_module", {
description = S("TA4 Solar Module"), description = S("TA4 Solar Module"),
@ -130,6 +159,17 @@ minetest.register_node("techage:ta4_solar_carrier", {
{-3/8, 5/16, -1/2, 3/8, 7/16, 1/2}, {-3/8, 5/16, -1/2, 3/8, 7/16, 1/2},
}, },
}, },
after_place_node = function(pos)
M(pos):set_int("temperature", temperature(pos))
M(pos):set_int("left_param2", get_param2(pos, "L"))
M(pos):set_int("right_param2", get_param2(pos, "R"))
end,
after_place_node = after_place_node,
after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2,
networks = net_def1,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
@ -156,6 +196,18 @@ minetest.register_node("techage:ta4_solar_carrierB", {
{-1/8, -6/16, -1/2, 1/8, 8/16, 1/2}, {-1/8, -6/16, -1/2, 1/8, 8/16, 1/2},
}, },
}, },
after_place_node = function(pos)
M(pos):set_int("temperature", temperature(pos))
M(pos):set_int("left_param2", get_param2(pos, "L"))
M(pos):set_int("right_param2", get_param2(pos, "R"))
Cable:after_place_node(pos)
end,
after_place_node = after_place_node,
after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2,
networks = net_def2,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
@ -189,27 +241,8 @@ minetest.register_node("techage:ta4_solar_carrierT", {
is_ground_content = false, is_ground_content = false,
}) })
techage.power.register_node({"techage:ta4_solar_carrier"}, { Cable:add_secondary_node_names({"techage:ta4_solar_carrier", "techage:ta4_solar_carrierB"})
power_network = Cable,
on_getpower = on_getpower1,
conn_sides ={"F", "B"},
after_place_node = function(pos)
M(pos):set_int("temperature", temperature(pos))
M(pos):set_int("left_param2", get_param2(pos, "L"))
M(pos):set_int("right_param2", get_param2(pos, "R"))
end,
})
techage.power.register_node({"techage:ta4_solar_carrierB"}, {
power_network = Cable,
on_getpower = on_getpower2,
conn_sides ={"F", "B"},
after_place_node = function(pos)
M(pos):set_int("temperature", temperature(pos))
M(pos):set_int("left_param2", get_param2(pos, "L"))
M(pos):set_int("right_param2", get_param2(pos, "R"))
end,
})
minetest.register_craft({ minetest.register_craft({
output = "techage:ta4_solar_module", output = "techage:ta4_solar_module",

View File

@ -3,7 +3,7 @@
TechAge TechAge
======= =======
Copyright (C) 2019 Joachim Stolberg Copyright (C) 2019-2020 Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
@ -31,8 +31,6 @@ minetest.register_node("techage:pillar", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
}) })
minetest.register_craft({ minetest.register_craft({
type = "shapeless", type = "shapeless",
output = "techage:pillar", output = "techage:pillar",

View File

@ -3,7 +3,7 @@
TechAge TechAge
======= =======
Copyright (C) 2019 DS-Minetest, Joachim Stolberg Copyright (C) 2019-2020 DS-Minetest, Joachim Stolberg
GPL v3 GPL v3
See LICENSE.txt for more information See LICENSE.txt for more information
@ -119,7 +119,7 @@ local function start_rotor(pos, nvm)
nvm.providing = true nvm.providing = true
nvm.delivered = 0 nvm.delivered = 0
power.generator_start(pos, nvm, PWR_PERF) power.generator_start(pos, Cable, CYCLE_TIME, 5)
local hash = minetest.hash_node_position(pos) local hash = minetest.hash_node_position(pos)
if Rotors[hash] then if Rotors[hash] then
Rotors[hash]:set_animation_frame_speed(50) Rotors[hash]:set_animation_frame_speed(50)
@ -129,7 +129,7 @@ end
local function stop_rotor(pos, nvm) local function stop_rotor(pos, nvm)
nvm.providing = false nvm.providing = false
nvm.delivered = 0 nvm.delivered = 0
power.generator_stop(pos, nvm) power.generator_stop(pos, Cable, 5)
local hash = minetest.hash_node_position(pos) local hash = minetest.hash_node_position(pos)
if Rotors[hash] then if Rotors[hash] then
Rotors[hash]:set_animation_frame_speed(0) Rotors[hash]:set_animation_frame_speed(0)
@ -153,12 +153,39 @@ local function node_timer(pos, elapsed)
stop_rotor(pos, nvm) stop_rotor(pos, nvm)
end end
end end
if nvm.providing then nvm.delivered = power.generator_alive(pos, Cable, CYCLE_TIME, 5, (nvm.providing and PWR_PERF) or 0)
nvm.delivered = power.generator_alive(pos, nvm)
end
return true return true
end end
local function after_place_node(pos, placer)
local meta = M(pos)
local nvm = techage.get_nvm(pos)
local own_num = techage.add_node(pos, "techage:ta4_wind_turbine")
meta:set_string("node_number", own_num)
meta:set_string("owner", placer:get_player_name())
meta:set_string("infotext", S("TA4 Wind Turbine").." "..own_num)
nvm.providing = false
nvm.running = true
add_rotor(pos, nvm, placer:get_player_name())
minetest.get_node_timer(pos):start(CYCLE_TIME)
Cable:after_place_node(pos)
end
local function after_dig_node(pos, oldnode)
local hash = minetest.hash_node_position(pos)
if Rotors[hash] and Rotors[hash]:get_luaentity() then
Rotors[hash]:remove()
end
Rotors[hash] = nil
Cable:after_dig_node(pos)
techage.remove_node(pos)
techage.del_mem(pos)
end
local function tubelib2_on_update2(pos, outdir, tlib2, node)
power.update_network(pos, outdir, tlib2)
end
minetest.register_node("techage:ta4_wind_turbine", { minetest.register_node("techage:ta4_wind_turbine", {
description = S("TA4 Wind Turbine"), description = S("TA4 Wind Turbine"),
inventory_image = "techage_wind_turbine_inv.png", inventory_image = "techage_wind_turbine_inv.png",
@ -172,6 +199,16 @@ minetest.register_node("techage:ta4_wind_turbine", {
"techage_rotor.png^techage_appl_open.png", "techage_rotor.png^techage_appl_open.png",
}, },
networks = {
ele1 = {
sides = {D = 1},
ntype = "gen1",
nominal = PWR_PERF,
},
},
after_place_node = after_place_node,
after_dig_node = after_dig_node,
tubelib2_on_update2 = tubelib2_on_update2,
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},
@ -207,32 +244,7 @@ minetest.register_entity("techage:rotor_ent", {initial_properties = {
static_save = false, static_save = false,
}}) }})
techage.power.register_node({"techage:ta4_wind_turbine"}, { Cable:add_secondary_node_names({"techage:ta4_wind_turbine"})
power_network = Cable,
conn_sides = {"D"},
after_place_node = function(pos, placer)
local meta = M(pos)
local nvm = techage.get_nvm(pos)
local own_num = techage.add_node(pos, "techage:ta4_wind_turbine")
meta:set_string("node_number", own_num)
meta:set_string("owner", placer:get_player_name())
meta:set_string("infotext", S("TA4 Wind Turbine").." "..own_num)
nvm.providing = false
nvm.running = true
add_rotor(pos, nvm, placer:get_player_name())
minetest.get_node_timer(pos):start(CYCLE_TIME)
end,
after_dig_node = function(pos)
local hash = minetest.hash_node_position(pos)
if Rotors[hash] and Rotors[hash]:get_luaentity() then
Rotors[hash]:remove()
end
Rotors[hash] = nil
techage.remove_node(pos)
techage.del_mem(pos)
end,
})
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)