techage_modpack/networks/test/test_tool.lua
2023-11-05 13:18:27 +01:00

213 lines
5.7 KiB
Lua

--[[
Networks
========
Copyright (C) 2021 Joachim Stolberg
AGPL v3
See LICENSE.txt for more information
]]--
-- for lazy programmers
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local S2P = minetest.string_to_pos
local M = minetest.get_meta
local power = networks.power
local liquid = networks.liquid
local function round(val)
return math.floor(val + 0.5)
end
local function get_list(tbl, sep)
local keys = {}
for k,v in pairs(tbl) do
if v then
keys[#keys + 1] = k
end
end
return table.concat(keys, sep)
end
local NetwTypes = false
local function collect_netw_types()
NetwTypes = {}
for k,v in pairs(networks.registered_networks.power) do
NetwTypes[k] = "power"
end
for k,v in pairs(networks.registered_networks.liquid) do
NetwTypes[k] = "liquid"
end
end
local function print_sides(pos, api, netw_type)
local t = {}
for _, dir in ipairs(networks.get_node_connection_dirs(pos, netw_type)) do
t[#t + 1]= tubelib2.dir_to_string(dir)
end
print("# " .. api .. " - " .. netw_type .. " dirs: " .. table.concat(t, ", "))
end
local function print_power_network_data(pos, api, netw_type, outdir)
local tlib2 = networks.registered_networks[api][netw_type]
local data = power.get_network_data(pos, tlib2, outdir)
local netw = networks.get_network_table(pos, tlib2, outdir)
if netw then
print(" - Number of network nodes: " .. (netw.num_nodes or 0))
print(" - Number of generators: " .. #(netw.gen or {}))
print(" - Number of consumers: " .. #(netw.con or {}))
print(" - Number of storage systems: " .. #(netw.sto or {}))
end
if data then
local s = string.format(" - Netw %u: generated = %u/%u, consumed = %u, storage load = %u/%u",
data.netw_num, round(data.provided),
data.available, round(data.consumed),
round(data.curr_load), round(data.max_capa))
print(s)
end
end
local function print_liquid_network_data(pos, api, netw_type, outdir)
local tlib2 = networks.registered_networks[api][netw_type]
local netw = networks.get_network_table(pos, tlib2, outdir)
if netw then
print(" - Number of network nodes: " .. (netw.num_nodes or 0))
print(" - Number of pumps: " .. #(netw.pump or {}))
print(" - Number of tanks: " .. #(netw.tank or {}))
end
end
local function is_junction(pos, tlib2)
local ndef = networks.net_def(pos, tlib2.tube_type)
return ndef.ntype == "junc"
end
local function print_netID(pos, api, netw_type)
local tlib2 = networks.registered_networks[api][netw_type]
for _,outdir in ipairs(networks.get_outdirs(pos, tlib2)) do
local netID = networks.get_netID(pos, outdir)
local s = tubelib2.dir_to_string(outdir)
if netID then
print("- " .. s .. ": netwNum for '" .. netw_type .. "': " .. networks.netw_num(netID))
if api == "liquid" then
print_liquid_network_data(pos, api, netw_type, outdir)
elseif api == "power" then
print_power_network_data(pos, api, netw_type, outdir)
end
elseif is_junction(pos, tlib2) then
netID = networks.get_netID(pos, 0)
if netID then
print("- " .. s .. ": Junction netwNum: " .. networks.netw_num(netID))
break
end
else
print("- " .. s .. ": Node has no '" .. netw_type .. "' netID!!!")
end
end
end
local function print_secondary_node(pos, api, netw_type)
local tlib2 = networks.registered_networks[api][netw_type]
if tlib2:is_secondary_node(pos) then
print("- Secondary node: true")
else
print("- Is no secondary node!!!")
end
end
local function print_valid_sides(name, api, netw_type)
local tlib2 = networks.registered_networks[api][netw_type]
local sides = tlib2.valid_node_contact_sides[name]
if sides then
print("- Valid node contact sides: " .. get_list(sides, ", "))
else
print("- Has no valid node contact sides!!!")
end
end
local function print_connected_nodes(pos, api, netw_type)
local tlib2 = networks.registered_networks[api][netw_type]
for outdir = 1,6 do
local destpos, indir = tlib2:get_connected_node_pos(pos, outdir)
if destpos and tlib2:connected(destpos) then
local s1 = tubelib2.dir_to_string(outdir)
local s2 = tubelib2.dir_to_string(indir)
local node = minetest.get_node(destpos)
print("- " .. s1 .. ": Node connected to " .. node.name .. " at " .. P2S(destpos) .. " from " .. s2)
end
end
end
-- debug print of node related data
local function debug_print(pos)
local node = minetest.get_node(pos)
local ndef = minetest.registered_nodes[node.name]
if not NetwTypes then
collect_netw_types()
end
if not ndef.networks then
print("No networks node!!!")
return
end
print("########## " .. node.name .. " ###########")
for netw_type,api in pairs(NetwTypes) do
if ndef.networks[netw_type] then
print_sides(pos, api, netw_type)
print_netID(pos, api, netw_type)
print_secondary_node(pos, api, netw_type)
print_valid_sides(node.name, api, netw_type)
print_connected_nodes(pos, api, netw_type)
end
end
print("#####################")
end
local function on_use(itemstack, placer, pointed_thing)
if pointed_thing.type == "node" then
local pos = pointed_thing.under
networks.register_observe_pos(pos)
if placer:get_player_control().sneak then
debug_print(pos)
else
debug_print(pos)
end
else
networks.register_observe_pos(nil)
end
end
local function on_place(itemstack, placer, pointed_thing)
if pointed_thing.type == "node" then
local pos = pointed_thing.under
networks.register_observe_pos(nil)
if placer:get_player_control().sneak then
debug_print(pos)
else
debug_print(pos)
end
else
networks.register_observe_pos(nil)
end
end
minetest.register_tool("networks:tool2", {
description = "Debugging Tool",
inventory_image = "networks_tool.png",
wield_image = "networks_tool.png",
use_texture_alpha = "clip",
groups = {cracky=1},
on_use = on_use,
on_place = on_place,
node_placement_prediction = "",
stack_max = 1,
})