ctf_flag fix bugs and make flag pick up faster

This commit is contained in:
rubenwardy 2015-07-14 13:35:44 +01:00
parent dcce50c476
commit 76e3d25be0
2 changed files with 75 additions and 68 deletions

View File

@ -1,7 +1,4 @@
local function do_capture(attname, flag, returned) local function do_capture(attname, flag, returned)
print("Do capture " .. attname)
print(flag.x .. ", " .. flag.y .. ", " .. flag.z)
local team = flag.team local team = flag.team
local attacker = ctf.player(attname) local attacker = ctf.player(attname)
@ -34,6 +31,8 @@ local function do_capture(attname, flag, returned)
player = attname player = attname
} }
ctf_flag.update(flag)
for i = 1, #ctf_flag.registered_on_pick_up do for i = 1, #ctf_flag.registered_on_pick_up do
ctf_flag.registered_on_pick_up[i](attname, flag) ctf_flag.registered_on_pick_up[i](attname, flag)
end end
@ -103,6 +102,7 @@ ctf_flag = {
ctf_flag.on_rightclick(pos, node, clicker) ctf_flag.on_rightclick(pos, node, clicker)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
local name = clicker:get_player_name()
local flag = ctf_flag.get(pos) local flag = ctf_flag.get(pos)
if not flag then if not flag then
return return
@ -110,19 +110,19 @@ ctf_flag = {
if flag.claimed then if flag.claimed then
if ctf.setting("flag.capture_take") 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(name, "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(name, "who is a member of team "..flag.claimed.team)
return return
else else
minetest.chat_send_player(player, "Oops! This flag should not be captured. Reverting...") minetest.chat_send_player(name, "Oops! This flag should not be captured. Reverting...")
flag.claimed = nil flag.claimed = nil
end end
end end
ctf.gui.flag_board(clicker:get_player_name(),pos) ctf.gui.flag_board(name, pos)
end, end,
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
local player = puncher:get_player_name() local name = puncher:get_player_name()
if not puncher or not player then if not puncher or not name then
return return
end end
@ -133,11 +133,11 @@ ctf_flag = {
if flag.claimed then if flag.claimed then
if ctf.setting("flag.capture_take") 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(name, "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(name, "who is a member of team " .. flag.claimed.team)
return return
else else
minetest.chat_send_player(player, "Oops! This flag should not be captured. Reverting.") minetest.chat_send_player(name, "Oops! This flag should not be captured. Reverting.")
flag.claimed = nil flag.claimed = nil
end end
end end
@ -147,33 +147,32 @@ ctf_flag = {
return return
end end
if ctf.team(team) and ctf.player(player).team then if ctf.team(team) and ctf.player(name).team then
if ctf.player(player).team == team then if ctf.player(name).team == team then
-- Clicking on their team's flag -- Clicking on their team's flag
if ctf.setting("flag.capture_take") then if ctf.setting("flag.capture_take") then
ctf_flag._flagret(player) ctf_flag._flagret(name)
end end
else else
-- Clicked on another team's flag -- Clicked on another team's flag
local diplo = ctf.diplo.get(team, ctf.player(player).team) or local diplo = ctf.diplo.get(team, ctf.player(name).team) or
ctf.setting("default_diplo_state") 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(name, "You are at peace with this team!")
return return
end end
do_capture(player, flag) do_capture(name, flag)
end end
else else
minetest.chat_send_player(puncher:get_player_name(),"You are not part of a team!") minetest.chat_send_player(name, "You are not part of a team!")
end end
end, end,
_flagret = function(player) _flagret = function(name)
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 == name then
do_capture(player, ctf_flag.claimed[i], true) do_capture(name, ctf_flag.claimed[i], true)
ctf_flag.collect_claimed() ctf_flag.collect_claimed()
end end
end end
@ -183,7 +182,9 @@ ctf_flag = {
meta:set_string("infotext", "Unowned flag") meta:set_string("infotext", "Unowned flag")
end, end,
after_place_node = function(pos, placer) after_place_node = function(pos, placer)
if not pos then local name = name
if not pos or not name then
return return
end end
@ -193,8 +194,8 @@ ctf_flag = {
return return
end end
if ctf.players and ctf.players[placer:get_player_name()] and ctf.players[placer:get_player_name()].team then if ctf.players and ctf.players[name] and ctf.players[name].team then
local team = ctf.players[placer:get_player_name()].team local team = ctf.players[name].team
meta:set_string("infotext", team.."'s flag") meta:set_string("infotext", team.."'s flag")
-- add flag -- add flag
@ -235,7 +236,7 @@ ctf_flag = {
meta2:set_string("infotext", team.."'s flag") meta2:set_string("infotext", team.."'s flag")
else else
minetest.chat_send_player(placer:get_player_name(), "You are not part of a team!") minetest.chat_send_player(name, "You are not part of a team!")
minetest.set_node(pos,{name="air"}) minetest.set_node(pos,{name="air"})
end end
end end

View File

@ -101,6 +101,52 @@ function ctf_flag.add(team, pos)
ctf.needs_save = true ctf.needs_save = true
end end
function ctf_flag.update(pos)
if minetest.get_node(pos).name ~= "ctf_flag:flag" then
return
end
local top = {x=pos.x,y=pos.y+1,z=pos.z}
local flagmeta = minetest.get_meta(pos)
if not flagmeta then
return
end
local flag_team_data = ctf_flag.get(pos)
if not flag_team_data or not ctf.team(flag_team_data.team)then
ctf.log("flag", "Flag does not exist! Deleting nodes. "..dump(pos))
minetest.set_node(pos,{name="air"})
minetest.set_node(top,{name="air"})
return
end
local topmeta = minetest.get_meta(top)
local flag_name = flag_team_data.name
if flag_name and flag_name ~= "" then
flagmeta:set_string("infotext", flag_name.." - "..flag_team_data.team)
else
flagmeta:set_string("infotext", flag_team_data.team.."'s flag")
end
if not ctf.team(flag_team_data.team).data.color then
ctf.team(flag_team_data.team).data.color = "red"
ctf.needs_save = true
end
if flag_team_data.claimed then
minetest.set_node(top,{name="ctf_flag:flag_captured_top"})
else
minetest.set_node(top,{name="ctf_flag:flag_top_"..ctf.team(flag_team_data.team).data.color})
end
topmeta = minetest.get_meta(top)
if flag_name and flag_name ~= "" then
topmeta:set_string("infotext", flag_name.." - "..flag_team_data.team)
else
topmeta:set_string("infotext", flag_team_data.team.."'s flag")
end
end
-- get a flag from a team -- get a flag from a team
function ctf_flag.get(pos) function ctf_flag.get(pos)
if not pos then if not pos then
@ -262,45 +308,5 @@ minetest.register_abm({
nodenames = {"group:flag_bottom"}, nodenames = {"group:flag_bottom"},
inteval = 5, inteval = 5,
chance = 1, chance = 1,
action = function(pos) action = ctf_flag.update
local top = {x=pos.x,y=pos.y+1,z=pos.z}
local flagmeta = minetest.get_meta(pos)
if not flagmeta then
return
end
local flag_team_data = ctf_flag.get(pos)
if not flag_team_data or not ctf.team(flag_team_data.team)then
ctf.log("flag", "Flag does not exist! Deleting nodes. "..dump(pos))
minetest.set_node(pos,{name="air"})
minetest.set_node(top,{name="air"})
return
end
local topmeta = minetest.get_meta(top)
local flag_name = flag_team_data.name
if flag_name and flag_name ~= "" then
flagmeta:set_string("infotext", flag_name.." - "..flag_team_data.team)
else
flagmeta:set_string("infotext", flag_team_data.team.."'s flag")
end
if not ctf.team(flag_team_data.team).data.color then
ctf.team(flag_team_data.team).data.color = "red"
ctf.needs_save = true
end
if flag_team_data.claimed then
minetest.set_node(top,{name="ctf_flag:flag_captured_top"})
else
minetest.set_node(top,{name="ctf_flag:flag_top_"..ctf.team(flag_team_data.team).data.color})
end
topmeta = minetest.get_meta(top)
if flag_name and flag_name ~= "" then
topmeta:set_string("infotext", flag_name.." - "..flag_team_data.team)
else
topmeta:set_string("infotext", flag_team_data.team.."'s flag")
end
end
}) })