capturetheflag/mods/ctf_match/matches.lua

144 lines
3.5 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", 2)
ctf._set("match.team.1", "red")
ctf._set("match.team.1.color", "red")
ctf._set("match.team.1.pos", "7,65,93")
ctf._set("match.team.2", "blue")
ctf._set("match.team.2.color", "blue")
ctf._set("match.team.2.pos", "-22,66,-78")
ctf._set("match.clear_inv", false)
end)
ctf_match.registered_on_new_match = {}
function ctf_match.register_on_new_match(func)
if ctf._mt_loaded then
error("You can't register callbacks at game time!")
end
table.insert(ctf_match.registered_on_new_match, func)
end
ctf_match.registered_on_winner = {}
function ctf_match.register_on_winner(func)
if ctf._mt_loaded then
error("You can't register callbacks at game time!")
end
table.insert(ctf_match.registered_on_winner, func)
end
-- Load next match. May be overrided
function ctf_match.next()
for i = 1, #ctf_match.registered_on_new_match do
ctf_match.registered_on_new_match[i]()
end
ctf.reset()
-- Note: ctf.reset calls register_on_new_game, below.
end
-- Check for winner
local game_won = false
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!
if not game_won then
game_won = true
ctf.action("match", winner .. " won!")
minetest.chat_send_all("Team " .. winner .. " won!")
for i = 1, #ctf_match.registered_on_winner do
ctf_match.registered_on_winner[i](winner)
end
minetest.after(2, function()
game_won = false
if ctf.setting("match") then
ctf_match.next()
end
end)
end
end
function ctf_match.create_teams()
local number = ctf.setting("match.teams")
for i = 1, number do
print("Creating team #" .. i)
local name = ctf.setting("match.team." .. i)
local color = ctf.setting("match.team." .. i .. ".color")
local pos = ctf.setting("match.team." .. i .. ".pos")
local flag = minetest.string_to_pos(pos)
if name and color and pos and flag then
print(" - Success in getting settings")
ctf.team({
name = name,
color = color,
add_team = true
})
ctf_flag.add(name, flag)
minetest.after(0, function()
ctf_flag.assert_flag(flag)
end)
end
end
end
ctf.register_on_new_game(function()
ctf_match.create_teams()
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.set_timeofday(0.4)
minetest.chat_send_all("Next round!")
if minetest.global_exists("chatplus") then
chatplus.log("Next round!")
end
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)