Rework flag capturing

This commit is contained in:
rubenwardy 2015-07-13 14:32:41 +01:00
parent b2cc033d1b
commit ab87623c91
4 changed files with 105 additions and 93 deletions

View File

@ -0,0 +1,2 @@
ctf
ctf_flag

View File

@ -0,0 +1,9 @@
ctf.register_on_init(function()
ctf._set("players_can_change_team", true)
ctf._set("endgame", true)
ctf._set("endgame.break_alliances", true)
end)
ctf_flag.register_on_flag_capture(function(team, flag)
end)

View File

@ -1,29 +1,77 @@
local function do_capture(attname, flag, returned)
print("Do capture " .. attname)
print(flag.x .. ", " .. flag.y .. ", " .. flag.z)
local team = flag.team
local attacker = ctf.player(attname)
local flag_name = ""
if flag.name then
flag_name = flag.name .. " "
end
flag_name = team .. "'s " .. flag_name .. "flag"
if ctf.setting("flag.capture_take") and not returned then
minetest.chat_send_all(flag_name.." has been captured from "..team..
" by "..attname.." (team "..attacker.team..")")
ctf.action("flag", attname .. " picked up " .. flag_name)
-- Post to flag owner's board
ctf.post(team, {
msg = flag_name .. " has been taken by " .. attname .. " of ".. attacker.team,
icon="flag_red" })
-- Post to attacker's board
ctf.post(attacker.team, {
msg = attname .. " snatched '" .. flag_name .. "' from " .. team,
icon="flag_green"})
-- Add to claimed list
flag.claimed = {
team = attacker.team,
player = attname
}
table.insert(ctf_flag.claimed, flag)
else
minetest.chat_send_all(flag_name.." has been captured from "..team..
" by "..attname.." (team "..attacker.team..")")
ctf.action("flag", attname .. " captured " .. flag_name)
-- Post to flag owner's board
ctf.post(team, {
msg = flag_name .. " has been captured by " .. attacker.team,
icon="flag_red"})
-- Post to attacker's board
ctf.post(attacker.team, {
msg = attname .. " captured '" .. flag_name .. "' from " .. team,
icon="flag_green"})
-- Take flag
if ctf.setting("flag.allow_multiple") then
ctf_flag.delete(team, vector.new(flag))
ctf_flag.add(attacker.team, vector.new(flag))
else
minetest.env:set_node(pos,{name="air"})
ctf_flag.delete(team,pos)
end
end
ctf.save()
end
ctf_flag = { ctf_flag = {
on_punch_top = function(pos, node, puncher) on_punch_top = function(pos, node, puncher)
pos.y = pos.y - 1 pos.y = pos.y - 1
ctf_flag.on_punch(pos, node, puncher) ctf_flag.on_punch(pos, node, puncher)
end, end,
on_rightclick_top = function(pos, node, clicker) on_rightclick_top = function(pos, node, clicker)
pos.y = pos.y - 1 pos.y = pos.y - 1
ctf_flag.on_rightclick(pos, node, clicker)
local flag = ctf_flag.get(pos)
if not flag then
return
end
if flag.claimed then
if ctf.setting("flag.capture_take") then
minetest.chat_send_player(player, "This flag has been taken by ".. flag.claimed.player)
minetest.chat_send_player(player, "who is a member of team ".. flag.claimed.team)
return
else
minetest.chat_send_player(player, "Oops! This flag should not be captured. Reverting.")
flag.claimed = nil
end
end
ctf.gui.flag_board(clicker:get_player_name(),pos)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
local flag = ctf_flag.get(pos) local flag = ctf_flag.get(pos)
@ -71,59 +119,22 @@ ctf_flag = {
end end
if ctf.team(team) and ctf.player(player).team then if ctf.team(team) and ctf.player(player).team then
if ctf.player(player).team ~= team then if ctf.player(player).team == team then
local diplo = ctf.diplo.get(team, ctf.player(player).team) -- Clicking on their team's flag
if ctf.setting("flag.capture_take") then
if not diplo then ctf_flag._flagret(player)
diplo = ctf.setting("default_diplo_state")
end end
else
-- Clicked on another team's flag
local diplo = ctf.diplo.get(team, ctf.player(player).team) or
ctf.setting("default_diplo_state")
if diplo ~= "war" then if diplo ~= "war" then
minetest.chat_send_player(player, "You are at peace with this team!") minetest.chat_send_player(player, "You are at peace with this team!")
return return
end end
local flag_name = flag.name do_capture(player, flag)
if ctf.setting("flag.capture_take") then
if flag_name and flag_name~="" then
minetest.chat_send_all(flag_name.." has been taken from "..team.." by "..player.." (team "..ctf.player(player).team..")")
ctf.post(team,{msg=flag_name.." has been taken by "..ctf.player(player).team,icon="flag_red"})
ctf.post(ctf.player(player).team,{msg=player.." snatched '"..flag_name.."' from "..team,icon="flag_green"})
else
minetest.chat_send_all(team.."'s flag at ("..pos.x..","..pos.z..") has taken by "..player.." (team "..ctf.player(player).team..")")
ctf.post(team,{msg="The flag at ("..pos.x..","..pos.z..") has been taken by "..ctf.player(player).team,icon="flag_red"})
ctf.post(ctf.player(player).team,{msg=player.." snatched flag ("..pos.x..","..pos.z..") from "..team,icon="flag_green"})
end
flag.claimed = {
team = ctf.player(player).team,
player = player
}
table.insert(ctf_flag.claimed, flag)
else
if flag_name and flag_name~="" then
minetest.chat_send_all(flag_name.." has been taken from "..team.." by "..player.." (team "..ctf.player(player).team..")")
ctf.post(team,{msg=flag_name.." has been captured by "..ctf.player(player).team,icon="flag_red"})
ctf.post(ctf.player(player).team,{msg=player.." captured '"..flag_name.."' from "..team,icon="flag_green"})
else
minetest.chat_send_all(team.."'s flag at ("..pos.x..","..pos.z..") has been captured by "..player.." (team "..ctf.player(player).team..")")
ctf.post(team,{msg="The flag at ("..pos.x..","..pos.z..") has been captured by "..ctf.player(player).team,icon="flag_red"})
ctf.post(ctf.player(player).team,{msg=player.." captured flag ("..pos.x..","..pos.z..") from "..team,icon="flag_green"})
end
ctf.team(team).spawn = nil
if ctf.setting("flag.allow_multiple") == true then
ctf_flag.delete(team,pos)
ctf_flag.add(ctf.player(player).team,pos)
else
minetest.env:set_node(pos,{name="air"})
ctf_flag.delete(team,pos)
end
end
ctf.save()
else
-- Clicking on their team's flag
if ctf.setting("flag.capture_take") then
ctf_flag._flagret(player)
end
end end
else else
minetest.chat_send_player(puncher:get_player_name(),"You are not part of a team!") minetest.chat_send_player(puncher:get_player_name(),"You are not part of a team!")
@ -133,27 +144,7 @@ ctf_flag = {
minetest.chat_send_player(player, "Own flag") minetest.chat_send_player(player, "Own flag")
for i = 1, #ctf_flag.claimed do for i = 1, #ctf_flag.claimed do
if ctf_flag.claimed[i].claimed.player == player then if ctf_flag.claimed[i].claimed.player == player then
minetest.chat_send_player(player,"Returning flag") do_capture(player, ctf_flag.claimed[i], true)
local fteam = ctf.team(ctf_flag.claimed[i].team)
local flag_name = ctf_flag.claimed[i].name
if flag_name and flag_name~="" then
minetest.chat_send_all(flag_name.." has been taken from "..fteam.data.name.." by "..ctf_flag.claimed[i].claimed.player.." (team "..ctf_flag.claimed[i].claimed.team..")")
ctf.post(fteam,{msg=flag_name.." has been captured by "..ctf_flag.claimed[i].claimed.team,icon="flag_red"})
ctf.post(ctf_flag.claimed[i].claimed.team,{msg=player.." captured '"..flag_name.."' from "..fteam.data.name,icon="flag_green"})
else
minetest.chat_send_all(fteam.data.name.."'s flag at ("..ctf_flag.claimed[i].x..","..ctf_flag.claimed[i].z..") has been captured by "..player.." (team "..ctf_flag.claimed[i].claimed.team..")")
ctf.post(fteam.data.name,{msg="The flag at ("..ctf_flag.claimed[i].x..","..ctf_flag.claimed[i].z..") has been captured by "..ctf_flag.claimed[i].claimed.team,icon="flag_red"})
ctf.post(ctf_flag.claimed[i].claimed.team,{msg=player.." captured flag ("..ctf_flag.claimed[i].x..","..ctf_flag.claimed[i].z..") from "..fteam.data.name,icon="flag_green"})
end
fteam.spawn = nil
local fpos = {x=ctf_flag.claimed[i].x,y=ctf_flag.claimed[i].y,z=ctf_flag.claimed[i].z}
if ctf.setting("flag.allow_multiple") == true then
ctf_flag.delete(fteam.data.name,fpos)
ctf_flag.add(ctf_flag.claimed[i].claimed.team,fpos)
else
minetest.env:set_node(fpos,{name="air"})
ctf_flag.delete(fteam.data.name,fpos)
end
ctf_flag.collect_claimed() ctf_flag.collect_claimed()
end end
end end

View File

@ -8,6 +8,7 @@ ctf.register_on_init(function()
ctf._set("gui.tab.flags", true) ctf._set("gui.tab.flags", true)
ctf._set("gui.team.teleport_to_flag", true) ctf._set("gui.team.teleport_to_flag", true)
ctf._set("gui.team.teleport_to_spawn", false) ctf._set("gui.team.teleport_to_spawn", false)
ctf._set("flag.capture_mode", "take")
end) end)
ctf.register_on_new_team(function(team) ctf.register_on_new_team(function(team)
team.flags = {} team.flags = {}
@ -32,7 +33,6 @@ ctf.register_on_territory_query(function(pos)
return closest_team, closest_distSQ return closest_team, closest_distSQ
end) end)
ctf_flag = {}
function ctf.get_spawn(team) function ctf.get_spawn(team)
if not ctf.team(team) then if not ctf.team(team) then
return nil return nil
@ -50,9 +50,18 @@ function ctf.get_spawn(team)
return nil return nil
end end
end end
dofile(minetest.get_modpath("ctf_flag") .. "/gui.lua") dofile(minetest.get_modpath("ctf_flag") .. "/gui.lua")
dofile(minetest.get_modpath("ctf_flag") .. "/flag_func.lua") dofile(minetest.get_modpath("ctf_flag") .. "/flag_func.lua")
ctf_flag.registered_on_flag_capture = {}
function ctf_flag.register_on_flag_capture(func)
if ctf._mt_loaded then
error("You can't register callbacks at game time!")
end
table.insert(ctf_flag.registered_on_flag_capture, func)
end
function ctf_flag.collect_claimed() function ctf_flag.collect_claimed()
ctf.log("utils", "Collecting claimed locations") ctf.log("utils", "Collecting claimed locations")
ctf_flag.claimed = {} ctf_flag.claimed = {}
@ -64,6 +73,7 @@ function ctf_flag.collect_claimed()
end end
end end
end end
ctf_flag.collect_claimed()
-- add a flag to a team -- add a flag to a team
function ctf_flag.add(team, pos) function ctf_flag.add(team, pos)