From 240380ff16bfb8dedb18b991315f0bacd937caf5 Mon Sep 17 00:00:00 2001
From: Daniel Sosa <sosa.daniel23@gmail.com>
Date: Sat, 3 Jan 2015 20:20:27 -0600
Subject: Implement /inset and /shift

---
 worldedit_commands/cuboid.lua    | 92 ++++++++++++++++++++++++++++++----------
 worldedit_commands/cuboidapi.lua | 12 +++---
 2 files changed, 76 insertions(+), 28 deletions(-)

diff --git a/worldedit_commands/cuboid.lua b/worldedit_commands/cuboid.lua
index 1af5b3b..2e59f16 100644
--- a/worldedit_commands/cuboid.lua
+++ b/worldedit_commands/cuboid.lua
@@ -37,30 +37,78 @@ minetest.register_chatcommand("/outset", {
   }
 )
 
+minetest.register_chatcommand("/inset", {
+	params = "<amount> [h|v]",
+	description = "inset the selection",
+	privs = {worldedit=true},
+	func = function(name, param)
+		local find, _, amount, dir = param:find("^(%d+)[%s+]?([hv]?)$")
+		
+		if find == nil then
+			return false, "invalid usage: " .. param
+		end
+		
+		local pos1 = worldedit.pos1[name]
+		local pos2 = worldedit.pos2[name]
+		
+		if pos1 == nil or pos2 == nil then
+			return false, 
+				"Undefined region. Region must be defined beforehand."
+		end
+		
+		if dir == "" then
+			assert(worldedit.cuboid_volumetricexpand(name, -amount))
+		elseif dir == "h" then
+			assert(worldedit.cuboid_linealexpand(name, 'x', 1, -amount))
+			assert(worldedit.cuboid_linealexpand(name, 'x', -1, -amount))
+			assert(worldedit.cuboid_linealexpand(name, 'z', 1, -amount))
+			assert(worldedit.cuboid_linealexpand(name, 'z', -1, -amount))
+		elseif dir == "v" then
+			assert(worldedit.cuboid_linealexpand(name, 'y', 1, -amount))
+			assert(worldedit.cuboid_linealexpand(name, 'y', -1, -amount))
+		else
+			return false, "Unknown error"
+		end
+		
+		worldedit.marker_update(name)
+		return true, "Region inset by " .. amount .. " blocks"
+      end,
+  }
+)
 
-minetest.register_chatcommand(
-  "/shift",
-  {
-      params = "<amount> [up|down|left|right|front|back]",
-      description = "Moves the selection region. Does not move contents.",
-      privs = {worldedit=true},
-      func = function(name, param)
-	local pos1 = worldedit.pos1[name]
-	local pos2 = worldedit.pos2[name]
-	local find, _, amount, direction = param:find("(%d+)%s*(%l*)")
-
-	if find == nil then
-	    worldedit.player_notify(name, "invalid usage: " .. param)
-	    return
-	end
-	
-	if pos1 == nil or pos2 == nil then
-	    worldedit.player_notify(name, 
-	      "Undefined region. Region must be defined beforehand.")
-	    return
-	end
 
-	
+minetest.register_chatcommand("/shift", {
+	params = "<amount> [up|down|left|right|front|back]",
+	description = "Moves the selection region. Does not move contents.",
+	privs = {worldedit=true},
+	func = function(name, param)
+		local pos1 = worldedit.pos1[name]
+		local pos2 = worldedit.pos2[name]
+		local find, _, amount, direction = param:find("(%d+)%s*(%l*)")
+		
+		if find == nil then
+			worldedit.player_notify(name, "invalid usage: " .. param)
+			return
+		end
+		
+		if pos1 == nil or pos2 == nil then
+			worldedit.player_notify(name, 
+			"Undefined region. Region must be defined beforehand.")
+			return
+		end
+		
+		local axis, dir
+		if direction ~= "" then
+			axis, dir = worldedit.translate_direction(name, direction)
+		else
+			axis, dir = worldedit.player_axis(name)
+			worldedit.player_notify(name, "entered player_axis")
+		end
+		
+		assert(worldedit.cuboid_shift(name, axis, amount * dir))
+		worldedit.marker_update(name)
+		
+		return true, "region shifted by " .. amount .. " blocks"
       end,
   }
 )
diff --git a/worldedit_commands/cuboidapi.lua b/worldedit_commands/cuboidapi.lua
index 37194e4..d473571 100644
--- a/worldedit_commands/cuboidapi.lua
+++ b/worldedit_commands/cuboidapi.lua
@@ -65,14 +65,14 @@ worldedit.cuboid_shift = function(name, axis, amount)
 	end
 	
 	if axis == 'x' then
-		pos1.x = pos1.x + amount
-		pos2.x = pos2.x + amount
+		worldedit.pos1[name].x = pos1.x + amount
+		worldedit.pos2[name].x = pos2.x + amount
 	elseif axis == 'y' then
-		pos1.y = pos1.y + amount
-		pos2.y = pos2.y + amount
+		worldedit.pos1[name].y = pos1.y + amount
+		worldedit.pos2[name].y = pos2.y + amount
 	elseif axis == 'z' then
-		pos1.z = pos1.z + amount
-		pos2.z = pos2.z + amount
+		worldedit.pos1[name].z = pos1.z + amount
+		worldedit.pos2[name].z = pos2.z + amount
 	else
 		return false, "invalid axis"
 	end
-- 
cgit v1.2.3