diff options
| -rw-r--r-- | Chat Commands.md | 11 | ||||
| -rw-r--r-- | WorldEdit API.md | 6 | ||||
| -rw-r--r-- | worldedit/manipulations.lua | 33 | ||||
| -rw-r--r-- | worldedit_commands/init.lua | 23 | 
4 files changed, 64 insertions, 9 deletions
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 <node>.  ### //replace <search node> <replace node>
 -Replace all instances of <search node> with <place node> in the current WorldEdit region.
 +Replace all instances of <search node> with <replace node> 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 <search node> <replace node>
 +
 +Replace all nodes other than <search node> with <replace node> in the current WorldEdit region.
 +
 +    //replaceinverse air stone
 +    //replaceinverse water_source default:dirt
 +    //replaceinverse mesecons:mesecon air
 +    //replaceinverse default:steelblock default:glass
 +
  ### //hollowsphere <radius> <node>
  Add hollow sphere at WorldEdit position 1 with radius <radius>, composed of <node>.
 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 = "<node>",
 -	description = "Replace all non-air nodes with <node> in the current WorldEdit region",
 +minetest.register_chatcommand("/replaceinverse", {
 +	params = "<search node> <replace node>",
 +	description = "Replace all nodes other than <search node> with <replace node> 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,
  })
  | 
