230 lines
7.1 KiB
Lua
230 lines
7.1 KiB
Lua
--[[
|
|
|
|
TechAge
|
|
=======
|
|
|
|
Copyright (C) 2019-2020 Joachim Stolberg
|
|
|
|
GPL v3
|
|
See LICENSE.txt for more information
|
|
|
|
TA3 Power Terminal
|
|
|
|
]]--
|
|
|
|
-- for lazy programmers
|
|
local S2P = minetest.string_to_pos
|
|
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
|
local M = minetest.get_meta
|
|
local N = function(pos) return minetest.get_node(pos).name end
|
|
local S = techage.S
|
|
|
|
local CYCLE_TIME = 2
|
|
|
|
local Cable = techage.ElectricCable
|
|
local power = techage.power
|
|
local networks = techage.networks
|
|
local STOPPED = techage.power.STOPPED
|
|
local NOPOWER = techage.power.NOPOWER
|
|
local RUNNING = techage.power.RUNNING
|
|
|
|
local function generator_data(gen_tbl)
|
|
local tbl = {
|
|
pow_all=0, pow_on=0, pow_act=0, pow_used=0,
|
|
num_on=0, num_act=0, num_used=0
|
|
}
|
|
for i,gen in ipairs(gen_tbl or {}) do
|
|
local nvm = techage.get_nvm(gen.pos)
|
|
tbl.pow_all = tbl.pow_all + (gen.nominal or 0)
|
|
if nvm.ele1 and nvm.ele1.gstate and nvm.ele1.gstate ~= STOPPED then
|
|
tbl.num_on = tbl.num_on + 1
|
|
tbl.pow_on = tbl.pow_on + (nvm.ele1.curr_power or gen.nominal or 0)
|
|
if (nvm.ele1.galive or 0) > 0 then
|
|
tbl.num_act = tbl.num_act + 1
|
|
tbl.pow_act = tbl.pow_act + (nvm.ele1.curr_power or gen.nominal or 0)
|
|
if (nvm.ele1.given or 0) > 0 then
|
|
tbl.num_used = tbl.num_used + 1
|
|
tbl.pow_used = tbl.pow_used + (nvm.ele1.given or 0)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
tbl.num_all = #(gen_tbl or {})
|
|
return tbl
|
|
end
|
|
|
|
local function consumer_data(con_tbl)
|
|
local tbl = {
|
|
pow_all=0, pow_on=0, pow_act=0, pow_used=0,
|
|
num_on=0, num_act=0, num_used=0
|
|
}
|
|
for i,gen in ipairs(con_tbl or {}) do
|
|
local nvm = techage.get_nvm(gen.pos)
|
|
tbl.pow_all = tbl.pow_all + (gen.nominal or 0)
|
|
if nvm.ele1 and nvm.ele1.cstate and nvm.ele1.cstate ~= STOPPED then
|
|
tbl.num_on = tbl.num_on + 1
|
|
tbl.pow_on = tbl.pow_on + (gen.nominal or 0)
|
|
if (nvm.ele1.calive or 0) > 0 then
|
|
tbl.num_act = tbl.num_act + 1
|
|
tbl.pow_act = tbl.pow_act + (gen.nominal or 0)
|
|
if (nvm.ele1.taken or 0) > 0 then
|
|
tbl.num_used = tbl.num_used + 1
|
|
tbl.pow_used = tbl.pow_used + (nvm.ele1.taken or 0)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
tbl.num_all = #(con_tbl or {})
|
|
return tbl
|
|
end
|
|
|
|
local function calc_network_data(pos, nvm)
|
|
local netw = techage.networks.has_network("ele1", nvm.ele1 and nvm.ele1.netID) or {}
|
|
local gen1 = generator_data(netw.gen1)
|
|
local gen2 = generator_data(netw.gen2)
|
|
local con1 = consumer_data(netw.con1)
|
|
local con2 = consumer_data(netw.con2)
|
|
|
|
return netw, gen1, gen2, con1, con2
|
|
end
|
|
|
|
local function column(x,y, data)
|
|
return
|
|
"label["..x..","..(y+0.0)..";"..data.num_all.. " ("..data.pow_all.." ku)]"..
|
|
"label["..x..","..(y+0.5)..";"..data.num_on.. " ("..data.pow_on.." ku)]"..
|
|
"label["..x..","..(y+1.0)..";"..data.num_act.. " ("..data.pow_act.." ku)]"..
|
|
"label["..x..","..(y+1.5)..";"..data.num_used.." ("..data.pow_used.." ku)]"
|
|
end
|
|
|
|
local function get_state(netw, gen1, gen2, con1, con2)
|
|
local num_nodes = gen1.num_all + gen2.num_all + con1.num_all +
|
|
con2.num_all + (#(netw.junc or {})) + (#(netw.term or {}))
|
|
local nload = (gen1.pow_act + gen2.pow_act) / con1.pow_act
|
|
local state = S("Number of all nodes")..": ".. num_nodes
|
|
if not netw.gen1 and not netw.gen2 then
|
|
state = S("No network or active generator available!")
|
|
elseif num_nodes > (techage.ELE1_MAX_CABLE_LENGHT - 50) then
|
|
state = string.format(S("With %u of a maximum of %u blocks you are almost at the limit!"),
|
|
num_nodes, techage.ELE1_MAX_CABLE_LENGHT)
|
|
elseif nload <= 1.0 then
|
|
state = S("The network is overloaded!")
|
|
elseif nload < 1.2 then
|
|
state = S("The network load is almost at the limit!")
|
|
end
|
|
return state
|
|
end
|
|
|
|
local function formspec(pos, nvm)
|
|
local netw, gen1, gen2, con1, con2 = calc_network_data(pos, nvm)
|
|
netw.prop = ((netw.prop or 0) + 1) % 2
|
|
local star = netw.prop == 1 and "*" or ""
|
|
local state = get_state(netw, gen1, gen2, con1, con2)
|
|
|
|
return "size[10,7]"..
|
|
default.gui_bg..
|
|
default.gui_bg_img..
|
|
default.gui_slots..
|
|
"box[0,-0.1;9.8,0.5;#c6e8ff]"..
|
|
"label[4,-0.1;"..minetest.colorize( "#000000", S("Network Data")).."]"..
|
|
"label[9.5,-0.1;"..minetest.colorize( "#000000", star).."]"..
|
|
power.formspec_label_bar(0, 0.7, S("Genera. 1"), gen1.pow_act, gen1.pow_used)..
|
|
power.formspec_label_bar(2.5, 0.7, S("Genera. 2"), gen2.pow_act, gen2.pow_used)..
|
|
power.formspec_label_bar(5, 0.7, S("Consum. 2"), con2.pow_act, con2.pow_used)..
|
|
power.formspec_label_bar(7.5, 0.7, S("Consum. 1"), con1.pow_act, con1.pow_used)..
|
|
"box[0,4.3;9.8,0.4;#c6e8ff]"..
|
|
"box[0,4.85;9.8,0.4;#395c74]"..
|
|
"box[0,5.35;9.8,0.4;#395c74]"..
|
|
"box[0,5.85;9.8,0.4;#395c74]"..
|
|
"box[0,6.35;9.8,0.4;#395c74]"..
|
|
"label[2,4.3;"..minetest.colorize( "#000000", S("Genera. 1")).."]"..
|
|
"label[4,4.3;"..minetest.colorize( "#000000", S("Genera. 2")).."]"..
|
|
"label[6,4.3;"..minetest.colorize( "#000000", S("Consum. 2")).."]"..
|
|
"label[8,4.3;"..minetest.colorize( "#000000", S("Consum. 1")).."]"..
|
|
"label[0.1,4.8;"..S("All nodes:").."]"..
|
|
"label[0.1,5.3;"..S("Turned on:").."]"..
|
|
"label[0.1,5.8;"..S("Active:").."]"..
|
|
"label[0.1,6.3;"..S("In use:").."]"..
|
|
"box[0,6.95;9.8,0.4;#000000]"..
|
|
"label[0.1,6.9;"..state.."]"..
|
|
column(2, 4.8, gen1)..
|
|
column(4, 4.8, gen2)..
|
|
column(6, 4.8, con2)..
|
|
column(8, 4.8, con1)
|
|
end
|
|
|
|
minetest.register_node("techage:power_terminal", {
|
|
description = S("TA3 Power Terminal"),
|
|
inventory_image = "techage_power_terminal_front.png",
|
|
tiles = {
|
|
"techage_power_terminal_top.png",
|
|
"techage_power_terminal_top.png",
|
|
"techage_power_terminal_side.png",
|
|
"techage_power_terminal_side.png",
|
|
"techage_power_terminal_back.png",
|
|
"techage_power_terminal_front.png",
|
|
},
|
|
drawtype = "nodebox",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{ -8/16, -8/16, 0/16, 8/16, 8/16, 8/16},
|
|
},
|
|
},
|
|
|
|
after_place_node = function(pos)
|
|
local nvm = techage.get_nvm(pos)
|
|
M(pos):set_int("outdir", networks.side_to_outdir(pos, "B"))
|
|
Cable:after_place_node(pos)
|
|
M(pos):set_string("formspec", formspec(pos, nvm))
|
|
end,
|
|
after_dig_node = function(pos)
|
|
Cable:after_dig_node(pos)
|
|
techage.del_mem(pos)
|
|
end,
|
|
tubelib2_on_update2 = function(pos, outdir, tlib2, node)
|
|
power.update_network(pos, outdir, tlib2)
|
|
end,
|
|
on_rightclick = function(pos, node, clicker)
|
|
techage.set_activeformspec(pos, clicker)
|
|
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
|
local nvm = techage.get_nvm(pos)
|
|
M(pos):set_string("formspec", formspec(pos, nvm))
|
|
end,
|
|
on_timer = function(pos, elapsed)
|
|
local nvm = techage.get_nvm(pos)
|
|
if techage.is_activeformspec(pos) then
|
|
M(pos):set_string("formspec", formspec(pos, nvm))
|
|
end
|
|
return true
|
|
end,
|
|
|
|
networks = {
|
|
ele1 = {
|
|
sides = {B = 1}, -- Cable connection side
|
|
ntype = "term",
|
|
},
|
|
},
|
|
|
|
paramtype2 = "facedir",
|
|
paramtype = "light",
|
|
on_rotate = screwdriver.disallow,
|
|
sunlight_propagates = true,
|
|
is_ground_content = false,
|
|
groups = {cracky = 2, level = 2},
|
|
sounds = default.node_sound_metal_defaults(),
|
|
})
|
|
|
|
Cable:add_secondary_node_names({"techage:power_terminal"})
|
|
|
|
minetest.register_alias("techage:ta3_power_terminal", "techage:power_terminal")
|
|
|
|
minetest.register_craft({
|
|
output = "techage:power_terminal",
|
|
recipe = {
|
|
{"", "techage:usmium_nuggets", "default:steel_ingot"},
|
|
{"", "techage:basalt_glass_thin", "default:copper_ingot"},
|
|
{"", "techage:vacuum_tube", "default:steel_ingot"},
|
|
},
|
|
}) |