Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- roads = {}
- roads.pos1 = {}
- roads.pos2 = {}
- roads.ok = false
- roads.path = {}
- minetest.register_tool("roads:tool", {
- description = "roads edit tool",
- inventory_image = "default_stick.png",
- on_use = function(itemstack, user, pointed_thing)
- local pos = pointed_thing.above
- local name = user:get_player_name()
- if roads.ok then
- minetest.chat_send_player(name,"made road")
- roads.path = minetest.find_path(roads.pos1,roads.pos2,
- 5,
- 1,
- 1,
- "A*")
- --roads.path = line3d(roads.pos1, roads.pos2)
- print(dump(roads.path))
- local l = path2line(roads.path)
- print(dump(l))
- for k, v in pairs(l) do
- minetest.set_node(v, { name = "wool:red" } )
- end
- roads.pos1 = {}
- roads.pos2 = {}
- roads.path = {}
- roads.ok = false
- elseif roads.pos1.x then
- roads.pos2 = pos
- minetest.chat_send_player(name,"pos2 set")
- roads.ok = true
- else
- roads.pos1 = pos
- minetest.chat_send_player(name,"pos1 set")
- end
- end,
- })
- path2line = function(path)
- local line = {}
- local pos1, pos2
- pos1 = path[1]
- for k, v in pairs(path) do
- pos2 = v
- local l = line3d(pos1, pos2)
- for k, v in pairs(l) do
- table.insert(line, v)
- end
- pos1 = v
- end
- return line
- end
- --line2street = function(line)
- --for k, v in pairs(line) do
- --turn turtle forward (starts facing up)
- --find angle perpendicular to direction
- --set angle, spawn axiom, something like "TTTTFTTTT"
- --with appropriate materials in treedef
- --spawn "tree"
- --end
- --end
- line3d = function(from_position, to_position)
- --from https://github.com/ryanramage/bresenham3d/blob/master/index.js
- --lua port by jin_xi
- local line = {}
- local temp
- local x0 = math.floor(from_position.x)
- local y0 = math.floor(from_position.y)
- local z0 = math.floor(from_position.z)
- local x1 = math.floor(to_position.x)
- local y1 = math.floor(to_position.y)
- local z1 = math.floor(to_position.z)
- --'steep' xy Line, make longest delta x plane
- local swap_xy = math.abs(y1 - y0) > math.abs(x1 - x0)
- if swap_xy then
- temp = x0; x0 = y0; y0 = temp --swap(x0, y0);
- temp = x1; x1 = y1; y1 = temp --swap(x1, y1);
- end
- local swap_xz = math.abs(z1 - z0) > math.abs(x1 - x0)
- if swap_xz then
- temp = x0; x0 = z0; z0 = temp --swap(x0, z0);
- temp = x1; x1 = z1; z1 = temp --swap(x1, z1);
- end
- --delta is Length in each plane
- local delta_x = math.abs(x1 - x0)
- local delta_y = math.abs(y1 - y0)
- local delta_z = math.abs(z1 - z0)
- --drift controls when to step in 'shallow' planes
- --starting value keeps Line centred
- local drift_xy = (delta_x / 2)
- local drift_xz = (delta_x / 2)
- --direction of line
- local step_x = 1
- if x0 > x1 then step_x = -1 end
- local step_y = 1
- if y0 > y1 then step_y = -1 end
- local step_z = 1
- if z0 > z1 then step_z = -1 end
- --starting point
- local y = y0
- local z = z0
- local cx, cy, cz
- --step through longest delta (which we have swapped to x)
- for x = x0, x1, step_x do
- --copy position
- cx = x; cy = y; cz = z
- --unswap (in reverse)
- if swap_xz then
- temp = cx; cx = cz; cz = temp --swap(cx, cz)
- end
- if swap_xy then
- temp = cx; cx = cy; cy = temp --swap(cx, cy)
- end
- table.insert(line, { x = cx, y = cy, z = cz } )
- --update progress in other planes
- drift_xy = drift_xy - delta_y
- drift_xz = drift_xz - delta_z
- --step in y plane
- if drift_xy < 0 then
- y = y + step_y
- drift_xy = drift_xy + delta_x
- end
- --same in z
- if (drift_xz < 0) then
- z = z + step_z
- drift_xz = drift_xz + delta_x
- end
- end
- return line
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement