mirror of
https://github.com/Uberi/Minetest-WorldEdit.git
synced 2024-09-27 15:10:17 +02:00
//replace: Addmixed block support
This commit is contained in:
parent
13499b50d3
commit
1c2efd0153
|
@ -134,21 +134,25 @@ Fill the current WorldEdit region with a random mix of `<node1>`, `<node2>`, `..
|
||||||
|
|
||||||
### `//replace <search node> <replace node>`
|
### `//replace <search node> <replace node>`
|
||||||
|
|
||||||
Replace all instances of `<search node>` with `<replace node>` in the current WorldEdit region.
|
Replace all instances of `<search node>` with `<replace node>` in the current WorldEdit region. `<replace_node>` can be in the same format as `//mix`.
|
||||||
|
|
||||||
//replace Cobblestone air
|
//replace Cobblestone air
|
||||||
//replace lightstone_blue glass
|
//replace lightstone_blue glass
|
||||||
//replace dirt Bronze Block
|
//replace dirt Bronze Block
|
||||||
//replace mesecons:wire_00000000_off flowers:flower_tulip
|
//replace mesecons:wire_00000000_off flowers:flower_tulip
|
||||||
|
//replace dirt snowblock 5 ice 2
|
||||||
|
//replace dirt_with_grass sand 10 silver_sand 3 desert_sand
|
||||||
|
|
||||||
### `//replaceinverse <search node> <replace node>`
|
### `//replaceinverse <search node> <replace node>`
|
||||||
|
|
||||||
Replace all nodes other than `<search node>` with `<replace node>` in the current WorldEdit region.
|
Replace all nodes other than `<search node>` with `<replace node>` in the current WorldEdit region. `<replace_node>` can be in the same format as `//mix`.
|
||||||
|
|
||||||
//replaceinverse Cobblestone air
|
//replaceinverse Cobblestone air
|
||||||
//replaceinverse flowers:flower_waterlily glass
|
//replaceinverse flowers:flower_waterlily glass
|
||||||
//replaceinverse dirt Bronze Block
|
//replaceinverse dirt Bronze Block
|
||||||
//replaceinverse mesecons:wire_00000000_off flowers:flower_tulip
|
//replaceinverse mesecons:wire_00000000_off flowers:flower_tulip
|
||||||
|
//replaceinverse dirt snowblock 5 ice 2
|
||||||
|
//replaceinverse dirt_with_grass sand 10 silver_sand 3 desert_sand
|
||||||
|
|
||||||
### `//hollowcube <width> <height> <length> <node>`
|
### `//hollowcube <width> <height> <length> <node>`
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,20 @@ function worldedit.replace(pos1, pos2, search_node, replace_node, inverse)
|
||||||
local data = manip:get_data()
|
local data = manip:get_data()
|
||||||
|
|
||||||
local search_id = minetest.get_content_id(search_node)
|
local search_id = minetest.get_content_id(search_node)
|
||||||
local replace_id = minetest.get_content_id(replace_node)
|
|
||||||
|
local replace_multiple = not (type(replace_node) == "string")
|
||||||
|
local replace_id = nil, id_count, rand
|
||||||
|
|
||||||
|
if not replace_multiple then
|
||||||
|
replace_id = minetest.get_content_id(replace_node)
|
||||||
|
else
|
||||||
|
id_count, rand = #replace_node, math.random
|
||||||
|
replace_id = {}
|
||||||
|
for i, node_name in ipairs(replace_node) do
|
||||||
|
replace_id[i] = minetest.get_content_id(node_name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
local count = 0
|
local count = 0
|
||||||
|
|
||||||
|
@ -82,14 +95,22 @@ function worldedit.replace(pos1, pos2, search_node, replace_node, inverse)
|
||||||
if not inverse then
|
if not inverse then
|
||||||
for i in area:iterp(pos1, pos2) do
|
for i in area:iterp(pos1, pos2) do
|
||||||
if data[i] == search_id then
|
if data[i] == search_id then
|
||||||
|
if not replace_multiple then
|
||||||
data[i] = replace_id
|
data[i] = replace_id
|
||||||
|
else
|
||||||
|
data[i] = replace_id[rand(id_count)]
|
||||||
|
end
|
||||||
count = count + 1
|
count = count + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
for i in area:iterp(pos1, pos2) do
|
for i in area:iterp(pos1, pos2) do
|
||||||
if data[i] ~= search_id then
|
if data[i] ~= search_id then
|
||||||
|
if not replace_multiple then
|
||||||
data[i] = replace_id
|
data[i] = replace_id
|
||||||
|
else
|
||||||
|
data[i] = replace_id[rand(id_count)]
|
||||||
|
end
|
||||||
count = count + 1
|
count = count + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -646,4 +667,3 @@ function worldedit.clear_objects(pos1, pos2)
|
||||||
end
|
end
|
||||||
return count
|
return count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -453,21 +453,35 @@ minetest.register_chatcommand("/mix", {
|
||||||
})
|
})
|
||||||
|
|
||||||
local check_replace = function(name, param)
|
local check_replace = function(name, param)
|
||||||
local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+(.+)$")
|
local search_node = nil
|
||||||
if found == nil then
|
local replace_nodes = {}
|
||||||
worldedit.player_notify(name, "invalid usage: " .. param)
|
for nodename in param:gmatch("[^%s]+") do
|
||||||
|
if search_node == nil then
|
||||||
|
search_node = get_node(name, nodename)
|
||||||
|
else
|
||||||
|
if tonumber(nodename) ~= nil then
|
||||||
|
local last_node = replace_nodes[#replace_nodes]
|
||||||
|
local node_count = tonumber(nodename)
|
||||||
|
minetest.log("action", "last node: " .. last_node .. ", count: " .. node_count)
|
||||||
|
|
||||||
|
for i=1,node_count do
|
||||||
|
replace_nodes[#replace_nodes + 1] = last_node
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local node = get_node(name, nodename)
|
||||||
|
if not node then
|
||||||
|
worldedit.player_notify(name, "invalid replace node name: " .. searchnode)
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
local newsearchnode = worldedit.normalize_nodename(searchnode)
|
replace_nodes[#replace_nodes + 1] = node
|
||||||
if not newsearchnode then
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not search_node then
|
||||||
worldedit.player_notify(name, "invalid search node name: " .. searchnode)
|
worldedit.player_notify(name, "invalid search node name: " .. searchnode)
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
local newreplacenode = worldedit.normalize_nodename(replacenode)
|
|
||||||
if not newreplacenode then
|
|
||||||
worldedit.player_notify(name, "invalid replace node name: " .. replacenode)
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
return check_region(name, param)
|
return check_region(name, param)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -476,11 +490,41 @@ minetest.register_chatcommand("/replace", {
|
||||||
description = "Replace all instances of <search node> with <replace node> in the current WorldEdit region",
|
description = "Replace all instances of <search node> with <replace node> in the current WorldEdit region",
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
func = safe_region(function(name, param)
|
func = safe_region(function(name, param)
|
||||||
local found, _, search_node, replace_node = param:find("^([^%s]+)%s+(.+)$")
|
local search_node = nil
|
||||||
local norm_search_node = worldedit.normalize_nodename(search_node)
|
local replace_nodes = {}
|
||||||
local norm_replace_node = worldedit.normalize_nodename(replace_node)
|
for nodename in param:gmatch("[^%s]+") do
|
||||||
local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name],
|
worldedit.player_notify(name, "Processing "..nodename)
|
||||||
norm_search_node, norm_replace_node)
|
if search_node == nil then
|
||||||
|
search_node = get_node(name, nodename)
|
||||||
|
else
|
||||||
|
if tonumber(nodename) ~= nil then
|
||||||
|
local last_node = replace_nodes[#replace_nodes]
|
||||||
|
local node_count = tonumber(nodename)
|
||||||
|
minetest.log("action", "last node: " .. last_node .. ", count: " .. node_count)
|
||||||
|
|
||||||
|
for i=1,node_count do
|
||||||
|
replace_nodes[#replace_nodes + 1] = last_node
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local node = get_node(name, nodename)
|
||||||
|
if not node then return end
|
||||||
|
replace_nodes[#replace_nodes + 1] = node
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local count
|
||||||
|
if #replace_nodes == 1 then
|
||||||
|
count = worldedit.replace(
|
||||||
|
worldedit.pos1[name], worldedit.pos2[name],
|
||||||
|
search_node, replace_nodes[1]
|
||||||
|
)
|
||||||
|
else
|
||||||
|
count = worldedit.replace(
|
||||||
|
worldedit.pos1[name], worldedit.pos2[name],
|
||||||
|
search_node, replace_nodes
|
||||||
|
)
|
||||||
|
end
|
||||||
worldedit.player_notify(name, count .. " nodes replaced")
|
worldedit.player_notify(name, count .. " nodes replaced")
|
||||||
end, check_replace),
|
end, check_replace),
|
||||||
})
|
})
|
||||||
|
@ -490,11 +534,42 @@ minetest.register_chatcommand("/replaceinverse", {
|
||||||
description = "Replace all nodes other than <search node> with <replace node> in the current WorldEdit region",
|
description = "Replace all nodes other than <search node> with <replace node> in the current WorldEdit region",
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
func = safe_region(function(name, param)
|
func = safe_region(function(name, param)
|
||||||
local found, _, search_node, replace_node = param:find("^([^%s]+)%s+(.+)$")
|
local search_node = nil
|
||||||
local norm_search_node = worldedit.normalize_nodename(search_node)
|
local replace_nodes = {}
|
||||||
local norm_replace_node = worldedit.normalize_nodename(replace_node)
|
for nodename in param:gmatch("[^%s]+") do
|
||||||
local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name],
|
if search_node == nil then
|
||||||
norm_search_node, norm_replace_node, true)
|
search_node = get_node(name, nodename)
|
||||||
|
else
|
||||||
|
if tonumber(nodename) ~= nil then
|
||||||
|
local last_node = replace_nodes[#replace_nodes]
|
||||||
|
local node_count = tonumber(nodename)
|
||||||
|
minetest.log("action", "last node: " .. last_node .. ", count: " .. node_count)
|
||||||
|
|
||||||
|
for i=1,node_count do
|
||||||
|
replace_nodes[#replace_nodes + 1] = last_node
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local node = get_node(name, nodename)
|
||||||
|
if not node then return end
|
||||||
|
replace_nodes[#replace_nodes + 1] = node
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local count
|
||||||
|
if #replace_nodes == 1 then
|
||||||
|
count = worldedit.replace(
|
||||||
|
worldedit.pos1[name], worldedit.pos2[name],
|
||||||
|
search_node, replace_nodes[1],
|
||||||
|
true
|
||||||
|
)
|
||||||
|
else
|
||||||
|
count = worldedit.replace(
|
||||||
|
worldedit.pos1[name], worldedit.pos2[name],
|
||||||
|
search_node, replace_nodes,
|
||||||
|
true
|
||||||
|
)
|
||||||
|
end
|
||||||
worldedit.player_notify(name, count .. " nodes replaced")
|
worldedit.player_notify(name, count .. " nodes replaced")
|
||||||
end, check_replace),
|
end, check_replace),
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue
Block a user