From 888b0ebfec8c2eff9015163549a7e47443cb8665 Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Fri, 1 Apr 2016 21:00:20 -0400 Subject: "explode" all modpacks into their individual components (you can't have a modpack buried inside a modpack) --- worldedit_infinity/depends.txt | 1 + worldedit_infinity/init.lua | 103 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 worldedit_infinity/depends.txt create mode 100644 worldedit_infinity/init.lua (limited to 'worldedit_infinity') diff --git a/worldedit_infinity/depends.txt b/worldedit_infinity/depends.txt new file mode 100644 index 0000000..c4f6871 --- /dev/null +++ b/worldedit_infinity/depends.txt @@ -0,0 +1 @@ +worldedit? diff --git a/worldedit_infinity/init.lua b/worldedit_infinity/init.lua new file mode 100644 index 0000000..8bd3a05 --- /dev/null +++ b/worldedit_infinity/init.lua @@ -0,0 +1,103 @@ +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 -- cgit v1.2.3