@@ -11,12 +11,14 @@ function ctf_map.place_map(mapmeta, callback)
11
11
local dirname = mapmeta .dirname
12
12
local schempath = ctf_map .maps_dir .. dirname .. " /map.mts"
13
13
14
+ local barrier_data = mapmeta .barriers and mapmeta .barriers ()
15
+
14
16
ctf_map .emerge_with_callbacks (nil , mapmeta .pos1 , mapmeta .pos2 , function (ctx )
15
17
local rotation = (mapmeta .rotation and mapmeta .rotation ~= " z" ) and " 90" or " 0"
16
18
local res = minetest .place_schematic (mapmeta .pos1 , schempath , rotation , {[" ctf_map:chest" ] = " air" })
17
19
18
20
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
20
22
))
21
23
22
24
for name , def in pairs (mapmeta .teams ) do
@@ -46,6 +48,10 @@ function ctf_map.place_map(mapmeta, callback)
46
48
47
49
ctf_map .current_map = mapmeta
48
50
51
+ if barrier_data then
52
+ ctf_map .current_map .barrier_data = barrier_data
53
+ end
54
+
49
55
callback ()
50
56
end )
51
57
end
@@ -61,7 +67,7 @@ local ID_WATER = minetest.get_content_id("default:water_source")
61
67
--- @param mapmeta table Map meta table
62
68
--- @param callback function
63
69
function ctf_map .remove_barrier (mapmeta , callback )
64
- if not mapmeta .barriers then
70
+ if not mapmeta .barrier_data then
65
71
minetest .log (" action" , " Clearing barriers using mapmeta.barrier_area" )
66
72
67
73
local pos1 , pos2 = mapmeta .barrier_area .pos1 , mapmeta .barrier_area .pos2
@@ -94,14 +100,26 @@ function ctf_map.remove_barrier(mapmeta, callback)
94
100
vm2 :update_liquids ()
95
101
end )
96
102
else
103
+ minetest .log (" action" , " Clearing barriers using barriers.data" )
104
+
97
105
local i = 0
98
- for _ , barrier_area in pairs (mapmeta .barriers ) do
106
+ for _ , barrier_area in pairs (mapmeta .barrier_data ) do
99
107
minetest .after (i , function ()
100
108
local vm = VoxelManip ()
101
109
vm :read_from_map (barrier_area .pos1 , barrier_area .pos2 )
102
110
103
111
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
+
105
123
for idx in pairs (data ) do
106
124
data [idx ] = barrier_area .reps [idx ] or ID_IGNORE
107
125
end
@@ -110,13 +128,15 @@ function ctf_map.remove_barrier(mapmeta, callback)
110
128
vm :write_to_map (false )
111
129
end )
112
130
113
- i = i + 0.04
131
+ i = i + 0.05
114
132
end
115
133
116
- minetest .after (i - 0.04 , function ()
134
+ minetest .after (i - 0.05 , function ()
117
135
local vm = VoxelManip (mapmeta .pos1 , mapmeta .pos2 )
118
136
vm :update_liquids ()
119
137
138
+ mapmeta .barrier_data = nil -- Contains a large amount of data, free it up now that it's not needed
139
+
120
140
callback ()
121
141
end )
122
142
@@ -193,8 +213,10 @@ local function prepare_nodes(pos1, pos2, data, team_chest_items, blacklisted_nod
193
213
end
194
214
195
215
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
198
220
end
199
221
200
222
for i , v in ipairs (data ) do
0 commit comments