local function addvec(p1, p2)
return {
x = p1.x + p2.x,
y = p1.y + p2.y,
z = p1.z + p2.z,
}
end
local function subvec(p1, p2)
return {
x = p1.x - p2.x,
y = p1.y - p2.y,
z = p1.z - p2.z,
}
end
local p2s = minetest.pos_to_string
local function get_light_banks(n)
local nn = n.name
if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].paramtype == 'light' then
local lightday = n.param1 % 16
local lightnight = (n.param1 - lightday) / 16
local light_source = minetest.registered_nodes[nn].light_source
if light_source and lightday < light_source then
lightday = light_source
end
if light_source and lightnight < light_source then
lightnight = light_source
end
return lightday, lightnight
else
return nil, nil
end
end
local function lightcheck(pos, dir, playername)
local topdir = {x=0, y=1, z=0}
local frontdir = {x=-1, y=0, z=0}
if dir.y == 0 then
frontdir = dir
end
local leftdir = {x=frontdir.z, y=0, z=-frontdir.x}
local nodes_to_check = {
{prefix="self: ", pos=pos},
{prefix="top: ", pos=addvec(pos, topdir)},
{prefix="bottom: ", pos=subvec(pos, topdir)},
{prefix="front: ", pos=addvec(pos, frontdir)},
{prefix="back: ", pos=subvec(pos, frontdir)},
{prefix="left: ", pos=addvec(pos, leftdir)},
{prefix="right: ", pos=subvec(pos, leftdir)},
}
minetest.chat_send_player(playername, 'Light check at '..p2s(pos))
for _, node_to_check in ipairs(nodes_to_check) do
local n = minetest.get_node(node_to_check.pos)
local light = 'undefined'
local lightday, lightnight = get_light_banks(n)
if lightday ~= nil or lightnight ~= nil then
light = 'day='..tostring(lightday)..' night='..tostring(lightnight)
end
msg = node_to_check.prefix..p2s(node_to_check.pos)..' ('..n.name..'): '..light
minetest.chat_send_player(playername, msg, false)
end
end
minetest.register_craftitem("lightcheck:lightcheck", {
description = "Light checker",
inventory_image = "lightcheck.png",
liquids_pointable = true,
on_use = function(itemstack, user, pointed)
playername = user:get_player_name()
if pointed.type == 'node' and playername and playername ~= "" then
local frontdir = {
x = pointed.above.x - pointed.under.x,
y = pointed.above.y - pointed.under.y,
z = pointed.above.z - pointed.under.z,
}
lightcheck(pointed.under, subvec(pointed.above, pointed.under), playername)
end
end
})