mirror of
				https://github.com/sys4-fr/server-nalc.git
				synced 2025-10-31 12:35:22 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Lua
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Lua
		
	
	
		
			Executable File
		
	
	
	
	
| worldedit = rawget(_G, "worldedit") or {}
 | |
| local minetest = minetest --local copy of global
 | |
| 
 | |
| local get_pointed = function(pos, nearest, distance)
 | |
| 	if distance > 100 then
 | |
| 		return false
 | |
| 	end
 | |
| 
 | |
| 	--check for collision with node
 | |
| 	local nodename = minetest.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
 |