Add flag taking

This commit is contained in:
rubenwardy 2014-01-06 19:59:54 +00:00
parent 56d19a90e1
commit d9ee36dae3
5 changed files with 180 additions and 25 deletions

View File

@ -30,9 +30,10 @@ function cf.area.get_flag(pos)
team.flags[i].z == pos.z team.flags[i].z == pos.z
) then ) then
if result then if result then
minetest.chat_send_all("[CTF WARNING] Multiple teams have same flag. please report this to the server operator / admin") minetest.chat_send_all("[CTF WARNING] Multiple teams have same flag. Please report this to the server operator / admin")
print("CTF WARNING DATA") print("CTF WARNING DATA")
print("Multiple teams have same flag. See debug log for details") print("Multiple teams have same flag.")
print("This is a sign of ctf.txt corruption.")
print("----------------") print("----------------")
print(dump(result)) print(dump(result))
print(dump(team.flags[i])) print(dump(team.flags[i]))

View File

@ -179,11 +179,12 @@ minetest.register_chatcommand("ateam", {
}) })
minetest.register_chatcommand("ctf", { minetest.register_chatcommand("ctf", {
description = "Do admin debug stuff", description = "Do admin cleaning stuff",
privs = {team=true}, privs = {team=true},
func = function(name, param) func = function(name, param)
cf.clean_flags() cf.clean_flags()
cf.clean_player_lists() cf.clean_player_lists()
cf.collect_claimed()
end, end,
}) })

View File

@ -1,13 +1,46 @@
cf.flag_func = { cf.flag_func = {
on_punch_top = function(pos, node, puncher) on_punch_top = function(pos, node, puncher)
pos.y=pos.y-1 pos.y=pos.y-1
cf.flag_func.on_punch(pos,node,puncher) cf.flag_func.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
local flag = cf.area.get_flag(pos)
if not flag then
return
end
if flag.claimed then
if cf.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
cf.gui.flag_board(clicker:get_player_name(),pos) cf.gui.flag_board(clicker:get_player_name(),pos)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
local flag = cf.area.get_flag(pos)
if not flag then
return
end
if flag.claimed then
if cf.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
cf.gui.flag_board(clicker:get_player_name(),pos) cf.gui.flag_board(clicker:get_player_name(),pos)
end, end,
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
@ -21,6 +54,17 @@ cf.flag_func = {
return return
end end
if flag.claimed then
if cf.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
local team = flag.team local team = flag.team
if not team then if not team then
return return
@ -39,18 +83,38 @@ cf.flag_func = {
return return
end end
--cf.post(team,{msg=flag_name.." has been captured by "..cf.player(player).team,icon="flag_red"})
--cf.post(cf.player(player).team,{msg=player.." captured '"..flag_name.."' from "..team,icon="flag_green"})
--cf.post(team,{msg="The flag at ("..pos.x..","..pos.z..") has been captured by "..cf.player(player).team,icon="flag_red"})
--cf.post(cf.player(player).team,{msg=player.." captured flag ("..pos.x..","..pos.z..") from "..team,icon="flag_green"})
local flag_name = flag.name local flag_name = flag.name
if cf.setting("flag_capture_take") then
if flag_name and flag_name~="" then if flag_name and flag_name~="" then
minetest.chat_send_all(flag_name.." has been taken from "..team.." by "..cf.player(player).team.."!") minetest.chat_send_all(flag_name.." has been taken from "..team.." by "..player.." (team "..cf.player(player).team..")")
cf.post(team,{msg=flag_name.." has been taken by "..cf.player(player).team,icon="flag_red"})
cf.post(cf.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 "..cf.player(player).team..")")
cf.post(team,{msg="The flag at ("..pos.x..","..pos.z..") has been taken by "..cf.player(player).team,icon="flag_red"})
cf.post(cf.player(player).team,{msg=player.." snatched flag ("..pos.x..","..pos.z..") from "..team,icon="flag_green"})
end
flag.claimed = {
team = cf.player(player).team,
player = player
}
table.insert(cf.claimed, flag)
else
if flag_name and flag_name~="" then
minetest.chat_send_all(flag_name.." has been taken from "..team.." by "..player.." (team "..cf.player(player).team..")")
cf.post(team,{msg=flag_name.." has been captured by "..cf.player(player).team,icon="flag_red"}) cf.post(team,{msg=flag_name.." has been captured by "..cf.player(player).team,icon="flag_red"})
cf.post(cf.player(player).team,{msg=player.." captured '"..flag_name.."' from "..team,icon="flag_green"}) cf.post(cf.player(player).team,{msg=player.." captured '"..flag_name.."' from "..team,icon="flag_green"})
else else
minetest.chat_send_all(team.."'s flag at ("..pos.x..","..pos.z..") has been captured by "..cf.player(player).team) minetest.chat_send_all(team.."'s flag at ("..pos.x..","..pos.z..") has been captured by "..player.." (team "..cf.player(player).team..")")
cf.post(team,{msg="The flag at ("..pos.x..","..pos.z..") has been captured by "..cf.player(player).team,icon="flag_red"}) cf.post(team,{msg="The flag at ("..pos.x..","..pos.z..") has been captured by "..cf.player(player).team,icon="flag_red"})
cf.post(cf.player(player).team,{msg=player.." captured flag ("..pos.x..","..pos.z..") from "..team,icon="flag_green"}) cf.post(cf.player(player).team,{msg=player.." captured flag ("..pos.x..","..pos.z..") from "..team,icon="flag_green"})
end end
cf.team(team).spawn = nil cf.team(team).spawn = nil
if cf.setting("multiple_flags") == true then if cf.setting("multiple_flags") == true then
cf.area.delete_flag(team,pos) cf.area.delete_flag(team,pos)
cf.area.add_flag(cf.player(player).team,pos) cf.area.add_flag(cf.player(player).team,pos)
@ -59,10 +123,46 @@ cf.flag_func = {
cf.area.delete_flag(team,pos) cf.area.delete_flag(team,pos)
end end
end end
cf.save()
else
-- Clicking on their team's flag
if cf.setting("flag_capture_take") then
cf.flag_func._flagret(player)
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!")
end end
end, end,
_flagret = function(player)
minetest.chat_send_player(player,"Own flag")
for i=1, #cf.claimed do
if cf.claimed[i].claimed.player == player then
minetest.chat_send_player(player,"Returning flag")
local fteam = cf.team(cf.claimed[i].team)
local flag_name = cf.claimed[i].name
if flag_name and flag_name~="" then
minetest.chat_send_all(flag_name.." has been taken from "..fteam.data.name.." by "..cf.claimed[i].claimed.player.." (team "..cf.claimed[i].claimed.team..")")
cf.post(fteam,{msg=flag_name.." has been captured by "..cf.claimed[i].claimed.team,icon="flag_red"})
cf.post(cf.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 ("..cf.claimed[i].x..","..cf.claimed[i].z..") has been captured by "..player.." (team "..cf.claimed[i].claimed.team..")")
cf.post(fteam.data.name,{msg="The flag at ("..cf.claimed[i].x..","..cf.claimed[i].z..") has been captured by "..cf.claimed[i].claimed.team,icon="flag_red"})
cf.post(cf.claimed[i].claimed.team,{msg=player.." captured flag ("..cf.claimed[i].x..","..cf.claimed[i].z..") from "..fteam.data.name,icon="flag_green"})
end
fteam.spawn = nil
local fpos = {x=cf.claimed[i].x,y=cf.claimed[i].y,z=cf.claimed[i].z}
if cf.setting("multiple_flags") == true then
cf.area.delete_flag(fteam.data.name,fpos)
cf.area.add_flag(cf.claimed[i].claimed.team,fpos)
else
minetest.env:set_node(fpos,{name="air"})
cf.area.delete_flag(fteam.data.name,fpos)
end
cf.collect_claimed()
end
end
end,
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.env:get_meta(pos) local meta = minetest.env:get_meta(pos)
meta:set_string("infotext", "Unowned flag") meta:set_string("infotext", "Unowned flag")
@ -182,6 +282,30 @@ for i=1,#colors do
}) })
end end
minetest.register_node("capturetheflag:flag_captured_top",{
description = "You are not meant to have this! - flag captured",
drawtype="nodebox",
paramtype = "light",
walkable = false,
tiles = {
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png",
"default_wood.png"
},
node_box = {
type = "fixed",
fixed = {
{0.250000,-0.500000,0.000000,0.312500,0.500000,0.062500}
}
},
groups = {immortal=1,is_flag=1,flag_top=1,not_in_creative_inventory=1},
on_punch = cf.flag_func.on_punch_top,
on_rightclick = cf.flag_func.on_rightclick_top
})
-- On respawn -- On respawn
minetest.register_on_respawnplayer(function(player) minetest.register_on_respawnplayer(function(player)
if player and cf.player(player:get_player_name()) then if player and cf.player(player:get_player_name()) then
@ -228,7 +352,12 @@ minetest.register_abm({
cf.save() cf.save()
end end
if flag_team_data.claimed then
minetest.env:set_node(top,{name="capturetheflag:flag_captured_top"})
else
minetest.env:set_node(top,{name="capturetheflag:flag_top_"..cf.team(flag_team_data.team).data.color}) minetest.env:set_node(top,{name="capturetheflag:flag_top_"..cf.team(flag_team_data.team).data.color})
end
topmeta = minetest.env:get_meta(top) topmeta = minetest.env:get_meta(top)
if flag_name and flag_name ~= "" then if flag_name and flag_name ~= "" then
topmeta:set_string("infotext", flag_name.." - "..flag_team_data.team) topmeta:set_string("infotext", flag_name.." - "..flag_team_data.team)

View File

@ -473,7 +473,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
elseif fields.delete then elseif fields.delete then
local pos = cf.gui.flag_data[name].pos local pos = cf.gui.flag_data[name].pos
local team = cf.area.get_flag(cf.gui.flag_data[name].pos).team local flag = cf.area.get_flag(cf.gui.flag_data[name].pos)
if not flag then
print("No flag?!")
end
local team = flag.team
if not team then if not team then
return return
end end

View File

@ -11,11 +11,13 @@ function cf.init()
cf._defsettings = {} cf._defsettings = {}
cf.teams = {} cf.teams = {}
cf.players = {} cf.players = {}
cf.claimed = {}
cf.diplo.diplo = {} cf.diplo.diplo = {}
-- Settings: Feature enabling -- Settings: Feature enabling
cf._set("node_ownership",true) cf._set("node_ownership",true)
cf._set("multiple_flags",true) cf._set("multiple_flags",true)
cf._set("flag_capture_take",false) -- whether flags need to be taken to home flag when captured
cf._set("gui",true) -- whether GUIs are used cf._set("gui",true) -- whether GUIs are used
cf._set("team_gui",true) -- GUI on /team is used cf._set("team_gui",true) -- GUI on /team is used
cf._set("flag_teleport_gui",true) -- flag tab in /team cf._set("flag_teleport_gui",true) -- flag tab in /team
@ -144,8 +146,20 @@ end
-- Cleans up the flag lists -- Cleans up the flag lists
function cf.clean_flags() function cf.clean_flags()
for _, str in pairs(cf.teams) do for _, team in pairs(cf.teams) do
cf.area.asset_flags(str.data.name) cf.assert_flags(team.data.name)
end
end
-- Get info for cf.claimed
function cf.collect_claimed()
cf.claimed = {}
for _, team in pairs(cf.teams) do
for i = 1, #team.flags do
if team.flags[i].claimed then
table.insert(cf.claimed,team.flags[i])
end
end
end end
end end
@ -312,3 +326,7 @@ dofile(minetest.get_modpath("capturetheflag").."/area.lua")
dofile(minetest.get_modpath("capturetheflag").."/gui.lua") dofile(minetest.get_modpath("capturetheflag").."/gui.lua")
dofile(minetest.get_modpath("capturetheflag").."/cli.lua") dofile(minetest.get_modpath("capturetheflag").."/cli.lua")
dofile(minetest.get_modpath("capturetheflag").."/flag.lua") dofile(minetest.get_modpath("capturetheflag").."/flag.lua")
-- Load other
cf.collect_claimed()