]> git.lizzy.rs Git - worldedit.git/blob - worldedit_infinity/init.lua
Optimize gui icon texture
[worldedit.git] / worldedit_infinity / init.lua
1 worldedit = rawget(_G, "worldedit") or {}\r
2 local minetest = minetest --local copy of global\r
3 \r
4 local get_pointed = function(pos, nearest, distance)\r
5         if distance > 100 then\r
6                 return false\r
7         end\r
8 \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
15                         return nearest\r
16                 end\r
17                 return false\r
18         end\r
19 end\r
20 \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
28                 end\r
29         end\r
30         return minetest.item_place_node(itemstack, user, pointed_thing)\r
31 end\r
32 --\r
33 \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
39 \r
40         if dir.x == 0 then\r
41                 intersectx = math.huge\r
42         elseif dir.x > 0 then\r
43                 stepx = 1\r
44                 componentx = 1 / dir.x\r
45                 intersectx = ((base.x - pos.x) + 1) * componentx\r
46         else\r
47                 stepx = -1\r
48                 componentx = 1 / -dir.x\r
49                 intersectx = (pos.x - base.x) * componentx\r
50         end\r
51         if dir.y == 0 then\r
52                 intersecty = math.huge\r
53         elseif dir.y > 0 then\r
54                 stepy = 1\r
55                 componenty = 1 / dir.y\r
56                 intersecty = ((base.y - pos.y) + 1) * componenty\r
57         else\r
58                 stepy = -1\r
59                 componenty = 1 / -dir.y\r
60                 intersecty = (pos.y - base.y) * componenty\r
61         end\r
62         if dir.z == 0 then\r
63                 intersectz = math.huge\r
64         elseif dir.z > 0 then\r
65                 stepz = 1\r
66                 componentz = 1 / dir.z\r
67                 intersectz = ((base.z - pos.z) + 1) * componentz\r
68         else\r
69                 stepz = -1\r
70                 componentz = 1 / -dir.z\r
71                 intersectz = (pos.z - base.z) * componentz\r
72         end\r
73 \r
74         local distance = 0\r
75         local nearest = {x=base.x, y=base.y, z=base.z}\r
76         while true do\r
77                 local values = {callback(base, nearest, distance)}\r
78                 if #values > 0 then\r
79                         return unpack(values)\r
80                 end\r
81 \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
88                         else\r
89                                 base.z = base.z + stepz\r
90                                 distance = intersectz\r
91                                 intersectz = intersectz + componentz\r
92                         end\r
93                 elseif intersecty < intersectz then\r
94                         base.y = base.y + stepy\r
95                         distance = intersecty\r
96                         intersecty = intersecty + componenty\r
97                 else\r
98                         base.z = base.z + stepz\r
99                         distance = intersectz\r
100                         intersectz = intersectz + componentz\r
101                 end\r
102         end\r
103 end\r