capturetheflag/mods/ctf_match/matches.lua
2015-11-22 20:07:41 +00:00

140 lines
3.3 KiB
Lua

ctf.register_on_init(function()
ctf._set("match", false)
ctf._set("match.destroy_team", false)
ctf._set("match.break_alliances", true)
ctf._set("match.teams", "")
ctf._set("match.clear_inv", false)
end)
-- Load next match. May be overrided
function ctf_match.next()
ctf.reset()
-- Note: ctf.reset calls register_on_new_game, below.
end
-- Check for winner
function ctf_match.check_for_winner()
local winner
for name, team in pairs(ctf.teams) do
if winner then
return
end
winner = name
end
-- There is a winner!
ctf.action("match", winner .. " won!")
minetest.chat_send_all("Team " .. winner .. " won!")
if ctf.setting("match") then
ctf_match.next()
end
end
ctf.register_on_new_game(function()
local function safe_place(pos, node)
ctf.log("match", "attempting to place...")
minetest.get_voxel_manip(pos, { x = pos.x + 1, y = pos.y + 1, z = pos.z + 1})
minetest.set_node(pos, node)
if minetest.get_node(pos).name ~= node.name then
ctf.error("match", "failed to place node, retrying...")
minetest.after(0.5, function()
safe_place(pos, node)
end)
end
end
local teams = ctf.setting("match.teams")
if teams:trim() == "" then
return
end
ctf.log("match", "Setting up new game!")
teams = teams:split(";")
local pos = {}
for i, v in pairs(teams) do
local team = v:split(",")
if #team == 5 then
local name = team[1]:trim()
local color = team[2]:trim()
local x = tonumber(team[3]:trim())
local y = tonumber(team[4]:trim())
local z = tonumber(team[5]:trim())
pos[name] = {
x = x,
y = y,
z = z
}
ctf.team({
name = name,
color = color,
add_team = true
})
ctf_flag.add(name, pos[name])
else
ctf.warning("match", "Invalid team setup: " .. dump(v))
end
end
minetest.after(0, function()
for name, flag in pairs(pos) do
safe_place(flag, {name = "ctf_flag:flag"})
ctf_flag.update(flag)
local function base_at(flag, dx, dz)
safe_place({
x = flag.x + dx,
y = flag.y - 1,
z = flag.z + dz,
}, { name = "ctf_flag:ind_base"})
end
base_at(flag, -1, -1)
base_at(flag, -1, 0)
base_at(flag, -1, 1)
base_at(flag, 0, -1)
base_at(flag, 0, 0)
base_at(flag, 0, 1)
base_at(flag, 1, -1)
base_at(flag, 1, 0)
base_at(flag, 1, 1)
end
end)
for i, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name()
local alloc_mode = tonumber(ctf.setting("allocate_mode"))
local team = ctf.autoalloc(name, alloc_mode)
if alloc_mode ~= 0 and team then
ctf.log("autoalloc", name .. " was allocated to " .. team)
ctf.join(name, team)
end
ctf.move_to_spawn(name)
if ctf.setting("match.clear_inv") then
local inv = player:get_inventory()
inv:set_list("main", {})
inv:set_list("craft", {})
give_initial_stuff(player)
end
player:set_hp(20)
end
minetest.chat_send_all("Next round!")
end)
ctf_flag.register_on_capture(function(attname, flag)
if not ctf.setting("match.destroy_team") then
return
end
local fl_team = ctf.team(flag.team)
if fl_team and #fl_team.flags == 0 then
ctf.action("match", flag.team .. " was defeated.")
ctf.remove_team(flag.team)
minetest.chat_send_all(flag.team .. " has been defeated!")
end
ctf_match.check_for_winner()
end)