179 lines
5.7 KiB
Lua
179 lines
5.7 KiB
Lua
--[[
|
|
|
|
TechAge
|
|
=======
|
|
|
|
Copyright (C) 2019 Joachim Stolberg
|
|
|
|
GPL v3
|
|
See LICENSE.txt for more information
|
|
|
|
TA3 Power Terminal
|
|
|
|
]]--
|
|
|
|
-- for lazy programmers
|
|
local P2P = 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 PWR_CAPA = 0.1
|
|
local COUNTDOWN = 5
|
|
|
|
local Cable = techage.ElectricCable
|
|
local power = techage.power
|
|
|
|
local function collect_network_data(pos, mem)
|
|
local data = {
|
|
fuel = {},
|
|
wind = {},
|
|
solar = {},
|
|
akku = {},
|
|
stor = {},
|
|
elec = {},
|
|
fcel = {},
|
|
other = {},
|
|
}
|
|
local add = function(tbl, mem, nomi, real)
|
|
tbl.num = (tbl.num or 0) + 1
|
|
tbl.load = (tbl.load or 0) + (((mem.pwr_node_alive_cnt or 0) > 0) and 1 or 0)
|
|
tbl.nomi = (tbl.nomi or 0) + (nomi or 0)
|
|
tbl.real = (tbl.real or 0) + (((mem.pwr_node_alive_cnt or 0) > 0) and (real or 0) or 0)
|
|
end
|
|
|
|
local nnodes = techage.power.limited_connection_walk(pos,
|
|
function(pos, node, mem, num_hops, num_nodes)
|
|
if node.name == "techage:generator" or node.name == "techage:generator_on" then
|
|
add(data.fuel, mem, mem.pwr_available, mem.provided)
|
|
elseif node.name == "techage:ta3_akku" then
|
|
add(data.akku, mem, mem.pwr_could_provide, mem.delivered)
|
|
elseif node.name == "techage:heatexchanger1" then
|
|
add(data.stor, mem, mem.pwr_could_provide, mem.delivered)
|
|
elseif node.name == "techage:tiny_generator" or node.name == "techage:tiny_generator_on" then
|
|
add(data.fuel, mem, mem.pwr_available, mem.provided)
|
|
elseif node.name == "techage:ta4_solar_inverter" then
|
|
add(data.solar, mem, mem.pwr_available, mem.delivered)
|
|
elseif node.name == "techage:ta4_wind_turbine" then
|
|
add(data.wind, mem, mem.pwr_available, mem.delivered)
|
|
elseif node.name == "techage:ta4_fuelcell" or node.name == "techage:ta4_fuelcell_on" then
|
|
add(data.fcel, mem, mem.pwr_available, mem.provided)
|
|
elseif node.name == "techage:ta4_electrolyzer" or node.name == "techage:ta4_electrolyzer_on" then
|
|
add(data.elec, mem, -(mem.pwr_could_need or 0), -(mem.consumed or 0))
|
|
elseif mem.pwr_needed and mem.pwr_needed > 0 and (mem.pwr_node_alive_cnt or 0) > 0 then
|
|
add(data.other, mem, -(mem.pwr_needed or 0), (-mem.pwr_needed or 0))
|
|
end
|
|
end
|
|
)
|
|
return data, nnodes
|
|
end
|
|
|
|
local function formspec(pos, mem)
|
|
local data, nnodes = collect_network_data(pos, mem)
|
|
local get = function(kind)
|
|
return (data[kind].load or 0).." / "..(data[kind].num or 0).." : "..
|
|
(data[kind].curr or 0).." / "..(data[kind].nomi or 0).. " ku"
|
|
end
|
|
|
|
local alarm = ""
|
|
if nnodes > (techage.MAX_NUM_NODES - 50) then
|
|
alarm = " (max. "..(techage.MAX_NUM_NODES).." !!!)"
|
|
end
|
|
local update = mem.countdown > 0 and mem.countdown or S("Update")
|
|
return "size[9.5,8.2]"..
|
|
default.gui_bg..
|
|
default.gui_bg_img..
|
|
default.gui_slots..
|
|
"label[2,0.0;"..S("Network Data").."]"..
|
|
"label[1,0.7;"..S("(Num. nodes loaded / max. : Power current / max.)").."]"..
|
|
"label[0,1.4;"..S("TA3 Coal/oil")..":]".. "label[5,1.4;"..get("fuel").."]"..
|
|
"label[0,2.1;"..S("TA3 Akku")..":]".. "label[5,2.1;"..get("akku").."]"..
|
|
"label[0,2.8;"..S("TA4 Solar Inverter")..":]".. "label[5,2.8;"..get("solar").."]"..
|
|
"label[0,3.5;"..S("TA4 Wind Turbine")..":]".. "label[5,3.5;"..get("wind").."]"..
|
|
"label[0,4.2;"..S("TA4 Energy Storage")..":]".. "label[5,4.2;"..get("stor").."]"..
|
|
"label[0,4.9;"..S("TA4 Electrolyzer")..":]".. "label[5,4.9;"..get("elec").."]"..
|
|
"label[0,5.6;"..S("TA4 Fuel Cell")..":]".. "label[5,5.6;"..get("fcel").."]"..
|
|
"label[0,6.3;"..S("Other consumers")..":]".. "label[5,6.3;"..get("other").."]"..
|
|
"label[0,7;"..S("Number of nodes").." : "..nnodes..alarm.."]"..
|
|
"button[3.5,7.5;2,1;update;"..update.."]"
|
|
end
|
|
|
|
local function node_timer(pos, elapsed)
|
|
local mem = tubelib2.get_mem(pos)
|
|
power.generator_alive(pos, mem)
|
|
|
|
mem.countdown = mem.countdown or 0
|
|
if mem.countdown > 0 then
|
|
mem.countdown = mem.countdown - 1
|
|
M(pos):set_string("formspec", formspec(pos, mem))
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
minetest.register_node("techage:ta3_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},
|
|
},
|
|
},
|
|
|
|
on_receive_fields = function(pos, formname, fields, player)
|
|
local mem = tubelib2.get_mem(pos)
|
|
mem.countdown = COUNTDOWN
|
|
end,
|
|
|
|
on_rightclick = function(pos, node, clicker)
|
|
local mem = tubelib2.get_mem(pos)
|
|
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
|
power.generator_start(pos, mem, PWR_CAPA)
|
|
mem.countdown = COUNTDOWN
|
|
end,
|
|
|
|
on_timer = node_timer,
|
|
paramtype2 = "facedir",
|
|
paramtype = "light",
|
|
on_rotate = screwdriver.disallow,
|
|
sunlight_propagates = true,
|
|
is_ground_content = false,
|
|
groups = {cracky = 1, level = 2},
|
|
sounds = default.node_sound_metal_defaults(),
|
|
})
|
|
|
|
techage.power.register_node({"techage:ta3_power_terminal"}, {
|
|
power_network = Cable,
|
|
conn_sides = {"B"},
|
|
after_place_node = function(pos)
|
|
local mem = tubelib2.init_mem(pos)
|
|
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
|
power.generator_start(pos, mem, PWR_CAPA)
|
|
local meta = M(pos)
|
|
mem.countdown = 0
|
|
meta:set_string("formspec", formspec(pos, mem))
|
|
end,
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = "techage:ta3_power_terminal",
|
|
recipe = {
|
|
{"", "techage:usmium_nuggets", "default:steel_ingot"},
|
|
{"", "techage:basalt_glass_thin", "default:copper_ingot"},
|
|
{"", "techage:vacuum_tube", "default:steel_ingot"},
|
|
},
|
|
})
|
|
|