diff options
| author | Anthony Zhang <azhang9@gmail.com> | 2013-08-06 16:29:00 -0400 | 
|---|---|---|
| committer | Anthony Zhang <azhang9@gmail.com> | 2013-08-06 16:29:00 -0400 | 
| commit | 4c43bf36001e1b7982e20ad1ab0d2dd3926fc406 (patch) | |
| tree | 256e97368e2ff4f36213e183d70e1a68eaba6c4b /worldedit_infinity | |
| parent | 03327a767d98192e7480f6c063c693fd5b206144 (diff) | |
Add initial code for worldedit_infinity.
Diffstat (limited to 'worldedit_infinity')
| -rw-r--r-- | worldedit_infinity/init.lua | 102 | 
1 files changed, 102 insertions, 0 deletions
| diff --git a/worldedit_infinity/init.lua b/worldedit_infinity/init.lua new file mode 100644 index 0000000..31a456b --- /dev/null +++ b/worldedit_infinity/init.lua @@ -0,0 +1,102 @@ +worldedit = worldedit or {}
 +
 +local get_pointed = function(pos, nearest, distance)
 +	if distance > 100 then
 +		return false
 +	end
 +
 +	--check for collision with node
 +	local nodename = env:get_node(pos).name
 +	if nodename ~= "air"
 +	and nodename ~= "default:water_source"
 +	and nodename ~= "default:water_flowing" then
 +		if nodename ~= "ignore" then
 +			return nearest
 +		end
 +		return false
 +	end
 +end
 +
 +local use = function(itemstack, user, pointed_thing)
 +	if pointed_thing.type == "nothing" then --pointing at nothing
 +		local placepos = worldedit.raytrace(user:getpos(), user:get_look_dir(), get_pointed)
 +		if placepos then --extended reach
 +			pointed_thing.type = "node"
 +			pointed_thing.under = nil --wip
 +			pointed_thing.above = nil --wip
 +		end
 +	end
 +	return minetest.item_place_node(itemstack, user, pointed_thing)
 +end
 +--
 +
 +worldedit.raytrace = function(pos, dir, callback)
 +	local base = {x=math.floor(pos.x), y=math.floor(pos.y), z=math.floor(pos.z)}
 +	local stepx, stepy, stepz = 0, 0, 0
 +	local componentx, componenty, componentz = 0, 0, 0
 +	local intersectx, intersecty, intersectz = 0, 0, 0
 +
 +	if dir.x == 0 then
 +		intersectx = math.huge
 +	elseif dir.x > 0 then
 +		stepx = 1
 +		componentx = 1 / dir.x
 +		intersectx = ((base.x - pos.x) + 1) * componentx
 +	else
 +		stepx = -1
 +		componentx = 1 / -dir.x
 +		intersectx = (pos.x - base.x) * componentx
 +	end
 +	if dir.y == 0 then
 +		intersecty = math.huge
 +	elseif dir.y > 0 then
 +		stepy = 1
 +		componenty = 1 / dir.y
 +		intersecty = ((base.y - pos.y) + 1) * componenty
 +	else
 +		stepy = -1
 +		componenty = 1 / -dir.y
 +		intersecty = (pos.y - base.y) * componenty
 +	end
 +	if dir.z == 0 then
 +		intersectz = math.huge
 +	elseif dir.z > 0 then
 +		stepz = 1
 +		componentz = 1 / dir.z
 +		intersectz = ((base.z - pos.z) + 1) * componentz
 +	else
 +		stepz = -1
 +		componentz = 1 / -dir.z
 +		intersectz = (pos.z - base.z) * componentz
 +	end
 +
 +	local distance = 0
 +	local nearest = {x=base.x, y=base.y, z=base.z}
 +	while true do
 +		local values = {callback(base, nearest, distance)}
 +		if #values > 0 then
 +			return unpack(values)
 +		end
 +
 +		nearest.x, nearest.y, nearest.z = base.x, base.y, base.z
 +		if intersectx < intersecty then
 +			if intersectx < intersectz then
 +				base.x = base.x + stepx
 +				distance = intersectx
 +				intersectx = intersectx + componentx
 +			else
 +				base.z = base.z + stepz
 +				distance = intersectz
 +				intersectz = intersectz + componentz
 +			end
 +		elseif intersecty < intersectz then
 +			base.y = base.y + stepy
 +			distance = intersecty
 +			intersecty = intersecty + componenty
 +		else
 +			base.z = base.z + stepz
 +			distance = intersectz
 +			intersectz = intersectz + componentz
 +		end
 +	end
 +end
\ No newline at end of file | 
