From ab87623c91fecc9a319858458f66600b219316b1 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 13 Jul 2015 14:32:41 +0100 Subject: [PATCH] Rework flag capturing --- mods/capturetheflag/ctf_endgame/depends.txt | 2 + mods/capturetheflag/ctf_endgame/init.lua | 9 + mods/capturetheflag/ctf_flag/flag_func.lua | 175 ++++++++++---------- mods/capturetheflag/ctf_flag/init.lua | 12 +- 4 files changed, 105 insertions(+), 93 deletions(-) create mode 100644 mods/capturetheflag/ctf_endgame/depends.txt create mode 100644 mods/capturetheflag/ctf_endgame/init.lua diff --git a/mods/capturetheflag/ctf_endgame/depends.txt b/mods/capturetheflag/ctf_endgame/depends.txt new file mode 100644 index 0000000..d8c974d --- /dev/null +++ b/mods/capturetheflag/ctf_endgame/depends.txt @@ -0,0 +1,2 @@ +ctf +ctf_flag diff --git a/mods/capturetheflag/ctf_endgame/init.lua b/mods/capturetheflag/ctf_endgame/init.lua new file mode 100644 index 0000000..c1464da --- /dev/null +++ b/mods/capturetheflag/ctf_endgame/init.lua @@ -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) diff --git a/mods/capturetheflag/ctf_flag/flag_func.lua b/mods/capturetheflag/ctf_flag/flag_func.lua index 6343a33..746fa4d 100644 --- a/mods/capturetheflag/ctf_flag/flag_func.lua +++ b/mods/capturetheflag/ctf_flag/flag_func.lua @@ -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 = { on_punch_top = function(pos, node, puncher) - pos.y=pos.y-1 - + pos.y = pos.y - 1 ctf_flag.on_punch(pos, node, puncher) end, on_rightclick_top = function(pos, node, clicker) - pos.y=pos.y-1 - - 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) + pos.y = pos.y - 1 + ctf_flag.on_rightclick(pos, node, clicker) end, on_rightclick = function(pos, node, clicker) local flag = ctf_flag.get(pos) @@ -56,8 +104,8 @@ ctf_flag = { 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) + 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.") @@ -71,89 +119,32 @@ ctf_flag = { end if ctf.team(team) and ctf.player(player).team then - if ctf.player(player).team ~= team then - local diplo = ctf.diplo.get(team, ctf.player(player).team) - - if not diplo then - diplo = ctf.setting("default_diplo_state") + if ctf.player(player).team == team then + -- Clicking on their team's flag + if ctf.setting("flag.capture_take") then + ctf_flag._flagret(player) 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 minetest.chat_send_player(player, "You are at peace with this team!") return end - local flag_name = flag.name - 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 + do_capture(player, flag) end else minetest.chat_send_player(puncher:get_player_name(),"You are not part of a team!") end end, _flagret = function(player) - minetest.chat_send_player(player,"Own flag") - for i=1, #ctf_flag.claimed do + minetest.chat_send_player(player, "Own flag") + for i = 1, #ctf_flag.claimed do if ctf_flag.claimed[i].claimed.player == player then - minetest.chat_send_player(player,"Returning flag") - 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 + do_capture(player, ctf_flag.claimed[i], true) ctf_flag.collect_claimed() end end diff --git a/mods/capturetheflag/ctf_flag/init.lua b/mods/capturetheflag/ctf_flag/init.lua index c666826..cf381c9 100644 --- a/mods/capturetheflag/ctf_flag/init.lua +++ b/mods/capturetheflag/ctf_flag/init.lua @@ -8,6 +8,7 @@ ctf.register_on_init(function() ctf._set("gui.tab.flags", true) ctf._set("gui.team.teleport_to_flag", true) ctf._set("gui.team.teleport_to_spawn", false) + ctf._set("flag.capture_mode", "take") end) ctf.register_on_new_team(function(team) team.flags = {} @@ -32,7 +33,6 @@ ctf.register_on_territory_query(function(pos) return closest_team, closest_distSQ end) -ctf_flag = {} function ctf.get_spawn(team) if not ctf.team(team) then return nil @@ -50,9 +50,18 @@ function ctf.get_spawn(team) return nil end end + dofile(minetest.get_modpath("ctf_flag") .. "/gui.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() ctf.log("utils", "Collecting claimed locations") ctf_flag.claimed = {} @@ -64,6 +73,7 @@ function ctf_flag.collect_claimed() end end end +ctf_flag.collect_claimed() -- add a flag to a team function ctf_flag.add(team, pos)