Skip to content

Commit a4814d5

Browse files
committed
Add a setting that controls the amount of captures required to eliminate a team
1 parent 3276bac commit a4814d5

File tree

8 files changed

+85
-33
lines changed

8 files changed

+85
-33
lines changed

mods/ctf/ctf_core/init.lua

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ ctf_core = {
22
settings = {
33
-- server_mode = minetest.settings:get("ctf_server_mode") or "play",
44
server_mode = minetest.settings:get_bool("creative_mode", false) and "mapedit" or "play",
5+
eliminate_team_flag_captures = tonumber(minetest.settings:get("ctf_eliminate_team_flag_captures")) or 1,
56
low_ram_mode = minetest.settings:get("ctf_low_ram_mode") or false,
67
}
78
}

mods/ctf/ctf_modebase/features.lua

+37-11
Original file line numberDiff line numberDiff line change
@@ -424,9 +424,12 @@ local item_levels = {
424424

425425
local delete_queue = {}
426426
local team_switch_after_capture = false
427+
local flag_capture_counter = {}
427428

428429
return {
429430
on_new_match = function()
431+
flag_capture_counter = {}
432+
430433
team_list = {}
431434
for tname in pairs(ctf_map.current_map.teams) do
432435
table.insert(team_list, tname)
@@ -603,6 +606,17 @@ return {
603606
return worst_players.t
604607
end
605608
end,
609+
base_flag_name = function(flagteam)
610+
local eliminate_counter = ""
611+
local max = ctf_core.settings.eliminate_team_flag_captures
612+
613+
if max > 1 then
614+
eliminate_counter = "[" .. max - (flag_capture_counter[flagteam] or 0) .. "/" .. max .. "] "
615+
end
616+
617+
return eliminate_counter ..
618+
HumanReadable(flagteam) .. "'s flag"
619+
end,
606620
can_take_flag = function(player, teamname)
607621
if not ctf_modebase.match_started then
608622
tp_player_near_flag(player)
@@ -704,7 +718,27 @@ return {
704718

705719
recent_rankings.add(pname, {score = capture_reward, flag_captures = #teamnames})
706720

707-
teams_left = teams_left - #teamnames
721+
local not_finished = {}
722+
for _, lost_team in ipairs(teamnames) do
723+
local newcapcount = (flag_capture_counter[lost_team] or 0) + 1
724+
725+
flag_capture_counter[lost_team] = newcapcount
726+
727+
if newcapcount < ctf_core.settings.eliminate_team_flag_captures then
728+
ctf_modebase.restore_flag(lost_team, pname)
729+
not_finished[lost_team] = true
730+
else
731+
teams_left = teams_left - 1
732+
733+
table.remove(team_list, table.indexof(team_list, lost_team))
734+
735+
for lost_player in pairs(ctf_teams.online_players[lost_team].players) do
736+
team_switch_after_capture = true
737+
ctf_teams.allocate_player(lost_player)
738+
team_switch_after_capture = false
739+
end
740+
end
741+
end
708742

709743
if teams_left <= 1 then
710744
local capture_text = "Player %s captured"
@@ -726,17 +760,9 @@ return {
726760
ctf_modebase.announce(win_text)
727761

728762
ctf_modebase.start_new_match(5)
729-
else
730-
for _, lost_team in ipairs(teamnames) do
731-
table.remove(team_list, table.indexof(team_list, lost_team))
732-
733-
for lost_player in pairs(ctf_teams.online_players[lost_team].players) do
734-
team_switch_after_capture = true
735-
ctf_teams.allocate_player(lost_player)
736-
team_switch_after_capture = false
737-
end
738-
end
739763
end
764+
765+
return not_finished
740766
end,
741767
on_allocplayer = function(player, new_team)
742768
player:set_hp(player:get_properties().hp_max)

mods/ctf/ctf_modebase/flags/huds.lua

+2-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ function ctf_modebase.flag_huds.update_player(player)
108108
for tname, def in pairs(ctf_map.current_map.teams) do
109109
local hud_label = "flag_pos:" .. tname
110110

111-
local base_label = HumanReadable(tname) .. "'s flag"
111+
local base_label = ctf_modebase:get_current_mode().base_flag_name(tname)
112+
112113
if ctf_modebase.flag_captured[tname] then
113114
base_label = base_label .. " (captured)"
114115
elseif ctf_modebase.flag_taken[tname] then

mods/ctf/ctf_modebase/flags/taking.lua

+39-21
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,41 @@
1-
local function drop_flags(player, pteam)
2-
local pname = player:get_player_name()
3-
local flagteams = ctf_modebase.taken_flags[pname]
4-
if not flagteams then return end
5-
6-
for _, flagteam in ipairs(flagteams) do
7-
ctf_modebase.flag_taken[flagteam] = nil
1+
function ctf_modebase.restore_flag(flagteam, taker)
2+
ctf_modebase.flag_taken[flagteam] = nil
83

9-
local fpos = vector.offset(ctf_map.current_map.teams[flagteam].flag_pos, 0, 1, 0)
4+
if ctf_modebase.taken_flags[taker] then
5+
table.remove(ctf_modebase.taken_flags[taker], table.indexof(ctf_modebase.taken_flags[taker], flagteam))
106

11-
minetest.load_area(fpos)
12-
local node = minetest.get_node(fpos)
7+
if #ctf_modebase.taken_flags[taker] <= 0 then
8+
ctf_modebase.taken_flags[taker] = nil
139

14-
if node.name == "ctf_modebase:flag_captured_top" then
15-
node.name = "ctf_modebase:flag_top_" .. flagteam
16-
minetest.set_node(fpos, node)
17-
else
18-
minetest.log("error", string.format("[ctf_flags] Unable to return flag node=%s, pos=%s",
19-
node.name, vector.to_string(fpos))
20-
)
10+
if player_api.players[taker] then
11+
player_api.set_texture(minetest.get_player_by_name(taker), 2, "blank.png")
12+
end
2113
end
2214
end
2315

24-
if player_api.players[pname] then
25-
player_api.set_texture(player, 2, "blank.png")
16+
local fpos = vector.offset(ctf_map.current_map.teams[flagteam].flag_pos, 0, 1, 0)
17+
18+
minetest.load_area(fpos)
19+
local node = minetest.get_node(fpos)
20+
21+
if node.name == "ctf_modebase:flag_captured_top" then
22+
node.name = "ctf_modebase:flag_top_" .. flagteam
23+
minetest.set_node(fpos, node)
24+
else
25+
minetest.log("error", string.format("[ctf_flags] Unable to return flag node=%s, pos=%s",
26+
node.name, vector.to_string(fpos))
27+
)
2628
end
29+
end
2730

28-
ctf_modebase.taken_flags[pname] = nil
31+
local function drop_flags(player, pteam)
32+
local pname = player:get_player_name()
33+
local flagteams = ctf_modebase.taken_flags[pname]
34+
if not flagteams then return end
35+
36+
for _, flagteam in ipairs(table.copy(flagteams)) do
37+
ctf_modebase.restore_flag(flagteam, pname)
38+
end
2939

3040
ctf_modebase.skip_vote.on_flag_drop(#flagteams)
3141
ctf_modebase:get_current_mode().on_flag_drop(player, flagteams, pteam)
@@ -109,7 +119,15 @@ function ctf_modebase.flag_on_punch(puncher, nodepos, node)
109119
ctf_modebase.on_flag_capture(puncher, flagteams)
110120

111121
ctf_modebase.skip_vote.on_flag_capture(#flagteams)
112-
ctf_modebase:get_current_mode().on_flag_capture(puncher, flagteams)
122+
local not_finished = ctf_modebase:get_current_mode().on_flag_capture(puncher, flagteams)
123+
124+
for team in pairs(not_finished) do
125+
ctf_modebase.flag_captured[team] = nil
126+
end
127+
128+
for _, player in pairs(minetest.get_connected_players()) do
129+
ctf_modebase.flag_huds.update_player(player)
130+
end
113131
end
114132
end
115133
end

mods/ctf/ctf_modes/ctf_mode_classes/init.lua

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ ctf_modebase.register_mode("classes", {
135135

136136
classes.reset_class_cooldowns(player)
137137
end,
138+
base_flag_name = features.base_flag_name,
138139
can_take_flag = features.can_take_flag,
139140
on_flag_take = features.on_flag_take,
140141
on_flag_drop = features.on_flag_drop,

mods/ctf/ctf_modes/ctf_mode_classic/init.lua

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ ctf_modebase.register_mode("classic", {
6464
on_leaveplayer = features.on_leaveplayer,
6565
on_dieplayer = features.on_dieplayer,
6666
on_respawnplayer = features.on_respawnplayer,
67+
base_flag_name = features.base_flag_name,
6768
can_take_flag = features.can_take_flag,
6869
on_flag_take = features.on_flag_take,
6970
on_flag_drop = features.on_flag_drop,

mods/ctf/ctf_modes/ctf_mode_nade_fight/init.lua

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ ctf_modebase.register_mode("nade_fight", {
9999
on_leaveplayer = features.on_leaveplayer,
100100
on_dieplayer = features.on_dieplayer,
101101
on_respawnplayer = features.on_respawnplayer,
102+
base_flag_name = features.base_flag_name,
102103
can_take_flag = features.can_take_flag,
103104
on_flag_take = features.on_flag_take,
104105
on_flag_drop = features.on_flag_drop,

settingtypes.txt

+3
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@ ctf_rankings_redis_server_port (Rankings Redis Server Port) int 6379
1010
# CTF can sometimes reduce CPU usage by calculating things once and putting them in RAM.
1111
# Turn on low ram mode if you're getting crashes related to RAM/Memory usage
1212
ctf_low_ram_mode (Low RAM mode) bool false
13+
14+
# Once a team's flag has been captured x times the team's members will be allocated to a new team
15+
ctf_eliminate_team_flag_captures (Amount of flag captures to eliminate a team) int 1

0 commit comments

Comments
 (0)