… | |
… | |
7 | use Coro; |
7 | use Coro; |
8 | use Coro::AIO; |
8 | use Coro::AIO; |
9 | |
9 | |
10 | our $emergency_position = $cf::CFG{emergency_position} || ["/world/world_105_115", 5, 37]; |
10 | our $emergency_position = $cf::CFG{emergency_position} || ["/world/world_105_115", 5, 37]; |
11 | |
11 | |
12 | our $DEACTIVATE_TIMEOUT = 60; # number of seconds after which maps get deactivated to save cpu |
12 | our $DEACTIVATE_TIMEOUT = 60; # number of seconds after which maps get deactivated to save cpu |
13 | our $SWAP_TIMEOUT = 600; # number of seconds after which maps inactive get swapped out |
13 | our $SWAP_TIMEOUT = 600; # number of seconds after which maps inactive get swapped out |
14 | our $SCHEDULE_INTERVAL = 8; # time the map scheduler sleeps between runs |
14 | our $SCHEDULE_INTERVAL = 8; # time the map scheduler sleeps between runs |
15 | our $SAVE_TIMEOUT = 60; # save maps every n seconds |
15 | our $SAVE_TIMEOUT = 60; # save maps every n seconds |
16 | our $SAVE_INTERVAL = 0.4; # save at max. one map every $SAVE_HOLD |
16 | our $SAVE_INTERVAL = 0.4; # save at max. one map every $SAVE_HOLD |
17 | our $MAX_RESET = 7200; |
17 | our $MAX_RESET = 7200; |
18 | |
18 | |
19 | $DEACTIVATE_TIMEOUT = 3;#d# |
19 | $DEACTIVATE_TIMEOUT = 3;#d# |
20 | $SWAP_TIMEOUT = 5;#d# |
20 | $SWAP_TIMEOUT = 5;#d# |
21 | $SCHEDULE_INTERVAL = 1; |
21 | $SCHEDULE_INTERVAL = 1; |
22 | |
22 | |
23 | our $SCHEDULER = cf::coro { |
23 | our $SCHEDULER = cf::coro { |
24 | Coro::Timer::sleep 3600;#d#TODO#for debugging only |
|
|
25 | while () { |
24 | while () { |
26 | Coro::Timer::sleep $SCHEDULE_INTERVAL; |
25 | Coro::Timer::sleep $SCHEDULE_INTERVAL; |
27 | |
26 | |
28 | for my $map (values %cf::MAP) { |
27 | for my $map (values %cf::MAP) { |
29 | eval { |
28 | eval { |
… | |
… | |
137 | or return; |
136 | or return; |
138 | |
137 | |
139 | $map->load_header ($path) |
138 | $map->load_header ($path) |
140 | or return; |
139 | or return; |
141 | |
140 | |
142 | $map->reset_time (0) if $map->reset_time > $cf::RUNTIME; |
|
|
143 | $map->reset_timeout (10);#d# |
|
|
144 | |
|
|
145 | $map->{load_path} = $path; |
141 | $map->{load_path} = $path; |
|
|
142 | use Data::Dumper; warn Dumper $map;#d# |
146 | |
143 | |
147 | $map |
144 | $map |
148 | } |
145 | } |
149 | |
146 | |
150 | sub cf::map::find_map { |
147 | sub cf::map::find_map { |
… | |
… | |
157 | |
154 | |
158 | $cf::MAP{$key} || do { |
155 | $cf::MAP{$key} || do { |
159 | # do it the slow way |
156 | # do it the slow way |
160 | my $map = try_load_header $path->save_path; |
157 | my $map = try_load_header $path->save_path; |
161 | |
158 | |
162 | if (!$map) { |
159 | if ($map) { |
|
|
160 | # safety |
|
|
161 | $map->{reset_time} = $cf::RUNTIME + $MAX_RESET |
|
|
162 | if $map->{reset_time} > $cf::RUNTIME + $MAX_RESET; |
|
|
163 | } else { |
163 | if (my $rmp = $path->random_map_params) { |
164 | if (my $rmp = $path->random_map_params) { |
164 | $map = generate_random_map $key, $rmp; |
165 | $map = generate_random_map $key, $rmp; |
165 | } else { |
166 | } else { |
166 | $map = try_load_header $path->load_path; |
167 | $map = try_load_header $path->load_path; |
167 | } |
168 | } |
168 | |
169 | |
169 | $map or return; |
170 | $map or return; |
170 | |
171 | |
171 | $map->{reset_time} = $cf::RUNTIME + $map->reset_timeout; |
172 | $map->{reset_time} = $cf::RUNTIME + ($map->reset_timeout || 3600); |
172 | $map->instantiate; |
173 | $map->instantiate; |
173 | |
174 | |
174 | # per-player maps become, after loading, normal maps |
175 | # per-player maps become, after loading, normal maps |
175 | $map->per_player (0) if $path->{user_rel}; |
176 | $map->per_player (0) if $path->{user_rel}; |
176 | } |
177 | } |
177 | |
178 | |
178 | $map->path ($key); |
179 | $map->path ($key); |
179 | $map->{path} = $path; |
180 | $map->{path} = $path; |
|
|
181 | $map->last_access ($cf::RUNTIME); |
180 | |
182 | |
181 | $map->reset if $map->should_reset; |
183 | $map->reset if $map->should_reset; |
182 | |
184 | |
183 | $cf::MAP{$key} = $map |
185 | $cf::MAP{$key} = $map |
184 | } |
186 | } |
… | |
… | |
270 | } |
272 | } |
271 | |
273 | |
272 | sub cf::map::should_reset { |
274 | sub cf::map::should_reset { |
273 | my ($map) = @_; |
275 | my ($map) = @_; |
274 | |
276 | |
275 | return;#d# |
|
|
276 | # TODO: safety, remove and allow resettable per-player maps |
277 | # TODO: safety, remove and allow resettable per-player maps |
277 | return if $map->{path}{user_rel};#d# |
278 | return if $map->{path}{user_rel};#d# |
278 | return unless $map->reset_timeout; |
279 | #return unless $map->reset_timeout; |
279 | |
280 | |
280 | my $time = $map->fixed_resettime ? $map->{reset_time} : $map->last_access; |
281 | my $time = $map->fixed_resettime ? $map->{reset_time} : $map->last_access; |
281 | |
282 | |
282 | $time + $map->reset_timeout < $cf::RUNTIME |
283 | $time < $cf::RUNTIME |
283 | } |
284 | } |
284 | |
285 | |
285 | sub cf::map::reset { |
286 | sub cf::map::reset { |
286 | my ($self) = @_; |
287 | my ($self) = @_; |
287 | |
288 | |