summaryrefslogtreecommitdiff
path: root/nodes/node_diggers.lua
diff options
context:
space:
mode:
authorFaceDeer <derksenmobile@gmail.com>2017-09-11 23:47:25 -0600
committerFaceDeer <derksenmobile@gmail.com>2017-09-11 23:47:25 -0600
commit15b327c842ebe4189ceae16a419dce974c8b2451 (patch)
treeda1dbcf8528f963c8bc9d93aab2af952fbb0199e /nodes/node_diggers.lua
parent3441a0d1da37087287fdaade7c8930480abe65e9 (diff)
move node defs and recipes into a subfolder
Diffstat (limited to 'nodes/node_diggers.lua')
-rw-r--r--nodes/node_diggers.lua473
1 files changed, 473 insertions, 0 deletions
diff --git a/nodes/node_diggers.lua b/nodes/node_diggers.lua
new file mode 100644
index 0000000..c12b46c
--- /dev/null
+++ b/nodes/node_diggers.lua
@@ -0,0 +1,473 @@
+-- internationalization boilerplate
+local MP = minetest.get_modpath(minetest.get_current_modname())
+local S, NS = dofile(MP.."/intllib.lua")
+
+-- Note: diggers go in group 3 and have an execute_dig method.
+
+local digger_nodebox = {
+ {-0.5, -0.5, 0, 0.5, 0.5, 0.4375}, -- Block
+ {-0.4375, -0.3125, 0.4375, 0.4375, 0.3125, 0.5}, -- Cutter1
+ {-0.3125, -0.4375, 0.4375, 0.3125, 0.4375, 0.5}, -- Cutter2
+ {-0.5, -0.125, -0.125, 0.5, 0.125, 0}, -- BackFrame1
+ {-0.125, -0.5, -0.125, 0.125, 0.5, 0}, -- BackFrame2
+ {-0.25, -0.25, -0.5, 0.25, 0.25, 0}, -- Drive
+}
+
+local dual_digger_nodebox = {
+ {-0.5, -0.4375, 0, 0.5, 0.5, 0.4375}, -- Block
+ {-0.4375, -0.3125, 0.4375, 0.4375, 0.3125, 0.5}, -- Cutter1
+ {-0.3125, -0.4375, 0.4375, 0.3125, 0.4375, 0.5}, -- Cutter2
+ {-0.5, 0, -0.125, 0.5, 0.125, 0}, -- BackFrame1
+ {-0.25, 0, -0.5, 0.25, 0.25, 0}, -- Drive
+ {-0.25, 0.25, -0.25, 0.25, 0.5, 0}, -- Upper_Drive
+ {-0.5, -0.4375, -0.5, 0.5, 0, 0.4375}, -- Lower_Block
+ {-0.3125, -0.5, -0.4375, 0.3125, -0.4375, 0.4375}, -- Lower_Cutter_1
+ {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, -- Lower_Cutter_2
+}
+
+local intermittent_formspec =
+ default.gui_bg ..
+ default.gui_bg_img ..
+ default.gui_slots ..
+ "field[0.5,0.8;1,0.1;period;" .. S("Periodicity") .. ";${period}]" ..
+ "tooltip[period;" .. S("Digger will dig once every n steps.\nThese steps are globally aligned, all diggers with\nthe same period and offset will dig on the same location.") .. "]" ..
+ "field[1.5,0.8;1,0.1;offset;" .. S("Offset") .. ";${offset}]" ..
+ "tooltip[offset;" .. S("Offsets the start of periodicity counting by this amount.\nFor example, a digger with period 2 and offset 0 digs\nevery even-numbered block and one with period 2 and\noffset 1 digs every odd-numbered block.") .. "]" ..
+ "button_exit[2.2,0.5;1,0.1;set;" .. S("Save") .. "]" ..
+ "tooltip[set;" .. S("Saves settings") .. "]"
+
+local intermittent_on_construct = function(pos)
+ local formspec = intermittent_formspec
+ if minetest.get_modpath("doc") then
+ formspec = "size[4.5,1]" .. formspec ..
+ "button_exit[3.2,0.5;1,0.1;help;" .. S("Help") .. "]" ..
+ "tooltip[help;" .. S("Show documentation about this block") .. "]"
+ else
+ formspec = "size[3.5,1]" .. formspec
+ end
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec", formspec)
+ meta:set_int("period", 1)
+ meta:set_int("offset", 0)
+end
+
+local intermittent_on_receive_fields = function(pos, formname, fields, sender)
+ local meta = minetest.get_meta(pos)
+ local period = tonumber(fields.period)
+ local offset = tonumber(fields.offset)
+ if period and period > 0 then
+ meta:set_int("period", math.floor(period))
+ end
+ if offset then
+ meta:set_int("offset", math.floor(offset))
+ end
+ if fields.help and minetest.get_modpath("doc") then --check for mod in case someone disabled it after this digger was built
+ local node_name = minetest.get_node(pos).name
+ minetest.after(0.5, doc.show_entry, sender:get_player_name(), "nodes", node_name, true)
+ end
+end,
+
+-- Digs out nodes that are "in front" of the digger head.
+minetest.register_node("digtron:digger", {
+ description = S("Digtron Digger Head"),
+ _doc_items_longdesc = digtron.doc.digger_longdesc,
+ _doc_items_usagehelp = digtron.doc.digger_usagehelp,
+ groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3},
+ drop = "digtron:digger",
+ sounds = digtron.metal_sounds,
+ paramtype = "light",
+ paramtype2= "facedir",
+ is_ground_content = false,
+ drawtype="nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = digger_nodebox,
+ },
+
+ -- Aims in the +Z direction by default
+ tiles = {
+ "digtron_plate.png^[transformR90",
+ "digtron_plate.png^[transformR270",
+ "digtron_plate.png",
+ "digtron_plate.png^[transformR180",
+ {
+ name = "digtron_digger_yb.png",
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ },
+ "digtron_plate.png^digtron_motor.png",
+ },
+
+ -- returns fuel_cost, item_produced
+ execute_dig = function(pos, protected_nodes, nodes_dug, controlling_coordinate, lateral_dig)
+ local facing = minetest.get_node(pos).param2
+ local digpos = digtron.find_new_pos(pos, facing)
+
+ if protected_nodes:get(digpos.x, digpos.y, digpos.z) then
+ return 0, {}
+ end
+
+ return digtron.mark_diggable(digpos, nodes_dug)
+ end,
+
+ damage_creatures = function(player, pos, controlling_coordinate)
+ local facing = minetest.get_node(pos).param2
+ digtron.damage_creatures(player, digtron.find_new_pos(pos, facing), 8)
+ end,
+})
+
+-- Digs out nodes that are "in front" of the digger head.
+minetest.register_node("digtron:intermittent_digger", {
+ description = S("Digtron Intermittent Digger Head"),
+ _doc_items_longdesc = digtron.doc.intermittent_digger_longdesc,
+ _doc_items_usagehelp = digtron.doc.intermittent_digger_usagehelp,
+ groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3},
+ drop = "digtron:intermittent_digger",
+ sounds = digtron.metal_sounds,
+ paramtype = "light",
+ paramtype2= "facedir",
+ is_ground_content = false,
+ drawtype="nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = digger_nodebox,
+ },
+
+ -- Aims in the +Z direction by default
+ tiles = {
+ "digtron_plate.png^[transformR90",
+ "digtron_plate.png^[transformR270",
+ "digtron_plate.png",
+ "digtron_plate.png^[transformR180",
+ {
+ name = "digtron_digger_yb.png",
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ },
+ "digtron_plate.png^digtron_intermittent.png^digtron_motor.png",
+ },
+
+ on_construct = intermittent_on_construct,
+
+ on_receive_fields = intermittent_on_receive_fields,
+
+ -- returns fuel_cost, item_produced
+ execute_dig = function(pos, protected_nodes, nodes_dug, controlling_coordinate, lateral_dig)
+ if lateral_dig == true then
+ return 0, {}
+ end
+
+ local facing = minetest.get_node(pos).param2
+ local digpos = digtron.find_new_pos(pos, facing)
+
+ if protected_nodes:get(digpos.x, digpos.y, digpos.z) then
+ return 0, {}
+ end
+
+ local meta = minetest.get_meta(pos)
+ if (digpos[controlling_coordinate] + meta:get_int("offset")) % meta:get_int("period") ~= 0 then
+ return 0, {}
+ end
+
+ return digtron.mark_diggable(digpos, nodes_dug)
+ end,
+
+ damage_creatures = function(player, pos, controlling_coordinate)
+ local facing = minetest.get_node(pos).param2
+ local targetpos = digtron.find_new_pos(pos, facing)
+ local meta = minetest.get_meta(pos)
+ if (targetpos[controlling_coordinate] + meta:get_int("offset")) % meta:get_int("period") == 0 then
+ digtron.damage_creatures(player, targetpos, 8)
+ end
+ end
+})
+
+-- A special-purpose digger to deal with stuff like sand and gravel in the ceiling. It always digs (no periodicity or offset), but it only digs falling_block nodes
+minetest.register_node("digtron:soft_digger", {
+ description = S("Digtron Soft Material Digger Head"),
+ _doc_items_longdesc = digtron.doc.soft_digger_longdesc,
+ _doc_items_usagehelp = digtron.doc.soft_digger_usagehelp,
+ groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3},
+ drop = "digtron:soft_digger",
+ sounds = digtron.metal_sounds,
+ paramtype = "light",
+ paramtype2= "facedir",
+ is_ground_content = false,
+ drawtype="nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = digger_nodebox,
+ },
+
+ -- Aims in the +Z direction by default
+ tiles = {
+ "digtron_plate.png^[transformR90^[colorize:" .. digtron.soft_digger_colorize,
+ "digtron_plate.png^[transformR270^[colorize:" .. digtron.soft_digger_colorize,
+ "digtron_plate.png^[colorize:" .. digtron.soft_digger_colorize,
+ "digtron_plate.png^[transformR180^[colorize:" .. digtron.soft_digger_colorize,
+ {
+ name = "digtron_digger_yb.png^[colorize:" .. digtron.soft_digger_colorize,
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ },
+ "digtron_plate.png^digtron_motor.png^[colorize:" .. digtron.soft_digger_colorize,
+ },
+
+ execute_dig = function(pos, protected_nodes, nodes_dug, controlling_coordinate, lateral_dig)
+ local facing = minetest.get_node(pos).param2
+ local digpos = digtron.find_new_pos(pos, facing)
+
+ if protected_nodes:get(digpos.x, digpos.y, digpos.z) then
+ return 0, {}
+ end
+
+ if digtron.is_soft_material(digpos) then
+ return digtron.mark_diggable(digpos, nodes_dug)
+ end
+
+ return 0, {}
+ end,
+
+ damage_creatures = function(player, pos, controlling_coordinate)
+ local facing = minetest.get_node(pos).param2
+ digtron.damage_creatures(player, digtron.find_new_pos(pos, facing), 4)
+ end,
+})
+
+minetest.register_node("digtron:intermittent_soft_digger", {
+ description = S("Digtron Intermittent Soft Material Digger Head"),
+ _doc_items_longdesc = digtron.doc.intermittent_soft_digger_longdesc,
+ _doc_items_usagehelp = digtron.doc.intermittent_soft_digger_usagehelp,
+ groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3},
+ drop = "digtron:intermittent_soft_digger",
+ sounds = digtron.metal_sounds,
+ paramtype = "light",
+ paramtype2= "facedir",
+ is_ground_content = false,
+ drawtype="nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = digger_nodebox,
+ },
+
+ -- Aims in the +Z direction by default
+ tiles = {
+ "digtron_plate.png^[transformR90^[colorize:" .. digtron.soft_digger_colorize,
+ "digtron_plate.png^[transformR270^[colorize:" .. digtron.soft_digger_colorize,
+ "digtron_plate.png^[colorize:" .. digtron.soft_digger_colorize,
+ "digtron_plate.png^[transformR180^[colorize:" .. digtron.soft_digger_colorize,
+ {
+ name = "digtron_digger_yb.png^[colorize:" .. digtron.soft_digger_colorize,
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ },
+ "digtron_plate.png^digtron_intermittent.png^digtron_motor.png^[colorize:" .. digtron.soft_digger_colorize,
+ },
+
+ on_construct = intermittent_on_construct,
+
+ on_receive_fields = intermittent_on_receive_fields,
+
+ execute_dig = function(pos, protected_nodes, nodes_dug, controlling_coordinate, lateral_dig)
+ if lateral_dig == true then
+ return 0, {}
+ end
+
+ local facing = minetest.get_node(pos).param2
+ local digpos = digtron.find_new_pos(pos, facing)
+
+ if protected_nodes:get(digpos.x, digpos.y, digpos.z) then
+ return 0, {}
+ end
+
+ local meta = minetest.get_meta(pos)
+ if (digpos[controlling_coordinate] + meta:get_int("offset")) % meta:get_int("period") ~= 0 then
+ return 0, {}
+ end
+
+ if digtron.is_soft_material(digpos) then
+ return digtron.mark_diggable(digpos, nodes_dug)
+ end
+
+ return 0, {}
+ end,
+
+ damage_creatures = function(player, pos, controlling_coordinate)
+ local meta = minetest.get_meta(pos)
+ local facing = minetest.get_node(pos).param2
+ local targetpos = digtron.find_new_pos(pos, facing)
+ if (targetpos[controlling_coordinate] + meta:get_int("offset")) % meta:get_int("period") == 0 then
+ digtron.damage_creatures(player, targetpos, 4)
+ end
+ end,
+})
+
+-- Digs out nodes that are "in front" of the digger head and "below" the digger head (can be rotated).
+minetest.register_node("digtron:dual_digger", {
+ description = S("Digtron Dual Digger Head"),
+ _doc_items_longdesc = digtron.doc.dual_digger_longdesc,
+ _doc_items_usagehelp = digtron.doc.dual_digger_usagehelp,
+ groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3},
+ drop = "digtron:dual_digger",
+ sounds = digtron.metal_sounds,
+ paramtype = "light",
+ paramtype2= "facedir",
+ is_ground_content = false,
+ drawtype="nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = dual_digger_nodebox,
+ },
+
+ -- Aims in the +Z and -Y direction by default
+ tiles = {
+ "digtron_plate.png^digtron_motor.png",
+ {
+ name = "digtron_digger_yb.png",
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ },
+ "digtron_plate.png",
+ "digtron_plate.png^[transformR180",
+ {
+ name = "digtron_digger_yb.png",
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ },
+ "digtron_plate.png^digtron_motor.png",
+ },
+
+ -- returns fuel_cost, items_produced
+ execute_dig = function(pos, protected_nodes, nodes_dug, controlling_coordinate, lateral_dig)
+ local facing = minetest.get_node(pos).param2
+ local digpos = digtron.find_new_pos(pos, facing)
+ local digdown = digtron.find_new_pos_downward(pos, facing)
+
+ local items = {}
+ local cost = 0
+
+ if protected_nodes:get(digpos.x, digpos.y, digpos.z) ~= true then
+ local forward_cost, forward_items = digtron.mark_diggable(digpos, nodes_dug)
+ for _, item in pairs(forward_items) do
+ table.insert(items, item)
+ end
+ cost = cost + forward_cost
+ end
+ if protected_nodes:get(digdown.x, digdown.y, digdown.z) ~= true then
+ local down_cost, down_items = digtron.mark_diggable(digdown, nodes_dug)
+ for _, item in pairs(down_items) do
+ table.insert(items, item)
+ end
+ cost = cost + down_cost
+ end
+
+ return cost, items
+ end,
+
+ damage_creatures = function(player, pos, controlling_coordinate)
+ local facing = minetest.get_node(pos).param2
+ digtron.damage_creatures(player, digtron.find_new_pos(pos, facing), 8)
+ digtron.damage_creatures(player, digtron.find_new_pos_downward(pos, facing), 8)
+ end,
+})
+
+-- Digs out soft nodes that are "in front" of the digger head and "below" the digger head (can be rotated).
+minetest.register_node("digtron:dual_soft_digger", {
+ description = S("Digtron Dual Soft Material Digger Head"),
+ _doc_items_longdesc = digtron.doc.dual_soft_digger_longdesc,
+ _doc_items_usagehelp = digtron.doc.dual_soft_digger_usagehelp,
+ groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 3},
+ drop = "digtron:dual_soft_digger",
+ sounds = digtron.metal_sounds,
+ paramtype = "light",
+ paramtype2= "facedir",
+ is_ground_content = false,
+ drawtype="nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = dual_digger_nodebox,
+ },
+
+ -- Aims in the +Z and -Y direction by default
+ tiles = {
+ "digtron_plate.png^digtron_motor.png^[colorize:" .. digtron.soft_digger_colorize,
+ {
+ name = "digtron_digger_yb.png^[colorize:" .. digtron.soft_digger_colorize,
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ },
+ "digtron_plate.png^[colorize:" .. digtron.soft_digger_colorize,
+ "digtron_plate.png^[transformR180^[colorize:" .. digtron.soft_digger_colorize,
+ {
+ name = "digtron_digger_yb.png^[colorize:" .. digtron.soft_digger_colorize,
+ animation = {
+ type = "vertical_frames",
+ aspect_w = 16,
+ aspect_h = 16,
+ length = 1.0,
+ },
+ },
+ "digtron_plate.png^digtron_motor.png^[colorize:" .. digtron.soft_digger_colorize,
+ },
+
+ -- returns fuel_cost, items_produced
+ execute_dig = function(pos, protected_nodes, nodes_dug, controlling_coordinate, lateral_dig)
+ local facing = minetest.get_node(pos).param2
+ local digpos = digtron.find_new_pos(pos, facing)
+ local digdown = digtron.find_new_pos_downward(pos, facing)
+
+ local items = {}
+ local cost = 0
+
+ if protected_nodes:get(digpos.x, digpos.y, digpos.z) ~= true and digtron.is_soft_material(digpos) then
+ local forward_cost, forward_items = digtron.mark_diggable(digpos, nodes_dug)
+ for _, item in pairs(forward_items) do
+ table.insert(items, item)
+ end
+ cost = cost + forward_cost
+ end
+ if protected_nodes:get(digdown.x, digdown.y, digdown.z) ~= true and digtron.is_soft_material(digdown) then
+ local down_cost, down_items = digtron.mark_diggable(digdown, nodes_dug)
+ for _, item in pairs(down_items) do
+ table.insert(items, item)
+ end
+ cost = cost + down_cost
+ end
+
+ return cost, items
+ end,
+
+ damage_creatures = function(player, pos, controlling_coordinate)
+ local facing = minetest.get_node(pos).param2
+ digtron.damage_creatures(player, digtron.find_new_pos(pos, facing), 4)
+ digtron.damage_creatures(player, digtron.find_new_pos_downward(pos, facing), 4)
+ end,
+}) \ No newline at end of file