Just make a mod called blockbeam and use this code:
Code: Select all
minetest.register_globalstep(function()
for _, user in ipairs(minetest.get_connected_players()) do
local stack = ItemStack(user:get_wielded_item())
local wielded = stack:get_definition()
if wielded.name == "blockbeam:beam_rod" then
local dir = user:get_look_dir()
local pos = user:get_pos()
for i = 0, 20 do
local new_pos = {
x = pos.x + (dir.x * i),
y = pos.y + 1 + (dir.y * i),
z = pos.z + (dir.z * i),
}
if minetest.get_node(new_pos).name == "air" then
minetest.set_node(new_pos, {name = "blockbeam:block"})
end
end
end
end
end)
minetest.register_node("blockbeam:block", {
drawtype = "glasslike",
tiles = {"blank.png"},
paramtype = "light",
walkable = false,
is_ground_content = true,
light_propagates = true,
sunlight_propagates = true,
light_source = 6,
pointable = false,
buildable_to = true,
on_construct = function(pos)
minetest.after(0.1, function()
minetest.set_node(pos, {name = "air"})
end)
end,
})
minetest.register_tool("blockbeam:rod", {
description = "Beam Rod",
inventory_image = "default_stick.png",
})
minetest.register_lbm({
name = "blockbeam:remove_after_reload",
nodenames = {"blockbeam:block"},
run_at_every_load = true,
action = function(pos, node)
minetest.set_node(pos, {name = "air"})
end,
})
I made a version using line_of_sight but when pointed down it glitches
Use this instead of the other globalstep to see my try at it
Code: Select all
local distance = function(pos1, pos2)
local dx = pos1.x - pos2.x
local dy = pos1.y - pos2.y
local dz = pos1.z - pos2.z
return math.floor( math.sqrt ( dx * dx + dy * dy + dz * dz))
end
minetest.register_globalstep(function()
for _, user in ipairs(minetest.get_connected_players()) do
local stack = ItemStack(user:get_wielded_item())
local wielded = stack:get_definition()
if wielded.name == "blockbeam:beam_rod" then
local dir = user:get_look_dir()
local pos = user:get_pos()
local new_pos1 = {
x = pos.x + (dir.x * 20),
y = pos.y + 1 + (dir.y * 20),
z = pos.z + (dir.z * 20),
}
local a,b = minetest.line_of_sight(pos, new_pos1, 2)
local dist = nil
if b then
dist = distance(pos,b)
elseif b == nil then
dist = nil
end
local range = 20
if dist == nil then
range = 20
elseif dist then
range = dist+1
end
for i = 0, range do
local new_pos2 = {
x = pos.x + (dir.x * i),
y = pos.y + 1 + (dir.y * i),
z = pos.z + (dir.z * i),
}
if minetest.get_node(new_pos2).name == "air" then
minetest.set_node(new_pos2, {name = "blockbeam:block"})
end
end
end
end
end)