Skip to content

Commit 7a7e4a5

Browse files
authored
Merge branch 'master' into class-change
2 parents 3a1705c + 5c1b73c commit 7a7e4a5

File tree

14 files changed

+161
-117
lines changed

14 files changed

+161
-117
lines changed

.github/pull_request_template.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
3+
- [ ] This PR has been tested locally

README.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ Previous Developers: [savilli](https://github.com/savilli).
5454

5555
Check out [mods/](mods/) to see all the installed mods and their respective licenses.
5656

57-
Licenses where not specified:
58-
Code: LGPLv2.1+
59-
Textures: CC-BY-SA 3.0
57+
Licenses where not specified:\
58+
Code: [GNU LGPLv2.1+](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html)\
59+
Media: [CC BY-SA 3.0 Unported](https://creativecommons.org/licenses/by-sa/3.0/)
6060

6161
### Textures
6262

63-
* [Header](menu/header.png): CC-BY-3.0 by [SuddenSFD](https://github.com/SuddenSFD)
64-
* [Background Image](menu/background.png): CC BY-SA 4.0 (where applicable) by [GreenBlob](https://github.com/a-blob) (Uses [Minetest Game](https://github.com/minetest/minetest_game) textures, the majority of which are licensed CC-BY-SA 3.0). The player skins used are licensed CC-BY-SA 3.0
65-
* [Icon](menu/icon.png): CC-BY-3.0 by [SuddenSFD](https://github.com/SuddenSFD)
63+
* [Header](menu/header.png): [CC BY 3.0 Unported](https://creativecommons.org/licenses/by/3.0/) by [SuddenSFD](https://github.com/SuddenSFD)
64+
* [Background Image](menu/background.png): [CC BY-SA 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/) (where applicable) by [GreenBlob](https://github.com/a-blob) (Uses [Minetest Game](https://github.com/minetest/minetest_game) textures, the majority of which are licensed [CC BY-SA 3.0 Unported](https://creativecommons.org/licenses/by-sa/3.0/)). The player skins used are licensed under [CC BY-SA 3.0 Unported](https://creativecommons.org/licenses/by-sa/3.0/)
65+
* [Icon](menu/icon.png): [CC BY 3.0](https://creativecommons.org/licenses/by/3.0/) by [SuddenSFD](https://github.com/SuddenSFD)

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/hud_events/init.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ local function show_quick_hud_event(player, huddef)
5151
end
5252

5353
if quick_event_timer[pname] then
54-
quick_event_timer[pname].cancel()
54+
quick_event_timer[pname]:cancel()
5555
end
5656
quick_event_timer[pname] = minetest.after(HUD_SHOW_QUICK_TIME, function()
5757
if not player:is_player() then return end

mods/ctf/ctf_chat/init.lua

-12
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,6 @@ minetest.override_chatcommand("me", {
6464
end
6565
})
6666

67-
minetest.override_chatcommand("donate", {
68-
func = function(name, param)
69-
local old_func = minetest.registered_chatcommands["donate"].func
70-
if filter and not filter.check_message(name, param) then
71-
filter.on_violation(name, param)
72-
return false, "No swearing"
73-
end
74-
75-
return old_func(name, param)
76-
end
77-
})
78-
7967
minetest.register_chatcommand("t", {
8068
params = "msg",
8169
description = "Send a message on the team channel",

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/map_functions.lua

+26-6
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

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/features.lua

+21-16
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,15 @@ ctf_core.testing = {
1010
local one_third = math.ceil(0.34 * total_players)
1111
local one_fourth = math.ceil(0.25 * total_players)
1212
local avg = (kd_diff + actual_kd_diff) / 2
13+
local pcount_diff_limit = (
14+
(players_diff <= math.min(one_fourth, 2)) or
15+
(pkd >= 1.8 and players_diff <= math.min(one_third, 4))
16+
)
1317
if best_kd.kills + worst_kd.kills >= 30 then
1418
avg = actual_kd_diff
1519
end
16-
return (best_kd.kills + worst_kd.kills >= 30 and best_kd.t == best_players.t) or
17-
(
18-
pkd >= math.min(1, kd_diff/2) and avg >= 0.4 and
19-
(
20-
players_diff <= math.min(one_fourth, 3) or
21-
(pkd >= 1.5 and players_diff <= math.min(one_third, 6))
22-
)
23-
)
20+
return pcount_diff_limit and ((best_kd.kills + worst_kd.kills >= 30 and best_kd.t == best_players.t) or
21+
(pkd >= math.min(1, kd_diff/2) and avg >= 0.4))
2422
end
2523
}
2624

@@ -29,6 +27,13 @@ local LOADING_SCREEN_TARGET_TIME = 7
2927
local loading_screen_time
3028

3129
local function update_playertag(player, t, nametag, team_nametag, symbol_nametag)
30+
if not nametag.object.set_observers or
31+
not team_nametag.object.set_observers or
32+
not symbol_nametag.object.set_observers
33+
then
34+
return
35+
end
36+
3237
local entity_players = {}
3338
local nametag_players = table.copy(ctf_teams.online_players[t].players)
3439
local symbol_players = {}
@@ -53,9 +58,9 @@ local function update_playertag(player, t, nametag, team_nametag, symbol_nametag
5358
end
5459

5560
-- Occasionally crashes in singleplayer, so call it safely
56-
pcall( team_nametag.object.set_observers, team_nametag.object, nametag_players)
57-
pcall(symbol_nametag.object.set_observers, symbol_nametag.object, symbol_players )
58-
pcall( nametag.object.set_observers, nametag.object, entity_players )
61+
nametag.object:set_observers(entity_players )
62+
team_nametag.object:set_observers(nametag_players)
63+
symbol_nametag.object:set_observers(symbol_players )
5964
end
6065

6166
local tags_hidden = false
@@ -101,11 +106,11 @@ local function set_playertags_state(state)
101106
local nametag = playertag.entity
102107
local symbol_entity = playertag.symbol_entity
103108

104-
if nametag and team_nametag and symbol_entity then
105-
-- Occasionally crashes in singleplayer, so call it safely
106-
pcall( team_nametag.object.set_observers, team_nametag.object, {})
107-
pcall(symbol_entity.object.set_observers, symbol_entity.object, {})
108-
pcall( nametag.object.set_observers, nametag.object, {})
109+
if nametag and team_nametag and symbol_entity and
110+
nametag.object.set_observers and team_nametag.object.set_observers and symbol_entity.object.set_observers then
111+
team_nametag.object:set_observers({})
112+
symbol_entity.object:set_observers({})
113+
nametag.object:set_observers({})
109114
end
110115
end
111116
end

0 commit comments

Comments
 (0)