diff options
author | hdastwb <hdastwb@hdastwb.heliohost.org> | 2013-07-19 01:36:55 -0400 |
---|---|---|
committer | Vanessa Ezekowitz <vanessaezekowitz@gmail.com> | 2013-07-19 19:16:26 -0400 |
commit | ec416df7945f85bdb6fc50369b7049e52d96e791 (patch) | |
tree | 93b42d89c37900f9f64bc456806ad9e61d3bd0a7 /node_breaker.lua | |
parent | 3862070bfd590a45272a267101baa37686e12a6d (diff) |
added support for 6d facedir for all tube components, changed autoplace.lua to follow tubes.connect_sides rather than having each component coded individually, and added support for placing deployers and node breakers facing vertically
Diffstat (limited to 'node_breaker.lua')
-rw-r--r-- | node_breaker.lua | 165 |
1 files changed, 132 insertions, 33 deletions
diff --git a/node_breaker.lua b/node_breaker.lua index bb77c54..f6be474 100644 --- a/node_breaker.lua +++ b/node_breaker.lua @@ -30,6 +30,82 @@ function hacky_swap_node(pos,name) meta:from_table(meta0) end +--define the functions from https://github.com/minetest/minetest/pull/834 while waiting for the devs to notice it +local function dir_to_facedir(dir, is6d) + --account for y if requested + if is6d and math.abs(dir.y) > math.abs(dir.x) and math.abs(dir.y) > math.abs(dir.z) then + + --from above + if dir.y < 0 then + if math.abs(dir.x) > math.abs(dir.z) then + if dir.x < 0 then + return 19 + else + return 13 + end + else + if dir.z < 0 then + return 10 + else + return 4 + end + end + + --from below + else + if math.abs(dir.x) > math.abs(dir.z) then + if dir.x < 0 then + return 15 + else + return 17 + end + else + if dir.z < 0 then + return 6 + else + return 8 + end + end + end + + --otherwise, place horizontally + elseif math.abs(dir.x) > math.abs(dir.z) then + if dir.x < 0 then + return 3 + else + return 1 + end + else + if dir.z < 0 then + return 2 + else + return 0 + end + end +end + +local function facedir_to_dir(facedir) + --a table of possible dirs + return ({{x=0, y=0, z=1}, + {x=1, y=0, z=0}, + {x=0, y=0, z=-1}, + {x=-1, y=0, z=0}, + {x=0, y=-1, z=0}, + {x=0, y=1, z=0}}) + + --indexed into by a table of correlating facedirs + [({[0]=1, 2, 3, 4, + 5, 2, 6, 4, + 6, 2, 5, 4, + 1, 5, 3, 6, + 1, 6, 3, 5, + 1, 4, 3, 2}) + + --indexed into by the facedir in question + [facedir]] +end + + node_breaker_on = function(pos, node) if node.name == "pipeworks:nodebreaker_off" then hacky_swap_node(pos,"pipeworks:nodebreaker_on") @@ -45,32 +121,15 @@ node_breaker_off = function(pos, node) end end -function break_node (pos, n_param) - local pos1 = {x=pos.x, y=pos.y, z=pos.z} - local pos2 = {x=pos.x, y=pos.y, z=pos.z} - - --param2 3=x+ 1=x- 2=z+ 0=z- - local x_velocity, z_velocity = 0, 0 - if n_param == 3 then - pos2.x = pos2.x + 1 - pos1.x = pos1.x - 1 - x_velocity = -1 - elseif n_param == 2 then - pos2.z = pos2.z + 1 - pos1.z = pos1.z - 1 - z_velocity = -1 - elseif n_param == 1 then - pos2.x = pos2.x - 1 - pos1.x = pos1.x + 1 - x_velocity = 1 - elseif n_param == 0 then - pos2.z = pos2.z - 1 - pos1.x = pos1.z + 1 - z_velocity = 1 - end - - local node = minetest.get_node(pos2) - if node.name == "air" or name == "ignore" then +function break_node (pos, facedir) + + --locate the outgoing velocity, front, and back of the node via facedir_to_dir + local vel = facedir_to_dir(facedir); + local front = {x=pos.x - vel.x, y=pos.y - vel.y, z=pos.z - vel.z} + local back = {x=pos.x + vel.x, y=pos.y + vel.y, z=pos.z + vel.z} + + local node = minetest.get_node(front) + if node.name == "air" or node.name == "ignore" then return nil elseif minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].liquidtype ~= "none" then return nil @@ -84,7 +143,7 @@ function break_node (pos, n_param) --check node to make sure it is diggable local def = ItemStack({name=node.name}):get_definition() - if #def ~= 0 and not def.diggable or (def.can_dig and not def.can_dig(pos2, digger)) then --node is not diggable + if #def ~= 0 and not def.diggable or (def.can_dig and not def.can_dig(front, digger)) then --node is not diggable return end @@ -93,16 +152,16 @@ function break_node (pos, n_param) for _, dropped_item in ipairs(drops) do local item1 = tube_item({x=pos.x, y=pos.y, z=pos.z}, dropped_item) item1:get_luaentity().start_pos = {x=pos.x, y=pos.y, z=pos.z} - item1:setvelocity({x=x_velocity, y=0, z=z_velocity}) + item1:setvelocity(vel) item1:setacceleration({x=0, y=0, z=0}) end - minetest.remove_node(pos2) + minetest.remove_node(front) --handle post-digging callback if def.after_dig_node then -- Copy pos and node because callback can modify them - local pos_copy = {x=pos2.x, y=pos2.y, z=pos2.z} + local pos_copy = {x=front.x, y=front.y, z=front.z} local node_copy = {name=node.name, param1=node.param1, param2=node.param2} def.after_dig_node(pos_copy, node_copy, oldmetadata, digger) end @@ -110,7 +169,7 @@ function break_node (pos, n_param) --run digging event callbacks for _, callback in ipairs(minetest.registered_on_dignodes) do -- Copy pos and node because callback can modify them - local pos_copy = {x=pos2.x, y=pos2.y, z=pos2.z} + local pos_copy = {x=front.x, y=front.y, z=front.z} local node_copy = {name=node.name, param1=node.param1, param2=node.param2} callback(pos_copy, node_copy, digger) end @@ -125,7 +184,27 @@ minetest.register_node("pipeworks:nodebreaker_off", { groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1}, mesecons= {effector={action_on=node_breaker_on, action_off=node_breaker_off}}, sounds = default.node_sound_stone_defaults(), - after_place_node = tube_scanforobjects, + tube = {connect_sides={back=1}}, + after_place_node = function (pos, placer) + tube_scanforobjects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + end, after_dig_node = tube_scanforobjects, }) @@ -138,6 +217,26 @@ minetest.register_node("pipeworks:nodebreaker_on", { paramtype2 = "facedir", groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1,not_in_creative_inventory=1}, sounds = default.node_sound_stone_defaults(), - after_place_node = tube_scanforobjects, + tube = {connect_sides={back=1}}, + after_place_node = function (pos, placer) + tube_scanforobjects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + end, after_dig_node = tube_scanforobjects, }) |