2020-02-14 21:22:14 -05:00

110 lines
3.1 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local ipairs, minetest, nodecore, pairs, table, vector
= ipairs, minetest, nodecore, pairs, table, vector
local table_sort
= table.sort
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
minetest.register_tool(modname .. ":rake", {
description = "Rake",
inventory_image = modname .. "_rake.png",
tool_capabilities = nodecore.toolcaps({
snappy = 1,
uses = 10
}),
sounds = nodecore.sounds("nc_tree_sticky")
})
local rakable = {}
local stackonly = {}
minetest.after(0, function()
for k, v in pairs(minetest.registered_nodes) do
if v.groups and v.groups.falling_node and v.groups.snappy == 1 then
rakable[k] = true
if v.groups.is_stack_only then stackonly[k] = true end
end
end
end)
local rakepos = {}
for dy = -1, 1 do
for dx = -2, 2 do
for dz = -2, 2 do
rakepos[#rakepos + 1] = {x = dx, y = dy, z = dz}
end
end
end
table_sort(rakepos, function(a, b) return vector.length(a) < vector.length(b) end)
local laststack
local lastraking
local old_node_dig = minetest.node_dig
minetest.node_dig = function(pos, node, user, ...)
laststack = nodecore.stack_get(pos)
local wield = user and user:is_player() and user:get_wielded_item()
lastraking = wield and wield:get_name() == modname .. ":rake"
return old_node_dig(pos, node, user, ...)
end
local function matching(pa, na, pb, nb)
if stackonly[na.name] then
if not stackonly[nb.name] then return end
minetest.log(nodecore.stack_get(pa):get_name() .. " ?= "
.. nodecore.stack_get(pb):get_name())
return (laststack and laststack:get_name()) == nodecore.stack_get(pb):get_name()
end
return na.name == nb.name
end
local function dorake(pos, node, user, ...)
local sneak = user:get_player_control().sneak
for _, rel in ipairs(rakepos) do
local p = vector.add(pos, rel)
local n = minetest.get_node(p)
if rakable[n.name] and ((not sneak) or matching(pos, node, p, n)) then
minetest.node_dig(p, n, user, ...)
end
for _, obj in pairs(nodecore.get_objects_at_pos(p)) do
local lua = obj and obj.get_luaentity and obj:get_luaentity()
if lua and lua.name == "__builtin:item" then
obj:set_pos(pos)
end
end
end
end
local rakelock = {}
minetest.register_on_dignode(function(pos, node, user, ...)
if not lastraking then return end
if not (node and node.name and rakable[node.name]) then return end
if not user:is_player() then return end
local pname = user:get_player_name()
if rakelock[pname] then return end
rakelock[pname] = true
dorake(pos, node, user, ...)
rakelock[pname] = nil
lastraking = nil
end)
local adze = {name = modname .. ":adze", wear = 0.05}
nodecore.register_craft({
label = "assemble rake",
norotate = true,
nodes = {
{match = "nc_tree:stick", replace = "air"},
{x = 0, z = -1, match = adze, replace = "air"},
{x = 0, z = 1, match = adze, replace = "air"},
{x = -1, z = 0, match = adze, replace = "air"},
{x = 1, z = 0, match = adze, replace = "air"},
},
items = {
modname .. ":rake"
}
})