Also use vmanip for level clearing

master
Wuzzy 2022-01-08 21:28:40 +01:00
parent 5f65950bf4
commit f974af7d76
1 changed files with 37 additions and 36 deletions

View File

@ -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