Skip to content

Commit 08dff0e

Browse files
committed
Merge branch 'tnt' of github.com:farooqkz/capturetheflag into tnt
2 parents 19a2987 + 6a2f6b3 commit 08dff0e

File tree

26 files changed

+499
-364
lines changed

26 files changed

+499
-364
lines changed

docs/ctf-api.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ ctf_settings.register("my_setting", {
3939

4040
---
4141
# mods/ctf/
42-
TODO
42+
TODO, below is a collection of quick notes for later
43+
44+
## ctf_teams
45+
* https://modern.ircdocs.horse/formatting.html#colors-16-98
4346

4447
---
4548
# mods/mtg/

mods/apis/ctf_gui/dev.lua

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
local unset_function = "[f]\nreturn "
1+
local unset_function = "return "
22

33
function ctf_gui.show_formspec_dev(player, formname, formspec, formcontext)
44
local filepath = minetest.get_worldpath().."/ctf_gui/"
@@ -20,8 +20,8 @@ function ctf_gui.show_formspec_dev(player, formname, formspec, formcontext)
2020
local function interval()
2121
if type(formspec) == "function" then
2222
ctf_gui.show_formspec(player, formname, formspec(formcontext))
23-
elseif formspec:sub(1, 3) == "[f]" then
24-
local result, form = pcall((loadstring(formspec:sub(4)) or function() return function() end end)(), formcontext)
23+
elseif formspec:match("^%s*return") then
24+
local result, form = pcall((loadstring(formspec) or function() return function() end end)(), formcontext)
2525

2626
ctf_gui.show_formspec(player, formname,
2727
result and form or "size[10,10]hypertext[0,0;10,10;err;"..minetest.formspec_escape(form or "").."]"

mods/apis/ctf_gui/init.lua

+8-2
Original file line numberDiff line numberDiff line change
@@ -460,10 +460,16 @@ function ctf_gui.old_show_formspec(player, formname, formdef)
460460
formdef._info = formdef
461461
context[player] = formdef
462462

463-
minetest.log("action", "Showing formspec "..dump(formname).." to "..dump(player))
464-
minetest.show_formspec(player, formname, formspec)
463+
if minetest.get_player_by_name(player) then
464+
minetest.log("action", "Showing formspec "..dump(formname).." to "..dump(player))
465+
minetest.show_formspec(player, formname, formspec)
466+
end
465467
end,
466468
formdef, ctf_gui.ELEM_SIZE, ctf_gui.SCROLLBAR_WIDTH)
467469
end
468470

471+
minetest.register_on_leaveplayer(function(player)
472+
context[player:get_player_name()] = nil
473+
end)
474+
469475
dofile(minetest.get_modpath("ctf_gui").."/dev.lua")

mods/apis/ctf_settings/init.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ function ctf_settings.get(player, setting)
4040
local value = player:get_meta():get_string("ctf_settings:"..setting)
4141
local info = ctf_settings.settings[setting]
4242

43-
return value == "" and info.default or value
43+
return value == "" and (info and info.default) or value
4444
end
4545

4646
-- This Function MIT by Rubenwardy

mods/ctf/ctf_combat/ctf_ranged/init.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ local function process_ray(ray, user, look_dir, def)
7777
end
7878
end
7979
elseif hitpoint.type == "object" then
80-
hitpoint.ref:punch(user, 1, {
81-
full_punch_interval = 1,
80+
hitpoint.ref:punch(user, def.fire_interval or 0.1, {
81+
full_punch_interval = def.fire_interval or 0.1,
8282
damage_groups = {ranged = 1, [def.type] = 1, fleshy = def.damage}
8383
}, look_dir)
8484
end

mods/ctf/ctf_core/init.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +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-
low_ram_mode = minetest.settings:get("ctf_low_ram_mode") or false,
5+
low_ram_mode = minetest.settings:get("ctf_low_ram_mode") == "true" or false,
66
}
77
}
88

mods/ctf/ctf_map/ctf_traps.lua

+26-24
Original file line numberDiff line numberDiff line change
@@ -68,29 +68,31 @@ minetest.register_node("ctf_map:spike", {
6868
})
6969

7070
for _, team in ipairs(ctf_teams.teamlist) do
71-
local spikecolor = ctf_teams.team[team].color
72-
73-
minetest.register_node("ctf_map:spike_"..team, {
74-
description = HumanReadable(team).." Team Spike",
75-
drawtype = "plantlike",
76-
tiles = {"ctf_map_spike.png^[colorize:"..spikecolor..":150"},
77-
inventory_image = "ctf_map_spike.png^[colorize:"..spikecolor..":150",
78-
use_texture_alpha = "clip",
79-
paramtype = "light",
80-
paramtype2 = "meshoptions",
81-
sunlight_propagates = true,
82-
walkable = false,
83-
damage_per_second = 7,
84-
groups = {cracky=1, level=2},
85-
drop = "ctf_map:spike",
86-
selection_box = {
87-
type = "fixed",
88-
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
89-
},
90-
on_place = function(itemstack, placer, pointed_thing)
91-
return minetest.item_place(itemstack, placer, pointed_thing, 34)
92-
end
93-
})
71+
if not ctf_teams.team[team].not_playing then
72+
local spikecolor = ctf_teams.team[team].color
73+
74+
minetest.register_node("ctf_map:spike_"..team, {
75+
description = HumanReadable(team).." Team Spike",
76+
drawtype = "plantlike",
77+
tiles = {"ctf_map_spike.png^[colorize:"..spikecolor..":150"},
78+
inventory_image = "ctf_map_spike.png^[colorize:"..spikecolor..":150",
79+
use_texture_alpha = "clip",
80+
paramtype = "light",
81+
paramtype2 = "meshoptions",
82+
sunlight_propagates = true,
83+
walkable = false,
84+
damage_per_second = 7,
85+
groups = {cracky=1, level=2},
86+
drop = "ctf_map:spike",
87+
selection_box = {
88+
type = "fixed",
89+
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
90+
},
91+
on_place = function(itemstack, placer, pointed_thing)
92+
return minetest.item_place(itemstack, placer, pointed_thing, 34)
93+
end
94+
})
95+
end
9496
end
9597

9698
minetest.register_on_player_hpchange(function(player, hp_change, reason)
@@ -129,7 +131,7 @@ local function damage_cobble_dig(pos, node, digger)
129131
local placerobj = minetest.get_player_by_name(placer_name)
130132

131133
if placerobj then
132-
digger:punch(placerobj, 10, {
134+
digger:punch(placerobj, 1, {
133135
damage_groups = {
134136
fleshy = 7,
135137
damage_cobble = 1,

mods/ctf/ctf_map/map_functions.lua

+30-8
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ function ctf_map.place_map(mapmeta, callback)
1111
local dirname = mapmeta.dirname
1212
local schempath = ctf_map.maps_dir .. dirname .. "/map.mts"
1313

14+
local barrier_data = mapmeta.barriers and mapmeta.barriers()
15+
1416
ctf_map.emerge_with_callbacks(nil, mapmeta.pos1, mapmeta.pos2, function(ctx)
1517
local rotation = (mapmeta.rotation and mapmeta.rotation ~= "z") and "90" or "0"
1618
local res = minetest.place_schematic(mapmeta.pos1, schempath, rotation, {["ctf_map:chest"] = "air"})
1719

1820
minetest.log("action", string.format(
19-
"Placed map %s in %.2fs", dirname, (minetest.get_us_time() - ctx.start_time) / 1000000
21+
"Placed map %s in %.2fs", dirname, (minetest.get_us_time() - ctx.start_time) / 1e6
2022
))
2123

2224
for name, def in pairs(mapmeta.teams) do
@@ -46,6 +48,10 @@ function ctf_map.place_map(mapmeta, callback)
4648

4749
ctf_map.current_map = mapmeta
4850

51+
if barrier_data then
52+
ctf_map.current_map.barrier_data = barrier_data
53+
end
54+
4955
callback()
5056
end)
5157
end
@@ -61,7 +67,7 @@ local ID_WATER = minetest.get_content_id("default:water_source")
6167
---@param mapmeta table Map meta table
6268
---@param callback function
6369
function ctf_map.remove_barrier(mapmeta, callback)
64-
if not mapmeta.barriers then
70+
if not mapmeta.barrier_data then
6571
minetest.log("action", "Clearing barriers using mapmeta.barrier_area")
6672

6773
local pos1, pos2 = mapmeta.barrier_area.pos1, mapmeta.barrier_area.pos2
@@ -94,14 +100,26 @@ function ctf_map.remove_barrier(mapmeta, callback)
94100
vm2:update_liquids()
95101
end)
96102
else
103+
minetest.log("action", "Clearing barriers using barriers.data")
104+
97105
local i = 0
98-
for _, barrier_area in pairs(mapmeta.barriers) do
106+
for _, barrier_area in pairs(mapmeta.barrier_data) do
99107
minetest.after(i, function()
100108
local vm = VoxelManip()
101109
vm:read_from_map(barrier_area.pos1, barrier_area.pos2)
102110

103111
local data = vm:get_data()
104-
assert(#data == barrier_area.max)
112+
113+
if #data ~= barrier_area.max then
114+
-- minetest.log(dump(mapmeta.barrier_data)) -- Used for debugging issues
115+
minetest.log("error", "Potential issue with barriers.data. Aborting... | " ..
116+
"Debug: "..dump(#data)..", "..dump(barrier_area.max))
117+
118+
mapmeta.barrier_data = nil
119+
ctf_map.remove_barrier(mapmeta, callback)
120+
return
121+
end
122+
105123
for idx in pairs(data) do
106124
data[idx] = barrier_area.reps[idx] or ID_IGNORE
107125
end
@@ -110,13 +128,15 @@ function ctf_map.remove_barrier(mapmeta, callback)
110128
vm:write_to_map(false)
111129
end)
112130

113-
i = i + 0.04
131+
i = i + 0.05
114132
end
115133

116-
minetest.after(i - 0.04, function()
134+
minetest.after(i - 0.05, function()
117135
local vm = VoxelManip(mapmeta.pos1, mapmeta.pos2)
118136
vm:update_liquids()
119137

138+
mapmeta.barrier_data = nil -- Contains a large amount of data, free it up now that it's not needed
139+
120140
callback()
121141
end)
122142

@@ -193,8 +213,10 @@ local function prepare_nodes(pos1, pos2, data, team_chest_items, blacklisted_nod
193213
end
194214

195215
for _, team in ipairs(ctf_teams.teamlist) do
196-
local node = "ctf_teams:chest_" .. team
197-
nodes[minetest.get_content_id(node)] = minetest.registered_nodes[node]
216+
if not ctf_teams.team[team].not_playing then
217+
local node = "ctf_teams:chest_" .. team
218+
nodes[minetest.get_content_id(node)] = minetest.registered_nodes[node]
219+
end
198220
end
199221

200222
for i, v in ipairs(data) do

mods/ctf/ctf_map/map_meta.lua

+40-34
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,43 @@ local function calc_flag_center(map)
2626
return flag_center
2727
end
2828

29+
local function connect_barriers_file(map_name, offset, barriers_filepath)
30+
return function()
31+
local f, err = io.open(barriers_filepath, "rb")
32+
33+
if (ctf_core.settings.server_mode ~= "mapedit" and assert(f, err)) or f then
34+
local barriers = f:read("*all")
35+
36+
f:close()
37+
38+
assert(barriers and barriers ~= "")
39+
40+
barriers = minetest.deserialize(minetest.decompress(barriers, "deflate"))
41+
42+
if barriers then
43+
for _, barrier_area in pairs(barriers) do
44+
barrier_area.pos1 = vector.add(barrier_area.pos1, offset)
45+
barrier_area.pos2 = vector.add(barrier_area.pos2, offset)
46+
47+
for i = 1, barrier_area.max do
48+
if not barrier_area.reps[i] then
49+
barrier_area.reps[i] = minetest.CONTENT_IGNORE
50+
else
51+
barrier_area.reps[i] = minetest.get_content_id(barrier_area.reps[i])
52+
end
53+
end
54+
end
55+
56+
return barriers
57+
else
58+
minetest.log("error", "Map "..map_name.." has a corrupted barriers file. Re-save map to fix")
59+
end
60+
else
61+
minetest.log("error", "Map "..map_name.." is missing its barriers file. Re-save map to fix")
62+
end
63+
end
64+
end
65+
2966
function ctf_map.load_map_meta(idx, dirname)
3067
local meta = Settings(ctf_map.maps_dir .. dirname .. "/map.conf")
3168

@@ -134,7 +171,7 @@ function ctf_map.load_map_meta(idx, dirname)
134171
offset.y = -size.y/2
135172

136173
map = {
137-
map_version = CURRENT_MAP_VERSION,
174+
map_version = tonumber(meta:get("map_version") or "0"),
138175
pos1 = offset,
139176
pos2 = vector.add(offset, size),
140177
offset = offset,
@@ -160,39 +197,8 @@ function ctf_map.load_map_meta(idx, dirname)
160197
game_modes = minetest.deserialize(meta:get("game_modes")),
161198
enable_shadows = tonumber(meta:get("enable_shadows") or "0.26"),
162199
}
163-
if tonumber(meta:get("map_version")) > 2 and not ctf_core.settings.low_ram_mode then
164-
local f, err = io.open(ctf_map.maps_dir .. dirname .. "/barriers.data", "rb")
165-
166-
if (ctf_core.settings.server_mode ~= "mapedit" and assert(f, err)) or f then
167-
local barriers = f:read("*all")
168-
169-
f:close()
170-
171-
assert(barriers and barriers ~= "")
172-
173-
barriers = minetest.deserialize(minetest.decompress(barriers, "deflate"))
174-
175-
if barriers then
176-
for _, barrier_area in pairs(barriers) do
177-
barrier_area.pos1 = vector.add(barrier_area.pos1, offset)
178-
barrier_area.pos2 = vector.add(barrier_area.pos2, offset)
179-
180-
for i = 1, barrier_area.max do
181-
if not barrier_area.reps[i] then
182-
barrier_area.reps[i] = minetest.CONTENT_IGNORE
183-
else
184-
barrier_area.reps[i] = minetest.get_content_id(barrier_area.reps[i])
185-
end
186-
end
187-
end
188-
189-
map.barriers = barriers
190-
else
191-
minetest.log("error", "Map "..dirname.." has a corrupted barriers file. Re-save map to fix")
192-
end
193-
else
194-
minetest.log("error", "Map "..dirname.." is missing its barriers file. Re-save map to fix")
195-
end
200+
if tonumber(meta:get("map_version")) >= 3 and not ctf_core.settings.low_ram_mode then
201+
map.barriers = connect_barriers_file(dirname, offset, ctf_map.maps_dir .. dirname .. "/barriers.data")
196202
end
197203

198204
for id, def in pairs(map.chests) do

mods/ctf/ctf_modebase/build_timer.lua

+9-6
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ local function timer_func(time_left)
2929
end
3030

3131
local pteam = ctf_teams.get(player)
32-
if pteam and not ctf_core.pos_inside(player:get_pos(), ctf_teams.get_team_territory(pteam)) then
32+
local tpos1, tpos2 = ctf_teams.get_team_territory(pteam)
33+
if pteam and tpos1 and not ctf_core.pos_inside(player:get_pos(), tpos1, tpos2) then
3334
hud_events.new(player, {
3435
quick = true,
3536
text = "You can't cross the barrier until build time is over!",
@@ -47,6 +48,13 @@ local function timer_func(time_left)
4748
timer = minetest.after(1, timer_func, time_left - 1)
4849
end
4950

51+
function ctf_modebase.build_timer.start(build_time)
52+
local time = build_time or ctf_modebase:get_current_mode().build_timer or DEFAULT_BUILD_TIME
53+
54+
if time > 0 then
55+
timer = timer_func(time)
56+
end
57+
end
5058

5159
function ctf_modebase.build_timer.finish()
5260
if timer == nil then return end
@@ -76,10 +84,6 @@ function ctf_modebase.build_timer.finish()
7684
end
7785
end
7886

79-
ctf_api.register_on_new_match(function()
80-
timer = minetest.after(1, timer_func, ctf_modebase:get_current_mode().build_timer or DEFAULT_BUILD_TIME)
81-
end)
82-
8387
ctf_api.register_on_match_end(function()
8488
if timer == nil then return end
8589
timer:cancel()
@@ -119,4 +123,3 @@ minetest.register_chatcommand("ctf_start", {
119123
return true, "Build time ended"
120124
end,
121125
})
122-

0 commit comments

Comments
 (0)