1 worldedit = rawget(_G, "worldedit") or {}
\r
2 local minetest = minetest --local copy of global
\r
4 local get_pointed = function(pos, nearest, distance)
\r
5 if distance > 100 then
\r
9 --check for collision with node
\r
10 local nodename = minetest.get_node(pos).name
\r
11 if nodename ~= "air"
\r
12 and nodename ~= "default:water_source"
\r
13 and nodename ~= "default:water_flowing" then
\r
14 if nodename ~= "ignore" then
\r
21 local use = function(itemstack, user, pointed_thing)
\r
22 if pointed_thing.type == "nothing" then --pointing at nothing
\r
23 local placepos = worldedit.raytrace(user:getpos(), user:get_look_dir(), get_pointed)
\r
24 if placepos then --extended reach
\r
25 pointed_thing.type = "node"
\r
26 pointed_thing.under = nil --wip
\r
27 pointed_thing.above = nil --wip
\r
30 return minetest.item_place_node(itemstack, user, pointed_thing)
\r
34 worldedit.raytrace = function(pos, dir, callback)
\r
35 local base = {x=math.floor(pos.x), y=math.floor(pos.y), z=math.floor(pos.z)}
\r
36 local stepx, stepy, stepz = 0, 0, 0
\r
37 local componentx, componenty, componentz = 0, 0, 0
\r
38 local intersectx, intersecty, intersectz = 0, 0, 0
\r
41 intersectx = math.huge
\r
42 elseif dir.x > 0 then
\r
44 componentx = 1 / dir.x
\r
45 intersectx = ((base.x - pos.x) + 1) * componentx
\r
48 componentx = 1 / -dir.x
\r
49 intersectx = (pos.x - base.x) * componentx
\r
52 intersecty = math.huge
\r
53 elseif dir.y > 0 then
\r
55 componenty = 1 / dir.y
\r
56 intersecty = ((base.y - pos.y) + 1) * componenty
\r
59 componenty = 1 / -dir.y
\r
60 intersecty = (pos.y - base.y) * componenty
\r
63 intersectz = math.huge
\r
64 elseif dir.z > 0 then
\r
66 componentz = 1 / dir.z
\r
67 intersectz = ((base.z - pos.z) + 1) * componentz
\r
70 componentz = 1 / -dir.z
\r
71 intersectz = (pos.z - base.z) * componentz
\r
75 local nearest = {x=base.x, y=base.y, z=base.z}
\r
77 local values = {callback(base, nearest, distance)}
\r
79 return unpack(values)
\r
82 nearest.x, nearest.y, nearest.z = base.x, base.y, base.z
\r
83 if intersectx < intersecty then
\r
84 if intersectx < intersectz then
\r
85 base.x = base.x + stepx
\r
86 distance = intersectx
\r
87 intersectx = intersectx + componentx
\r
89 base.z = base.z + stepz
\r
90 distance = intersectz
\r
91 intersectz = intersectz + componentz
\r
93 elseif intersecty < intersectz then
\r
94 base.y = base.y + stepy
\r
95 distance = intersecty
\r
96 intersecty = intersecty + componenty
\r
98 base.z = base.z + stepz
\r
99 distance = intersectz
\r
100 intersectz = intersectz + componentz
\r