Also use vmanip for level clearing
parent
5f65950bf4
commit
f974af7d76
|
@ -105,11 +105,13 @@ function lzr_laser.add_laser(pos, dir, varea, vdata)
|
||||||
if detected then
|
if detected then
|
||||||
local def = minetest.registered_nodes[nodename]
|
local def = minetest.registered_nodes[nodename]
|
||||||
local active = def._lzr_active
|
local active = def._lzr_active
|
||||||
-- Activate node
|
if active then
|
||||||
vdata[vi] = minetest.get_content_id(active)
|
-- Activate node
|
||||||
local done = lzr_laser.check_detectors_in_area(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_END)
|
vdata[vi] = minetest.get_content_id(active)
|
||||||
if done then
|
local done = lzr_laser.check_detectors_in_area(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_END)
|
||||||
lzr_levels.next_level()
|
if done then
|
||||||
|
lzr_levels.next_level()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Laser ends here
|
-- Laser ends here
|
||||||
|
@ -164,37 +166,30 @@ function lzr_laser.travel_laser(pos, dir, varea, vdata)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Remove all lasers in area and disable all laser blocks
|
-- Remove all lasers in area and disable all laser blocks
|
||||||
function lzr_laser.clear_lasers_in_area(pos1, pos2, ignore_emitters)
|
function lzr_laser.clear_lasers_in_area(pos1, pos2, ignore_emitters, varea, vdata)
|
||||||
-- Remove lasers
|
for vi=1, #vdata do
|
||||||
local lasers = minetest.find_nodes_in_area(pos1, pos2, {"group:laser"})
|
local cid = vdata[vi]
|
||||||
minetest.bulk_set_node(lasers, {name="air"})
|
local nodename = minetest.get_name_from_content_id(cid)
|
||||||
|
if minetest.get_item_group(nodename, "laser") ~= 0 then
|
||||||
-- Disable laser blocks (mirror, etc.)
|
vdata[vi] = minetest.CONTENT_AIR
|
||||||
local laser_blocks = minetest.find_nodes_in_area(pos1, pos2, {"group:laser_block"})
|
elseif minetest.get_item_group(nodename, "laser_block") ~= 0 then
|
||||||
for b=1, #laser_blocks do
|
local def = minetest.registered_nodes[nodename]
|
||||||
local block_pos = laser_blocks[b]
|
local is_ignored_emitter = false
|
||||||
local block = minetest.get_node(block_pos)
|
if ignore_emitters ~= true then
|
||||||
local def = minetest.registered_nodes[block.name]
|
is_ignored_emitter = minetest.get_item_group(nodename, "emitter") > 0
|
||||||
local is_ignored_emitter = false
|
end
|
||||||
if ignore_emitters ~= true then
|
if def and not is_ignored_emitter then
|
||||||
is_ignored_emitter = minetest.get_item_group(block.name, "emitter") > 0
|
local inactive = def._lzr_inactive
|
||||||
end
|
if inactive then
|
||||||
if def and not is_ignored_emitter then
|
vdata[vi] = minetest.get_content_id(inactive)
|
||||||
local inactive = def._lzr_inactive
|
end
|
||||||
if inactive then
|
|
||||||
minetest.set_node(block_pos, {name=inactive, param2=block.param2})
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Emit lasers from all active emitters
|
-- Emit lasers from all active emitters
|
||||||
function lzr_laser.emit_lasers_in_area(pos1, pos2)
|
function lzr_laser.emit_lasers_in_area(pos1, pos2, varea, vdata, vdata_p2)
|
||||||
local vmanip = minetest.get_voxel_manip(pos1, pos2)
|
|
||||||
local vpos1, vpos2 = vmanip:get_emerged_area()
|
|
||||||
local varea = VoxelArea:new({MinEdge = vpos1, MaxEdge = vpos2})
|
|
||||||
local vdata = vmanip:get_data()
|
|
||||||
local vdata_p2 = vmanip:get_param2_data()
|
|
||||||
local emitters = minetest.find_nodes_in_area(pos1, pos2, {"group:emitter"})
|
local emitters = minetest.find_nodes_in_area(pos1, pos2, {"group:emitter"})
|
||||||
for e=1, #emitters do
|
for e=1, #emitters do
|
||||||
local epos = emitters[e]
|
local epos = emitters[e]
|
||||||
|
@ -206,10 +201,6 @@ function lzr_laser.emit_lasers_in_area(pos1, pos2)
|
||||||
lzr_laser.emit_laser(emitters[e], varea, vdata, vdata_p2)
|
lzr_laser.emit_laser(emitters[e], varea, vdata, vdata_p2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
vmanip:set_data(vdata)
|
|
||||||
vmanip:set_param2_data(vdata_p2)
|
|
||||||
vmanip:write_to_map()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Return true if all detectors in area are on (including if no detector)
|
-- Return true if all detectors in area are on (including if no detector)
|
||||||
|
@ -228,6 +219,16 @@ end
|
||||||
|
|
||||||
-- Completely recalculate all lasers
|
-- Completely recalculate all lasers
|
||||||
function lzr_laser.full_laser_update(pos1, pos2)
|
function lzr_laser.full_laser_update(pos1, pos2)
|
||||||
lzr_laser.clear_lasers_in_area(pos1, pos2)
|
local vmanip = minetest.get_voxel_manip(pos1, pos2)
|
||||||
lzr_laser.emit_lasers_in_area(pos1, pos2)
|
local vpos1, vpos2 = vmanip:get_emerged_area()
|
||||||
|
local varea = VoxelArea:new({MinEdge = vpos1, MaxEdge = vpos2})
|
||||||
|
local vdata = vmanip:get_data()
|
||||||
|
local vdata_p2 = vmanip:get_param2_data()
|
||||||
|
|
||||||
|
lzr_laser.clear_lasers_in_area(pos1, pos2, nil, varea, vdata)
|
||||||
|
lzr_laser.emit_lasers_in_area(pos1, pos2, varea, vdata, vdata_p2)
|
||||||
|
|
||||||
|
vmanip:set_data(vdata)
|
||||||
|
vmanip:set_param2_data(vdata_p2)
|
||||||
|
vmanip:write_to_map()
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue