diff options
| -rw-r--r-- | worldedit/serialization.lua | 55 | ||||
| -rw-r--r-- | worldedit_commands/init.lua | 7 | 
2 files changed, 60 insertions, 2 deletions
diff --git a/worldedit/serialization.lua b/worldedit/serialization.lua index a8e2aa8..8e49231 100644 --- a/worldedit/serialization.lua +++ b/worldedit/serialization.lua @@ -97,6 +97,58 @@ worldedit.deserialize = function(originpos, value)  	return count
  end
 +--determines the volume the nodes represented by string `value` would occupy if deserialized at `originpos`, returning the two corner positions and the number of nodes
 +--based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) by ChillCode, available under the MIT license (GPL compatible)
 +worldedit.allocate_old = function(originpos, value)
 +	--obtain the node table
 +	local count = 0
 +	local get_tables = loadstring(value)
 +	if get_tables == nil then --error loading value
 +		return count
 +	end
 +	local tables = get_tables()
 +
 +	--transform the node table into an array of nodes
 +	for i = 1, #tables do
 +		for j, v in pairs(tables[i]) do
 +			if type(v) == "table" then
 +				tables[i][j] = tables[v[1]]
 +			end
 +		end
 +	end
 +
 +	local huge = math.huge
 +	local pos1 = {x=huge, y=huge, z=huge}
 +	local pos2 = {x=-huge, y=-huge, z=-huge}
 +	local originx, originy, originz = originpos.x, originpos.y, originpos.z
 +
 +	--load the node array
 +	for i, v in ipairs(tables[1]) do
 +		local pos = v[1]
 +		local x, y, z = originx - pos.x, originy - pos.y, originz - pos.z
 +		if x < pos1.x then
 +			pos1.x = x
 +		end
 +		if y < pos1.y then
 +			pos1.y = y
 +		end
 +		if z < pos1.z then
 +			pos1.z = z
 +		end
 +		if x > pos2.x then
 +			pos2.x = x
 +		end
 +		if y > pos2.y then
 +			pos2.y = y
 +		end
 +		if z > pos2.z then
 +			pos2.z = z
 +		end
 +		count = count + 1
 +	end
 +	return pos1, pos2, count
 +end
 +
  --loads the nodes represented by string `value` at position `originpos`, returning the number of nodes deserialized
  --based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) by ChillCode, available under the MIT license (GPL compatible)
  worldedit.deserialize_old = function(originpos, value)
 @@ -119,9 +171,10 @@ worldedit.deserialize_old = function(originpos, value)  	--load the node array
  	local env = minetest.env
 +	local originx, originy, originz = originpos.x, originpos.y, originpos.z
  	for i, v in ipairs(tables[1]) do
  		local pos = v[1]
 -		pos.x, pos.y, pos.z = originpos.x + pos.x, originpos.y + pos.y, originpos.z + pos.z
 +		pos.x, pos.y, pos.z = originx - pos.x, originy - pos.y, originz - pos.z
  		env:add_node(pos, v[2])
  		count = count + 1
  	end
 diff --git a/worldedit_commands/init.lua b/worldedit_commands/init.lua index 3931df0..ad6dac8 100644 --- a/worldedit_commands/init.lua +++ b/worldedit_commands/init.lua @@ -663,7 +663,12 @@ minetest.register_chatcommand("/allocate", {  		local value = file:read("*a")
  		file:close()
 -		local nodepos1, nodepos2, count = worldedit.allocate(pos1, value)
 +		local nodepos1, nodepos2, count
 +		if value:find("{") then --old WorldEdit format
 +			nodepos1, nodepos2, count = worldedit.allocate_old(pos1, value)
 +		else --new WorldEdit format
 +			nodepos1, nodepos2, count = worldedit.allocate(pos1, value)
 +		end
  		worldedit.pos1[name] = nodepos1
  		worldedit.mark_pos1(name)
  | 
