NodeCore mod that adds contraptions
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.3 KiB

local minetest, vector, nodecore, include
= minetest, vector, nodecore, include
local search = include("search")
local contraption = include("contraption")
local mod_name = minetest.get_current_modname()
local i_stick = "nc_tree:stick"
local i_staff = "nc_tree:staff"
local i_frame = "nc_woodwork:frame"
local i_form = "nc_woodwork:form"
local i_plank = "nc_woodwork:plank"
local t_plank = "nc_woodwork_plank.png"
local t_frame_log = "(nc_tree_tree_side.png^[mask:nc_api_storebox_frame.png^[opacity:127)"
-- Load and save contraptions.
contraption.on_startup()
minetest.register_on_shutdown(contraption.on_shutdown)
-- `on_global_step` updates and moves around active contraptions.
minetest.register_globalstep(contraption.on_global_step)
-- Punching a contraption applies some force to it.
-- Multiple players can push a contraption more effectively.
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
local contrap = contraption.find(pos)
if not contrap then return end
if (not pointed_thing.above) or (not pointed_thing.under) then return end
local dir = vector.subtract(pointed_thing.under, pointed_thing.above)
contrap:push(puncher, dir)
end)
-- TODO: Provide a method to register additional types of contraption blocks.
minetest.register_node(mod_name .. ":contraption_wood", {
description = "Wooden Contraption",
tiles = { t_plank .. "^" .. t_frame_log },
sounds = nodecore.sounds("nc_tree_woody"),
groups = {
choppy = 1,
flammable = 2,
fire_fuel = 5,
},
on_dig = function(pos, node, digger)
local contrap = contraption.find(pos)
if contrap then contrap:destroy()
else minetest.node_dig(pos, node, digger) end
end,
drop_in_place = "nc_woodwork:plank",
})
-- TODO: Take priority over or hook into frame-to-form recipe to do our thing instead.
nodecore.register_craft({
label = "assemble wooden contraption",
action = "pummel",
priority = 1,
toolgroups = { thumpy = 3 },
indexkeys = { i_frame },
nodes = { { match = i_frame } },
check = function(pos, data)
data.found_square = search.find_rectangle(pos, i_frame)
return not not data.found_square
end,
after = function(pos, data)
contraption.create(data.found_square)
end,
})