diff --git a/mods/capturetheflag/area.lua b/mods/capturetheflag/area.lua index de6376d..19319eb 100644 --- a/mods/capturetheflag/area.lua +++ b/mods/capturetheflag/area.lua @@ -30,9 +30,10 @@ function cf.area.get_flag(pos) team.flags[i].z == pos.z ) 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("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(dump(result)) print(dump(team.flags[i])) diff --git a/mods/capturetheflag/cli.lua b/mods/capturetheflag/cli.lua index 3eab49b..9c88075 100644 --- a/mods/capturetheflag/cli.lua +++ b/mods/capturetheflag/cli.lua @@ -179,11 +179,12 @@ minetest.register_chatcommand("ateam", { }) minetest.register_chatcommand("ctf", { - description = "Do admin debug stuff", + description = "Do admin cleaning stuff", privs = {team=true}, func = function(name, param) cf.clean_flags() cf.clean_player_lists() + cf.collect_claimed() end, }) diff --git a/mods/capturetheflag/flag.lua b/mods/capturetheflag/flag.lua index d5f7742..ccdaf0f 100644 --- a/mods/capturetheflag/flag.lua +++ b/mods/capturetheflag/flag.lua @@ -1,13 +1,46 @@ cf.flag_func = { on_punch_top = function(pos, node, puncher) pos.y=pos.y-1 + cf.flag_func.on_punch(pos,node,puncher) end, on_rightclick_top = function(pos, node, clicker) 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) 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) end, on_punch = function(pos, node, puncher) @@ -20,6 +53,17 @@ cf.flag_func = { 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 local team = flag.team if not team then @@ -38,31 +82,87 @@ cf.flag_func = { minetest.chat_send_player(player,"You are at peace with this team!") return 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 - if flag_name and flag_name~="" then - minetest.chat_send_all(flag_name.." has been taken from "..team.." by "..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"}) + if cf.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 "..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 - 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 - 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) + 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(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 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, #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) local meta = minetest.env:get_meta(pos) meta:set_string("infotext", "Unowned flag") @@ -182,6 +282,30 @@ for i=1,#colors do }) 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 minetest.register_on_respawnplayer(function(player) if player and cf.player(player:get_player_name()) then @@ -228,7 +352,12 @@ minetest.register_abm({ cf.save() 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) if flag_name and flag_name ~= "" then topmeta:set_string("infotext", flag_name.." - "..flag_team_data.team) diff --git a/mods/capturetheflag/gui.lua b/mods/capturetheflag/gui.lua index 77a5ab6..8307d8a 100644 --- a/mods/capturetheflag/gui.lua +++ b/mods/capturetheflag/gui.lua @@ -472,8 +472,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return true elseif fields.delete then local pos = cf.gui.flag_data[name].pos + + local flag = cf.area.get_flag(cf.gui.flag_data[name].pos) + + if not flag then + print("No flag?!") + end - local team = cf.area.get_flag(cf.gui.flag_data[name].pos).team + local team = flag.team if not team then return end diff --git a/mods/capturetheflag/init.lua b/mods/capturetheflag/init.lua index b3e840b..b549b6a 100644 --- a/mods/capturetheflag/init.lua +++ b/mods/capturetheflag/init.lua @@ -11,11 +11,13 @@ function cf.init() cf._defsettings = {} cf.teams = {} cf.players = {} + cf.claimed = {} cf.diplo.diplo = {} -- Settings: Feature enabling cf._set("node_ownership",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("team_gui",true) -- GUI on /team is used cf._set("flag_teleport_gui",true) -- flag tab in /team @@ -144,8 +146,20 @@ end -- Cleans up the flag lists function cf.clean_flags() - for _, str in pairs(cf.teams) do - cf.area.asset_flags(str.data.name) + for _, team in pairs(cf.teams) do + 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 @@ -311,4 +325,8 @@ cf.clean_player_lists() dofile(minetest.get_modpath("capturetheflag").."/area.lua") dofile(minetest.get_modpath("capturetheflag").."/gui.lua") dofile(minetest.get_modpath("capturetheflag").."/cli.lua") -dofile(minetest.get_modpath("capturetheflag").."/flag.lua") \ No newline at end of file +dofile(minetest.get_modpath("capturetheflag").."/flag.lua") + +-- Load other +cf.collect_claimed() +