From 3bee33f6bbe37b16c4602a329a47666f2e5a559d Mon Sep 17 00:00:00 2001 From: BuckarooBanzay Date: Sat, 24 Jun 2023 12:27:40 +0200 Subject: [PATCH] removal mode --- init.lua | 1 + place_tool.lua | 26 +++++++++++++++++++++---- readme.md | 2 ++ remove.lua | 31 ++++++++++++++++++++++++++++++ textures/pick_and_place_minus.png | Bin 0 -> 5583 bytes 5 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 remove.lua create mode 100644 textures/pick_and_place_minus.png diff --git a/init.lua b/init.lua index 9f7da01..f0a0d60 100644 --- a/init.lua +++ b/init.lua @@ -5,6 +5,7 @@ local MP = minetest.get_modpath("pick_and_place") dofile(MP .. "/common.lua") dofile(MP .. "/pointed.lua") dofile(MP .. "/configure.lua") +dofile(MP .. "/remove.lua") dofile(MP .. "/serialize.lua") dofile(MP .. "/entity.lua") dofile(MP .. "/handle_node.lua") diff --git a/place_tool.lua b/place_tool.lua index df47b13..d034968 100644 --- a/place_tool.lua +++ b/place_tool.lua @@ -7,19 +7,31 @@ minetest.register_tool("pick_and_place:place", { not_in_creative_inventory = 1 }, on_use = function(itemstack, player) + local playername = player:get_player_name() + local controls = player:get_player_control() + local meta = itemstack:get_meta() local schematic = meta:get_string("schematic") local size = minetest.string_to_pos(meta:get_string("size")) local distance = vector.distance(vector.new(), size) local pos1 = pick_and_place.get_pointed_position(player, math.max(10, distance) + 5) - local success, msg = pick_and_place.deserialize(pos1, schematic) - if not success then - minetest.chat_send_player(player:get_player_name(), "Placement error: " .. msg) + local pos2 = vector.add(pos1, vector.subtract(size, 1)) + + if controls.aux1 then + -- removal + pick_and_place.remove_area(pos1, pos2) + else + -- placement + local success, msg = pick_and_place.deserialize(pos1, schematic) + if not success then + minetest.chat_send_player(playername, "Placement error: " .. msg) + end end end, on_step = function(itemstack, player) local playername = player:get_player_name() + local controls = player:get_player_control() local meta = itemstack:get_meta() local size = minetest.string_to_pos(meta:get_string("size")) @@ -28,7 +40,13 @@ minetest.register_tool("pick_and_place:place", { local pos1 = pick_and_place.get_pointed_position(player, math.max(10, distance) + 5) local pos2 = vector.add(pos1, vector.subtract(size, 1)) - pick_and_place.show_preview(playername, "pick_and_place_plus.png", "#0000ff", pos1, pos2) + if controls.aux1 then + -- removal preview + pick_and_place.show_preview(playername, "pick_and_place_minus.png", "#ff0000", pos1, pos2) + else + -- build preview + pick_and_place.show_preview(playername, "pick_and_place_plus.png", "#0000ff", pos1, pos2) + end end, on_deselect = function(_, player) local playername = player:get_player_name() diff --git a/readme.md b/readme.md index bf9aa04..7283265 100644 --- a/readme.md +++ b/readme.md @@ -22,6 +22,8 @@ Simple copy+paste operation * This will convert the pick-tool to a blue `pick_and_place:place` tool in your inventory * Use the place-tool to place your build anywhere in the world with the help of the preview-overlay +**Pro-tip**: hold the `aux` key to switch to removal-mode + ## Configure a template area Create a template for frequent reuse diff --git a/remove.lua b/remove.lua new file mode 100644 index 0000000..22ac94b --- /dev/null +++ b/remove.lua @@ -0,0 +1,31 @@ +local air_cid = minetest.get_content_id("air") + +function pick_and_place.remove_area(pos1, pos2) + local manip = minetest.get_voxel_manip() + local e1, e2 = manip:read_from_map(pos1, pos2) + local area = VoxelArea:new({MinEdge=e1, MaxEdge=e2}) + + local node_data = manip:get_data() + local param2 = manip:get_param2_data() + + for z=pos1.z,pos2.z do + for x=pos1.x,pos2.x do + for y=pos1.y,pos2.y do + local i = area:index(x,y,z) + node_data[i] = air_cid + param2[i] = 0 + end + end + end + + manip:set_data(node_data) + manip:set_param2_data(param2) + manip:write_to_map() + + -- clear metadata + local nodes_with_meta = minetest.find_nodes_with_meta(pos1, pos2) + for _, pos in ipairs(nodes_with_meta) do + local meta = minetest.get_meta(pos) + meta:from_table({}) + end +end \ No newline at end of file diff --git a/textures/pick_and_place_minus.png b/textures/pick_and_place_minus.png new file mode 100644 index 0000000000000000000000000000000000000000..6018b30844d29bf87ca45b72987b233e8f523675 GIT binary patch literal 5583 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 D?~45D literal 0 HcmV?d00001