diff --git a/Chat Commands.md b/Chat Commands.md index 23920a4..9e9ccae 100644 --- a/Chat Commands.md +++ b/Chat Commands.md @@ -51,13 +51,22 @@ Set the current WorldEdit region to . ### //replace -Replace all instances of with in the current WorldEdit region. +Replace all instances of with in the current WorldEdit region. //replace cobble stone //replace default:steelblock glass //replace dirt flowers:flower_waterlily //replace flowers:flower_rose flowers:flower_tulip +### //replaceinverse + +Replace all nodes other than with in the current WorldEdit region. + + //replaceinverse air stone + //replaceinverse water_source default:dirt + //replaceinverse mesecons:mesecon air + //replaceinverse default:steelblock default:glass + ### //hollowsphere Add hollow sphere at WorldEdit position 1 with radius , composed of . diff --git a/WorldEdit API.md b/WorldEdit API.md index 0b383ed..e033150 100644 --- a/WorldEdit API.md +++ b/WorldEdit API.md @@ -20,6 +20,12 @@ Replaces all instances of `searchnode` with `replacenode` in a region defined by Returns the number of nodes replaced. +### count = worldedit.replaceinverse(pos1, pos2, searchnode, replacenode) + +Replaces all nodes other than `searchnode` with `replacenode` in a region defined by positions `pos1` and `pos2`. + +Returns the number of nodes replaced. + ### count = worldedit.copy(pos1, pos2, axis, amount) Copies the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes. diff --git a/worldedit/manipulations.lua b/worldedit/manipulations.lua index 253456c..c6bb9dd 100644 --- a/worldedit/manipulations.lua +++ b/worldedit/manipulations.lua @@ -74,6 +74,37 @@ worldedit.replace = function(pos1, pos2, searchnode, replacenode) return count end +--replaces all nodes other than `searchnode` with `replacenode` in a region defined by positions `pos1` and `pos2`, returning the number of nodes replaced +worldedit.replaceinverse = function(pos1, pos2, searchnode, replacenode) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local env = minetest.env + + if minetest.registered_nodes[searchnode] == nil then + searchnode = "default:" .. searchnode + end + + local pos = {x=pos1.x, y=0, z=0} + local node = {name=replacenode} + local count = 0 + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local name = env:get_node(pos).name + if name ~= "ignore" and name ~= searchnode then + env:add_node(pos, node) + count = count + 1 + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return count +end + --copies the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes, returning the number of nodes copied worldedit.copy = function(pos1, pos2, axis, amount) local pos1, pos2 = worldedit.sort_pos(pos1, pos2) @@ -383,4 +414,4 @@ worldedit.fixlight = function(pos1, pos2) pos.x = pos.x + 1 end return count -end +end diff --git a/worldedit_commands/init.lua b/worldedit_commands/init.lua index a2e6246..b568da3 100644 --- a/worldedit_commands/init.lua +++ b/worldedit_commands/init.lua @@ -197,9 +197,9 @@ minetest.register_chatcommand("/replace", { end, }) -minetest.register_chatcommand("/homogenize", { - params = "", - description = "Replace all non-air nodes with in the current WorldEdit region", +minetest.register_chatcommand("/replaceinverse", { + params = " ", + description = "Replace all nodes other than with in the current WorldEdit region", privs = {worldedit=true}, func = function(name, param) local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] @@ -208,13 +208,22 @@ minetest.register_chatcommand("/homogenize", { return end - if not worldedit.node_is_valid(param) then - minetest.chat_send_player(name, "Invalid node name: " .. param) + local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+([^%s]+)$") + if found == nil then + minetest.chat_send_player(name, "Invalid usage: " .. param) + return + end + if not worldedit.node_is_valid(searchnode) then + minetest.chat_send_player(name, "Invalid search node name: " .. searchnode) + return + end + if not worldedit.node_is_valid(replacenode) then + minetest.chat_send_player(name, "Invalid replace node name: " .. replacenode) return end - local count = worldedit.homogenize(pos1, pos2, param) - minetest.chat_send_player(name, count .. " nodes homogenized") + local count = worldedit.replaceinverse(pos1, pos2, searchnode, replacenode) + minetest.chat_send_player(name, count .. " nodes replaced") end, })