From 18819cd3d8323629ec4682436962ebb644c22eda Mon Sep 17 00:00:00 2001 From: GreenBlob <88883098+a-blob@users.noreply.github.com> Date: Sat, 29 Jun 2024 12:05:08 -0400 Subject: [PATCH] Use voxel manip for barrier placing commands (#1265) * Use Voxel Manip * Maybe this makes the code cleaner? --------- Co-authored-by: LoneWolfHT --- mods/ctf/ctf_map/init.lua | 69 ++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/mods/ctf/ctf_map/init.lua b/mods/ctf/ctf_map/init.lua index 43b4469aa0..9af7215e35 100644 --- a/mods/ctf/ctf_map/init.lua +++ b/mods/ctf/ctf_map/init.lua @@ -194,56 +194,57 @@ minetest.register_chatcommand("ctf_barrier", { "use /ctf_barrier remove_buildtime to remove unwanted parts")) end + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos1, pos2) + local a = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax + } + local data = vm:get_data() + for x = pos1.x, pos2.x do for y = pos1.y, pos2.y do for z = pos1.z, pos2.z do + local vi = a:index(x, y, z) if params == "place_buildtime" then - local current_pos = {x = x, y = y, z = z} - local current_node = minetest.get_node_or_nil(current_pos) - if current_node then - if current_node.name == "air" then - minetest.set_node(current_pos, {name = "ctf_map:ind_glass_red"}) - elseif current_node.name == "default:stone" then - minetest.set_node(current_pos, {name = "ctf_map:ind_stone_red"}) - elseif current_node.name == "default:water_source" then - minetest.set_node(current_pos, {name = "ctf_map:ind_water"}) - elseif current_node.name == "default:lava_source" then - minetest.set_node(current_pos, {name = "ctf_map:ind_lava"}) - end + if data[vi] == minetest.get_content_id("air") then + data[vi] = minetest.get_content_id("ctf_map:ind_glass_red") + elseif data[vi] == minetest.get_content_id("default:stone") then + data[vi] = minetest.get_content_id("ctf_map:ind_stone_red") + elseif data[vi] == minetest.get_content_id("default:water_source") then + data[vi] = minetest.get_content_id("ctf_map:ind_water") + elseif data[vi] == minetest.get_content_id("default:lava_source") then + data[vi] = minetest.get_content_id("ctf_map:ind_lava") end elseif params == "remove_buildtime" then - local current_pos = {x = x, y = y, z = z} - local current_node = minetest.get_node_or_nil(current_pos) - if current_node then - if current_node.name == "ctf_map:ind_glass_red" then - minetest.set_node(current_pos, {name = "air"}) - elseif current_node.name == "ctf_map:ind_stone_red" then - minetest.set_node(current_pos, {name = "default:stone"}) - elseif current_node.name == "ctf_map:ind_water" then - minetest.set_node(current_pos, {name = "default:water_source"}) - elseif current_node.name == "ctf_map:ind_lava" then - minetest.set_node(current_pos, {name = "default:lava_source"}) - end + if data[vi] == minetest.get_content_id("ctf_map:ind_glass_red") then + data[vi] = minetest.get_content_id("air") + elseif data[vi] == minetest.get_content_id("ctf_map:ind_stone_red") then + data[vi] = minetest.get_content_id("default:stone") + elseif data[vi] == minetest.get_content_id("ctf_map:ind_water") then + data[vi] = minetest.get_content_id("default:water_source") + elseif data[vi] == minetest.get_content_id("ctf_map:ind_lava") then + data[vi] = minetest.get_content_id("default:lava_source") end elseif params == "place_outer" then - local current_pos = {x = x, y = y, z = z} if x == pos1.x or x == pos2.x or y == pos1.y or z == pos1.z or z == pos2.z then - local current_node = minetest.get_node_or_nil(current_pos) - if current_node then - if current_node.name == "air" or - current_node.name == "ctf_map:ignore" or - current_node.name == "ignore" then - minetest.set_node(current_pos, {name = "ctf_map:ind_glass"}) - else - minetest.set_node(current_pos, {name = "ctf_map:stone"}) - end + if data[vi] == minetest.get_content_id("air") or + data[vi] == minetest.get_content_id("ignore") or + data[vi] == minetest.get_content_id("ctf_map:ignore") then + data[vi] = minetest.get_content_id("ctf_map:ind_glass") + else + data[vi] = minetest.get_content_id("ctf_map:stone") end end end end end end + + vm:set_data(data) + vm:write_to_map(true) + local message = (params == "place_buildtime" and "Build-time barrier placed") or (params == "remove_buildtime" and "Build-time barrier removed") or