2023-01-14 09:56:57 -05:00

77 lines
2.4 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local ItemStack, minetest, nodecore, string
= ItemStack, minetest, nodecore, string
local string_format
= string.format
-- LUALOCALS > ---------------------------------------------------------
local modname = minetest.get_current_modname()
local supername = modname .. ":super"
local superdef = nodecore.underride({
description = "Admin Tool",
light_source = 14,
tiles = {"[combine:1x1^[noalpha^[colorize:#ffffff:255"},
inventory_image = modname .. "_admintool.png",
tool_capabilities = nodecore.toolcaps({
uses = 0,
cracky = 100,
crumbly = 100,
choppy = 100,
snappy = 100,
thumpy = 100
}),
groups = {cheat = 1},
virtual_item = true,
on_drop = function() return ItemStack("") end,
on_place = function() end
}, minetest.registered_nodes[modname .. ":hand"])
superdef.on_use = nil
minetest.register_node(supername, superdef)
minetest.register_chatcommand("nckfa", {
description = "Summon admin tool",
privs = {give = true},
func = function(name)
minetest.registered_chatcommands.giveme.func(name, supername)
end
})
local cooldown = {}
minetest.register_on_punchnode(function(pos, node, puncher)
if not (puncher and puncher:is_player()) then return end
local ctl = puncher:get_player_control()
if not (ctl.sneak and ctl.aux1) then return end
local wield = puncher:get_wielded_item()
if wield:get_name() ~= supername then return end
if node.name == "air" or node.name == "ignore" then return end
local now = minetest.get_us_time()
local pname = puncher:get_player_name()
local cd = cooldown[pname]
if cd and cd > now then return end
cooldown[pname] = now + 250 * 1000
if not nodecore.stack_giveto(pos, puncher) then
nodecore.item_eject(pos, nodecore.stack_get(pos))
end
nodecore.log("action", string_format("%s super-digs %s at %s",
pname, node.name, minetest.pos_to_string(pos)))
local def = minetest.registered_nodes[node.name]
if (not def) or (not def.air_equivalent) and (not def.groups.is_stack_only) then
local stack = ItemStack(node.name)
stack:get_meta():from_table({fields = minetest.get_meta(pos)
:to_table().field})
stack = puncher:get_inventory():add_item("main", stack)
if not stack:is_empty() then nodecore.item_eject(pos, stack) end
end
minetest.remove_node(pos)
return nodecore.fallcheck(pos)
end)