capturetheflag/mods/ctf/ctf_classes/melee.lua
2021-09-03 07:22:20 -07:00

100 lines
2.9 KiB
Lua

local sword_special_timer = {}
local SWORD_SPECIAL_COOLDOWN = 20
local function sword_special_timer_func(pname, timeleft)
sword_special_timer[pname] = timeleft
if timeleft - 2 >= 0 then
minetest.after(2, sword_special_timer_func, pname, timeleft - 2)
else
sword_special_timer[pname] = nil
end
end
minetest.register_tool("ctf_classes:sword_bronze", {
description = "Knight's Sword\nSneak+Rightclick items/air to place marker\nRightclick enemies to place marker listing all enemies in area",
inventory_image = "default_tool_bronzesword.png",
tool_capabilities = {
full_punch_interval = 0.8,
max_drop_level=1,
groupcaps={
snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=0, maxlevel=2},
},
damage_groups = {fleshy=6, sword=1},
punch_attack_uses = 0,
},
sound = {breaks = "default_tool_breaks"},
on_place = function(itemstack, placer, pointed_thing)
local pname = placer:get_player_name()
if not pointed_thing then return end
if sword_special_timer[pname] and placer:get_player_control().sneak then
minetest.chat_send_player(pname, "You have to wait "..sword_special_timer[pname].."s to place marker again")
if pointed_thing.type == "node" then
return minetest.item_place(itemstack, placer, pointed_thing)
else
return
end
end
local pteam = ctf.player(pname).team
if not pteam then -- can be nil during map change
return
end
if pointed_thing.type == "object" and pointed_thing.ref:is_player() then
if ctf_match.is_in_build_time() then return end
local enemies = {}
local pos = pointed_thing.ref:get_pos()
sword_special_timer[pname] = SWORD_SPECIAL_COOLDOWN
sword_special_timer_func(pname, SWORD_SPECIAL_COOLDOWN)
for _, p in pairs(minetest.get_connected_players()) do
local name = p:get_player_name()
if pteam ~= ctf.player(name).team and
vector.distance(p:get_pos(), pos) <= 10 then
table.insert(enemies, name)
end
end
if #enemies > 0 then
ctf_marker.remove_marker(pteam)
ctf_marker.add_marker(pname, pteam, pos, (" found enemies: <%s>]"):format(table.concat(enemies, ", ")))
end
return
end
if pointed_thing.type == "node" then
return minetest.item_place(itemstack, placer, pointed_thing)
end
-- Check if player is sneaking before placing marker
if not placer:get_player_control().sneak then return end
sword_special_timer[pname] = 4
sword_special_timer_func(pname, 4)
minetest.registered_chatcommands["m"].func(pname, "placed with sword")
end,
on_secondary_use = function(itemstack, user, pointed_thing)
if pointed_thing then
minetest.registered_tools["ctf_classes:sword_bronze"].on_place(itemstack, user, pointed_thing)
end
end,
})
minetest.register_on_leaveplayer(function(player)
sword_special_timer[player:get_player_name()] = nil
end)
ctf_match.register_on_new_match(function()
sword_special_timer = {}
end)
ctf.register_on_new_game(function()
sword_special_timer = {}
end)