Readd paxel pillar digging ability

This commit is contained in:
savilli 2022-02-12 21:53:26 +01:00
parent 78ff839421
commit 008551df40
4 changed files with 126 additions and 23 deletions

View File

@ -187,28 +187,6 @@ local scaling_def = {
minetest.register_node("ctf_mode_classes:scaling_ladder", scaling_def)
--
--- Medic Paxel
--
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"},
})
--
--- Medic Bandage
--

View File

@ -4,6 +4,7 @@ local features = ctf_modebase.features(rankings, recent_rankings)
local crafts, classes = ctf_core.include_files(
"crafts.lua",
"paxel.lua",
"classes.lua"
)

View File

@ -1,2 +1,2 @@
name = ctf_mode_classes
depends = ctf_modebase, ctf_melee, ctf_gui, ctf_cosmetics, hud_events
depends = ctf_modebase, ctf_melee, ctf_gui, ctf_cosmetics, ctf_api, hud_events

View File

@ -0,0 +1,124 @@
--
--- 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)