125 lines
3.0 KiB
Lua
125 lines
3.0 KiB
Lua
--
|
|
--- Medic Paxel
|
|
--
|
|
|
|
local DIG_SPEED = 0.1
|
|
local PAXEL_POWER = 50 -- currently just blocks count
|
|
local PAXEL_COOLDOWN_TIME = 20
|
|
|
|
local dig_timers = {}
|
|
|
|
local function is_diggable(node)
|
|
local name = node.name
|
|
return name:find("default:") and (
|
|
name:find("cobble") or name:find("wood" ) or
|
|
name:find("leaves") or name:find("dirt" ) or
|
|
name:find("gravel") or name:find("sand" ) or
|
|
name:find("tree" ) or name:find("brick") or
|
|
name:find("glass" ) or name:find("ice" ) or
|
|
name:find("snow" )
|
|
)
|
|
or name:find("stairs:")
|
|
end
|
|
|
|
local function dig(pname, ppos, power)
|
|
if power <= 1 then
|
|
hud_events.new(pname, {
|
|
quick = true,
|
|
text = "Pillar digging went too far",
|
|
color = "warning",
|
|
})
|
|
dig_timers[pname] = nil
|
|
return
|
|
end
|
|
|
|
for y = 1, 20 do
|
|
local pos = vector.offset(ppos, 0, y, 0)
|
|
local node = minetest.get_node(pos)
|
|
if node.name ~= "air" then
|
|
if is_diggable(node) then
|
|
minetest.dig_node(pos)
|
|
dig_timers[pname] = minetest.after(DIG_SPEED, dig, pname, pos, power - 1)
|
|
else
|
|
hud_events.new(pname, {
|
|
quick = true,
|
|
text = "Pillar digging stopped at undiggable node",
|
|
color = "warning",
|
|
})
|
|
dig_timers[pname] = nil
|
|
end
|
|
|
|
return
|
|
end
|
|
end
|
|
|
|
hud_events.new(pname, {
|
|
quick = true,
|
|
text = "Pillar digging has nothing more to dig",
|
|
color = "warning",
|
|
})
|
|
dig_timers[pname] = nil
|
|
end
|
|
|
|
minetest.register_tool("ctf_mode_classes:support_paxel", {
|
|
description = "Paxel",
|
|
inventory_image = "default_tool_bronzepick.png^default_tool_bronzeshovel.png",
|
|
tool_capabilities = {
|
|
full_punch_interval = 1.0,
|
|
max_drop_level = 1,
|
|
groupcaps = {
|
|
cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=0, maxlevel=2},
|
|
crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=0, maxlevel=2},
|
|
choppy = {times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=0, maxlevel=2},
|
|
},
|
|
damage_groups = {fleshy=4},
|
|
punch_attack_uses = 0,
|
|
},
|
|
groups = {pickaxe = 1, tier = 10},
|
|
sound = {breaks = "default_tool_breaks"},
|
|
|
|
on_place = function(itemstack, user, pointed_thing)
|
|
if pointed_thing and itemstack:get_wear() == 0 then
|
|
local pos = pointed_thing.under
|
|
if is_diggable(minetest.get_node(pos)) then
|
|
local pname = user:get_player_name()
|
|
|
|
minetest.dig_node(pos)
|
|
|
|
if dig_timers[pname] then
|
|
dig_timers[pname]:cancel()
|
|
end
|
|
|
|
dig_timers[pname] = minetest.after(DIG_SPEED, dig, pname, pos, PAXEL_POWER)
|
|
|
|
local dstep = math.floor(65534 / PAXEL_COOLDOWN_TIME)
|
|
ctf_modebase.update_wear.start_update(pname, "ctf_mode_classes:support_paxel", dstep, true)
|
|
|
|
itemstack:set_wear(65534)
|
|
return itemstack
|
|
else
|
|
hud_events.new(user, {
|
|
quick = true,
|
|
text = "Can't start pillar digging at undiggable node",
|
|
color = "warning",
|
|
})
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
|
|
ctf_api.register_on_match_end(function()
|
|
for _, timer in pairs(dig_timers) do
|
|
timer:cancel()
|
|
end
|
|
|
|
dig_timers = {}
|
|
end)
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
local pname = player:get_player_name()
|
|
|
|
if dig_timers[pname] then
|
|
dig_timers[pname]:cancel()
|
|
end
|
|
end)
|