ldm32/init.lua

165 lines
5.5 KiB
Lua
Raw Permalink Normal View History

laser_range = 32
local laser_on = function(pos, facedir_param2, range)
local meta = minetest.get_meta(pos)
local block_pos = vector.new(pos)
local beam_pos = vector.new(pos)
local beam_direction = minetest.facedir_to_dir(facedir_param2)
for i = 1, range + 1, 1 do
beam_pos = vector.add(block_pos, vector.multiply(beam_direction, i))
if minetest.get_node(beam_pos).name == "air" or minetest.get_node(beam_pos).name == "ldm32:laser_beam" then
if i <= range then
minetest.set_node(beam_pos, {name = "ldm32:laser_beam", param2 = facedir_param2})
meta:set_string("infotext", "Distance: " .. tostring(i) .. "m")
meta:set_int("range", i)
else
meta:set_string("infotext", "Distance: out of range")
meta:set_int("range", laser_range)
end
else
break
end
end
end
local laser_off = function(pos, facedir_param2, range)
local meta = minetest.get_meta(pos)
local block_pos = vector.new(pos)
local beam_pos = vector.new(pos)
local beam_direction = minetest.facedir_to_dir(facedir_param2)
for i = range, 0, -1 do
beam_pos = vector.add(block_pos, vector.multiply(beam_direction, i))
if minetest.get_node(beam_pos).name == "ldm32:laser_beam" and minetest.get_node(beam_pos).param2 == facedir_param2 then
minetest.set_node(beam_pos, {name="air"})
end
end
end
local laser_check = function(pos, facedir_param2, range)
local block_pos = vector.new(pos)
local beam_pos = vector.new(pos)
local beam_direction = minetest.facedir_to_dir(facedir_param2)
local is_not_beam = false
for i = 1, range + 1, 1 do
beam_pos = vector.add(block_pos, vector.multiply(beam_direction, i))
if minetest.get_node(beam_pos).name ~= "ldm32:laser_beam" and i <= range then
is_not_beam = true
elseif minetest.get_node(beam_pos).name == "air" and i <= laser_range then
is_not_beam = true
end
end
return is_not_beam
end
minetest.register_node("ldm32:casing", {
description = "Laser Distance Meter",
inventory_image = "ldm32_inventory.png",
drawtype = "mesh",
mesh = "ldm32_casing.obj",
tiles = {"ldm32_casing2.png",
"ldm32_casing.png",},
selection_box = {
type = "fixed",
fixed = {{-0.07, -0.5, -0.5, 0.07, -0.25, 0.5},}
},
collision_box = {
type = "fixed",
fixed = {{-0.07, -0.5, -0.5, 0.07, -0.25, 0.5},}
},
stack_max = 1,
is_ground_content = true,
paramtype2 = "facedir",
groups = {snappy = 3, dig_immediate = 3},
on_place = minetest.rotate_node,
on_timer = function(pos)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local timer = minetest.get_node_timer(pos)
local is_not_beam = false
local is_air = false
if meta:get_string("is_on") == "true" then
if laser_check(pos, node.param2, meta:get_int("range")) then
laser_off(pos, node.param2, meta:get_int("range"))
laser_on(pos, node.param2, laser_range)
end
if meta:get_int("facedir") ~= node.param2 and meta:get_string("is_on") then
laser_off(pos, meta:get_int("facedir"), laser_range)
laser_on(pos, node.param2, laser_range)
meta:set_int("facedir", node.param2)
end
end
timer:start(1)
end,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
meta:set_string("infotext","Off")
meta:set_string("is_on", "false")
meta:set_int("facedir", node.param2)
end,
after_destruct = function(pos, oldnode, oldmetadata)
local meta = minetest.get_meta(pos)
laser_off(pos, oldnode.param2, laser_range)
meta:set_string("infotext", "Off")
meta:set_string("is_on", "false")
end,
after_dig_node = function(pos, oldnode)
local meta = minetest.get_meta(pos)
laser_off(pos, oldnode.param2, laser_range)
meta:set_string("infotext", "Off")
meta:set_string("is_on", "false")
end,
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local timer = minetest.get_node_timer(pos)
if meta:get_string("is_on") == "false" then
laser_on(pos, node.param2, laser_range)
meta:set_string("is_on", "true")
timer:start(1)
else
laser_off(pos, node.param2, meta:get_int("range"))
meta:set_string("infotext", "Off")
meta:set_string("is_on", "false")
timer:stop()
end
end,
})
minetest.register_node("ldm32:laser_beam", {
description = "Laser Beam",
drawtype = "mesh",
mesh = "ldm32_laser_beam.obj",
tiles = {"ldm32_beam.png"},
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = true,
--alpha = 0,
light_source = 4,
post_effect_color = {r=128,g=64,b=64, a=128},
sunlight_propagates = true,
walkable = false,
pointable = false,
diggable = false,
buildable_to = true,
})
minetest.register_craft({
--type = "sharpless",
output = "ldm32:casing",
recipe = {
{"group:wood","dye:grey","default:mese_crystal"},
{"default:steel_ingot","default:steel_ingot","default:steel_ingot"}
}
})