Add flag taking
This commit is contained in:
parent
56d19a90e1
commit
d9ee36dae3
@ -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]))
|
||||||
|
@ -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,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -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,30 +83,86 @@ cf.flag_func = {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local flag_name = flag.name
|
--cf.post(team,{msg=flag_name.." has been captured by "..cf.player(player).team,icon="flag_red"})
|
||||||
if flag_name and flag_name~="" then
|
--cf.post(cf.player(player).team,{msg=player.." captured '"..flag_name.."' from "..team,icon="flag_green"})
|
||||||
minetest.chat_send_all(flag_name.." has been taken from "..team.." by "..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=flag_name.." 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_name.."' from "..team,icon="flag_green"})
|
|
||||||
else
|
|
||||||
minetest.chat_send_all(team.."'s flag at ("..pos.x..","..pos.z..") has been captured by "..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(cf.player(player).team,{msg=player.." captured flag ("..pos.x..","..pos.z..") from "..team,icon="flag_green"})
|
|
||||||
end
|
|
||||||
cf.team(team).spawn = nil
|
|
||||||
|
|
||||||
if cf.setting("multiple_flags") == true then
|
local flag_name = flag.name
|
||||||
cf.area.delete_flag(team,pos)
|
if cf.setting("flag_capture_take") then
|
||||||
cf.area.add_flag(cf.player(player).team,pos)
|
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 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
|
else
|
||||||
minetest.env:set_node(pos,{name="air"})
|
if flag_name and flag_name~="" then
|
||||||
cf.area.delete_flag(team,pos)
|
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(cf.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 "..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(cf.player(player).team,{msg=player.." captured flag ("..pos.x..","..pos.z..") from "..team,icon="flag_green"})
|
||||||
|
end
|
||||||
|
cf.team(team).spawn = nil
|
||||||
|
if cf.setting("multiple_flags") == true then
|
||||||
|
cf.area.delete_flag(team,pos)
|
||||||
|
cf.area.add_flag(cf.player(player).team,pos)
|
||||||
|
else
|
||||||
|
minetest.env:set_node(pos,{name="air"})
|
||||||
|
cf.area.delete_flag(team,pos)
|
||||||
|
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
|
||||||
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
|
||||||
|
|
||||||
minetest.env:set_node(top,{name="capturetheflag:flag_top_"..cf.team(flag_team_data.team).data.color})
|
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})
|
||||||
|
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)
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user