102 lines
2.8 KiB
Lua
102 lines
2.8 KiB
Lua
ctf.register_on_init(function()
|
|
ctf._set("endgame.destroy_team", true)
|
|
ctf._set("endgame.break_alliances", true)
|
|
ctf._set("endgame.reset_on_winner", true)
|
|
end)
|
|
|
|
local function safe_place(pos, node)
|
|
ctf.log("endgame", "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("endgame", "failed to place node, retrying...")
|
|
minetest.after(0.5, function()
|
|
safe_place(pos, node)
|
|
end)
|
|
end
|
|
end
|
|
|
|
ctf_flag.register_on_capture(function(attname, flag)
|
|
if not ctf.setting("endgame.destroy_team") then
|
|
return
|
|
end
|
|
|
|
local fl_team = ctf.team(flag.team)
|
|
if fl_team and #fl_team.flags == 0 then
|
|
ctf.action("endgame", flag.team .. " was defeated.")
|
|
ctf.remove_team(flag.team)
|
|
minetest.chat_send_all(flag.team .. " has been defeated!")
|
|
end
|
|
|
|
if ctf.setting("endgame.reset_on_winner") then
|
|
local winner = nil
|
|
for name, team in pairs(ctf.teams) do
|
|
if winner then
|
|
return
|
|
end
|
|
winner = name
|
|
end
|
|
|
|
-- Only one team left!
|
|
ctf.action("endgame", winner .. " won!")
|
|
minetest.chat_send_all("Team " .. winner .. " won!")
|
|
minetest.chat_send_all("Resetting the map, this may take a few moments...")
|
|
minetest.after(0.5, function()
|
|
minetest.delete_area(vector.new(-16*3, -16*3, -16*3), vector.new(16*3, 16*3, 16*3))
|
|
|
|
minetest.after(1, function()
|
|
ctf.reset()
|
|
end)
|
|
end)
|
|
end
|
|
end)
|
|
|
|
ctf.register_on_new_game(function()
|
|
ctf.log("endgame", "Setting up new game!")
|
|
|
|
ctf.team({name="red", color="red", add_team=true})
|
|
ctf.team({name="blue", color="blue", add_team=true})
|
|
|
|
local fred = {x=15, y=7, z=39, team="red"}
|
|
local fblue = {x=-9, y=9, z=-50, team="blue"}
|
|
ctf_flag.add("red", fred)
|
|
ctf_flag.add("blue", fblue)
|
|
|
|
minetest.after(0, function()
|
|
safe_place(fred, {name="ctf_flag:flag"})
|
|
safe_place(fblue, {name="ctf_flag:flag"})
|
|
end)
|
|
|
|
for i, player in pairs(minetest.get_connected_players()) do
|
|
local name = player:get_player_name()
|
|
local inv = player:get_inventory()
|
|
inv:set_list("main", {})
|
|
inv:set_list("craft", {})
|
|
|
|
local alloc_mode = tonumber(ctf.setting("allocate_mode"))
|
|
if alloc_mode == 0 then
|
|
return
|
|
end
|
|
local team = ctf.autoalloc(name, alloc_mode)
|
|
if team then
|
|
ctf.log("autoalloc", name .. " was allocated to " .. team)
|
|
ctf.join(name, team)
|
|
end
|
|
|
|
team = ctf.player(name).team
|
|
if ctf.team(team) then
|
|
local spawn = ctf.get_spawn(team)
|
|
if spawn then
|
|
player:moveto(spawn, false)
|
|
end
|
|
end
|
|
|
|
minetest.log("action", "Giving initial stuff to player "..player:get_player_name())
|
|
player:get_inventory():add_item('main', 'default:pick_steel')
|
|
player:get_inventory():add_item('main', 'default:sword_steel')
|
|
player:get_inventory():add_item('main', 'default:cobble 99')
|
|
end
|
|
minetest.log("endgame", "reset done")
|
|
minetest.chat_send_all("Next round!")
|
|
end)
|