ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/commands.ext
(Generate patch)

Comparing deliantra/server/ext/commands.ext (file contents):
Revision 1.55 by root, Fri Jul 20 14:13:58 2007 UTC vs.
Revision 1.72 by root, Sun Jan 11 06:08:40 2009 UTC

1#! perl # mandatory depends=irc 1#! perl # mandatory depends=irc
2 2
3use POSIX (); 3use POSIX ();
4 4
5# miscellaneous commands 5# miscellaneous commands
6
7sub rename_to($$$) {
8 my ($ob, $from, $to) = @_;
9
10 $to =~ /^[a-zA-Z0-9.,=#\/%$!^ ]*$/
11 or return $ob->message ("rename: name must consist only of letters, digits, spaces and a few other things.");
12
13 127 >= length $to
14 or return $ob->message ("rename: new name must be <= 127 characters.");
15
16 my $item;
17
18 if (length $from) {
19 $item = $ob->find_best_object_match ($from)
20 or return $ob->message ("rename: could not find a matching item to rename.");
21 } else {
22 $item = $ob->find_marked_object
23 or return $ob->message ("rename: no from name and no marked item found to rename.");
24 }
25
26 $item->custom_name (length $to ? $to : undef);
27
28 if (length $to) {
29 $item->custom_name ($to);
30 $ob->message ("Your " . $item->base_name . " will now be called $to.");
31 } else {
32 $item->custom_name (undef);
33 $ob->message ("You stop calling your " . $item->base_name . " with weird names.");
34 }
35
36 $ob->esrv_update_item (cf::UPD_NAME, $item);
37
38 1
39}
40 6
41sub who_listing(;$$) { 7sub who_listing(;$$) {
42 my ($privileged, $select) = @_; 8 my ($privileged, $select) = @_;
43 9
44 my ($numwiz, $numafk) = (0, 0); 10 my ($numwiz, $numafk) = (0, 0);
68 . ($pl->peaceful ? " [peaceful]" : " [HOSTILE]") 34 . ($pl->peaceful ? " [peaceful]" : " [HOSTILE]")
69 . ($ns->afk ? " [AFK]" : "") 35 . ($ns->afk ? " [AFK]" : "")
70 . ($ob->flag (cf::FLAG_WIZ) ? " [WIZ]" : "") 36 . ($ob->flag (cf::FLAG_WIZ) ? " [WIZ]" : "")
71 . " [" . $pl->ns->version . "]" 37 . " [" . $pl->ns->version . "]"
72 . " [" . ($pl->peaceful || $privileged ? $ob->map->visible_name : $ob->region->name) . "]" 38 . " [" . ($pl->peaceful || $privileged ? $ob->map->visible_name : $ob->region->name) . "]"
73 . (sprintf " [rtt %.3fs]", $pl->ns->rtt * 1e-6) 39 . (sprintf " [rtt %.3fs]", $pl->ns->tcpi_rtt * 1e-6)
74 . ($privileged ? " " . $pl->ns->host : "") 40 . ($privileged ? " " . $pl->ns->host : "")
75 } sort { (lc $a->ob->name) cmp (lc $b->ob->name) } @pl 41 } sort { (lc $a->ob->name) cmp (lc $b->ob->name) } @pl
76 ), 42 ),
77 eval { "* IRC: " . join ", ", ext::irc::users }, 43 eval { "* IRC: " . join ", ", ext::irc::users },
78 ) 44 )
81cf::register_command who => sub { 47cf::register_command who => sub {
82 my ($ob, $arg) = @_; 48 my ($ob, $arg) = @_;
83 49
84 $ob->speed_left ($ob->speed_left - 4); 50 $ob->speed_left ($ob->speed_left - 4);
85 51
86 $ob->reply (undef, (join "\n", who_listing $ob->may ("extended_who"), $arg), cf::NDI_UNIQUE | cf::NDI_DK_ORANGE); 52 $ob->send_msg ("c/who" => (join "\r", who_listing $ob->may ("extended_who"), $arg), cf::NDI_DK_ORANGE | cf::NDI_REPLY | cf::NDI_CLEAR | cf::NDI_DEF);
87
88 1
89}; 53};
90 54
91cf::register_command seen => sub { 55cf::register_command seen => sub {
92 my ($pl, $args) = @_; 56 my ($pl, $args) = @_;
93 57
58 cf::async {
94 if (my ($login) = $args =~ /(\S+)/) { 59 if (my ($login) = $args =~ /(\S+)/) {
95 if ($login eq $pl->name) { 60 if ($login eq $pl->name) {
96 $pl->message ("Very funny, $login. Ha. Ha.", cf::NDI_UNIQUE); 61 $pl->message ("Very funny, $login. Ha. Ha.", cf::NDI_REPLY);
97 } elsif (cf::player::find_active $login) { 62 } elsif (cf::player::find_active $login) {
98 $pl->message ("$login is right here on this server!", cf::NDI_UNIQUE); 63 $pl->message ("$login is right here on this server!", cf::NDI_REPLY);
99 } elsif (cf::player::exists $login 64 } elsif (cf::player::exists $login
100 and stat cf::player::path $login) { 65 and stat cf::player::path $login) {
101 my $time = (stat _)[9]; 66 my $time = (stat _)[9];
102 67
103 $pl->message ("$login was last seen here " 68 $pl->message ("$login was last seen here "
104 . (POSIX::strftime "%Y-%m-%d %H:%M:%S +0000", gmtime $time) 69 . (POSIX::strftime "%Y-%m-%d %H:%M:%S +0000", gmtime $time)
105 . " which was " . (int +(time - $time) / 3600) . " hours ago.", cf::NDI_UNIQUE); 70 . " which was " . (int +(time - $time) / 3600) . " hours ago.", cf::NDI_REPLY);
71 } else {
72 $pl->message ("No player named $login is known to me.", cf::NDI_REPLY);
73 }
106 } else { 74 } else {
107 $pl->message ("No player named $login is known to me.", cf::NDI_UNIQUE); 75 $pl->message ("Usage: seen <player>", cf::NDI_REPLY);
108 } 76 }
109 } else {
110 $pl->message ("Usage: seen <player>", cf::NDI_UNIQUE);
111 } 77 };
112}; 78};
113 79
114cf::register_command body => sub { 80cf::register_command body => sub {
115 my ($ob) = @_; 81 my ($ob) = @_;
116 82
117 # Too hard to try and make a header that lines everything up, so just 83 # Too hard to try and make a header that lines everything up, so just
118 # give a description. (comment from C++) 84 # give a description. (comment from C++)
119 my $reply = 85 my $reply =
120 "The first column is the name of the body location.\n\n" 86 "The first column is the name of the body location.\r"
121 . "The second column is how many of those locations your body has.\n\n" 87 . "The second column is how many of those locations your body has.\r"
122 . "The third column is how many slots in that location are available.\n\n"; 88 . "The third column is how many slots in that location are available.\r"
89 . "The last column shows the items currently using the slot\n\n";
123 90
91 # first process all applied items and hash them into their slots
92 my @slot;
93
94 for my $item (grep $_->flag (cf::FLAG_APPLIED), $ob->inv) {
95 $item->slot_info ($_)
96 and push @{ $slot[$_] }, $item
97 for 0 .. cf::NUM_BODY_LOCATIONS-1;
98 }
99
124 $reply .= sprintf " %-20s %3s %5s\n", "Location", "You", "Avail"; 100 $reply .= sprintf " %-20s %3s %5s %s\n", "Location", "You", "Avail", "What";
125 for (0 .. cf::NUM_BODY_LOCATIONS - 1) { 101 for (0 .. cf::NUM_BODY_LOCATIONS - 1) {
126 my $msg = cf::object::slot_nonuse_name $_; 102 my $msg = cf::object::slot_nonuse_name $_;
127 $msg =~ s/^.*? a //; 103 $msg =~ s/^.*? a //;
128 $reply .= sprintf " %-20s %3d %5d\n", $msg, $ob->slot_info ($_), $ob->slot_used ($_) 104 $reply .= sprintf " %-20s %3d %5d %s\n",
105 $msg,
106 $ob->slot_info ($_),
107 $ob->slot_used ($_),
108 join ", ", map $_->query_short_name, @{ $slot[$_] }
129 if $ob->slot_info ($_) or $ob->slot_used ($_); 109 if $ob->slot_info ($_) || $ob->slot_used ($_);
130 } 110 }
131 111
132 $reply .= "You are not allowed to wear armor\n\n" 112 $reply .= "You are not allowed to wear armor\r"
133 unless $ob->flag (cf::FLAG_USE_ARMOUR); 113 unless $ob->flag (cf::FLAG_USE_ARMOUR);
134 $reply .= "You are not allowed to use weapons\n\n" 114 $reply .= "You are not allowed to use weapons\r"
135 unless $ob->flag (cf::FLAG_USE_WEAPON); 115 unless $ob->flag (cf::FLAG_USE_WEAPON);
136 116
137 $ob->reply (undef, $reply); 117 $ob->send_msg ("c/body" => $reply, cf::NDI_REPLY);
138
139 1
140}; 118};
141 119
142cf::register_command mark => sub { 120cf::register_command mark => sub {
143 my ($pl, $arg) = @_; 121 my ($pl, $arg) = @_;
144 122
155 133
156 $pl->reply (undef, $ob 134 $pl->reply (undef, $ob
157 ? (sprintf "%s %s * is marked.", $ob->name, $ob->title) 135 ? (sprintf "%s %s * is marked.", $ob->name, $ob->title)
158 : "You have no marked object."); 136 : "You have no marked object.");
159 } 137 }
160
161 1
162}; 138};
163 139
164for my $cmd ("run", "fire") { 140for my $cmd ("run", "fire") {
165 my $oncmd = "${cmd}_on"; 141 my $oncmd = "${cmd}_on";
166 cf::register_command $cmd => sub { 142 cf::register_command $cmd => sub {
169 $ob->reply (undef, "Can't $cmd into a non adjacent square.") 145 $ob->reply (undef, "Can't $cmd into a non adjacent square.")
170 if $arg < 0 or $arg >= 9; 146 if $arg < 0 or $arg >= 9;
171 147
172 $ob->contr->$oncmd (1); 148 $ob->contr->$oncmd (1);
173 $ob->move_player ($arg); 149 $ob->move_player ($arg);
174
175 1
176 }; 150 };
177 151
178 cf::register_command "${cmd}_stop" => sub { 152 cf::register_command "${cmd}_stop" => sub {
179 my ($ob) = @_; 153 my ($ob) = @_;
180 154
181 $ob->contr->$oncmd (0); 155 $ob->contr->$oncmd (0);
182
183 1
184 }; 156 };
185} 157}
186 158
187cf::register_command mapinfo => sub { 159cf::register_command mapinfo => sub {
188 my ($ob) = @_; 160 my ($ob) = @_;
189 161
190 $ob = $ob->contr->observe; 162 my $observe = $ob->contr->observe;
191 163
192 my $map = $ob->map 164 my $map = $observe->map
193 or return; 165 or return;
166
194 $ob->reply (undef, (sprintf "%s (%s) %s", $map->name, $map->path, $ob->region->longname)); 167 my $msg = sprintf "%s (%s)\r%s", $map->name, $map->path, $observe->region->longname;
195 $ob->reply (undef, (sprintf "players: %d difficulty: %d size: %d start: %dx%d timeout: %d", 168 $msg .= sprintf "\rplayers: %d difficulty: %d size: %d start: %dx%d timeout: %d",
196 (scalar $map->players), $map->difficulty, $map->width, $map->height, $map->enter_x, $map->enter_y, $map->timeout)) 169 (scalar $map->players), $map->difficulty, $map->width, $map->height, $map->enter_x, $map->enter_y, $map->timeout
197 if $ob->flag (cf::FLAG_WIZ); 170 if $ob->flag (cf::FLAG_WIZ);
198 $ob->reply (undef, $map->msg);
199 171
200 1 172 $ob->send_msg ("c/mapinfo" => $msg, cf::NDI_REPLY | cf::NDI_CLEAR);
201}; 173};
202 174
203cf::register_command whereami => sub { 175cf::register_command whereami => sub {
204 my ($ob) = @_; 176 my ($ob) = @_;
205 177
206 my $reg = $ob->contr->observe->region; 178 my $reg = $ob->contr->observe->region;
207 $ob->reply (undef, (sprintf "You are %s.\n%s", $reg->longname, $reg->msg)); 179 $ob->send_msg ("c/who" => (sprintf "You are %s.\n\n%s", $reg->longname, $reg->msg), cf::NDI_REPLY | cf::NDI_CLEAR);
180};
208 181
182cf::register_command whereabouts => sub {
183 my ($ob, $arg) = @_;
184
185 my %count;
186
187 for my $pl (cf::player::list) {
188 ++$count{$pl->ob->region->longname};
209 1 189 }
190
191 my $msg = "T<In the world currently there are:>\n\n"
192 . join "", map { sprintf " C<%3d >player(s) %s\r", $count{$_}, $_ } sort keys %count;
193
194 $ob->send_msg ("c/who" => $msg, cf::NDI_REPLY | cf::NDI_CLEAR);
195};
196
197cf::register_command hiscore => sub {
198 my ($ob, $arg) = @_;
199
200 my $url = $cf::CFG{hiscore_url};
201 $ob->send_msg (log => "See $url", cf::NDI_REPLY);
210}; 202};
211 203
212sub _set_mode($$$@) { 204sub _set_mode($$$@) {
213 my ($name, $ob, $arg, $slot, @choices) = @_; 205 my ($name, $ob, $arg, $slot, @choices) = @_;
214 206
226 218
227cf::register_command applymode => sub { 219cf::register_command applymode => sub {
228 my ($ob, $arg) = @_; 220 my ($ob, $arg) = @_;
229 221
230 _set_mode "applymode", $ob, $arg, unapply => qw(nochoice never always); 222 _set_mode "applymode", $ob, $arg, unapply => qw(nochoice never always);
231
232 1
233}; 223};
234 224
235cf::register_command petmode => sub { 225cf::register_command petmode => sub {
236 my ($ob, $arg) = @_; 226 my ($ob, $arg) = @_;
237 227
238 _set_mode "petmode", $ob, $arg, petmode => qw(normal sad defend arena); 228 _set_mode "petmode", $ob, $arg, petmode => qw(normal sad defend arena);
239
240 1
241}; 229};
242 230
243cf::register_command usekeys => sub { 231cf::register_command usekeys => sub {
244 my ($ob, $arg) = @_; 232 my ($ob, $arg) = @_;
245 233
246 _set_mode "usekeys", $ob, $arg, usekeys => qw(inventory keyrings containers); 234 _set_mode "usekeys", $ob, $arg, usekeys => qw(inventory keyrings containers);
247
248 1
249}; 235};
250 236
251cf::register_command hintmode => sub { 237cf::register_command hintmode => sub {
252 my ($ob, $arg) = @_; 238 my ($ob, $arg) = @_;
253 239
254 _set_mode "hintmode", $ob, $arg, hintmode => qw(show mark hide); 240 _set_mode "hintmode", $ob, $arg, hintmode => qw(show mark hide);
255
256 1
257}; 241};
258 242
259cf::register_command afk => sub { 243cf::register_command afk => sub {
260 my ($ob, $arg) = @_; 244 my ($ob, $arg) = @_;
261 245
262 $ob->contr->ns->afk ($ob->contr->ns->afk ? 0 : 1); 246 $ob->contr->ns->afk ($ob->contr->ns->afk ? 0 : 1);
263 $ob->reply (undef, $ob->contr->ns->afk ? "You are now AFK" : "You are no longer AFK"); 247 $ob->reply (undef, $ob->contr->ns->afk ? "You are now AFK" : "You are no longer AFK");
264
265 1
266}; 248};
267 249
268cf::register_command sound => sub { 250cf::register_command sound => sub {
269 my ($ob, $arg) = @_; 251 my ($ob, $arg) = @_;
270 252
271 $ob->contr->ns->sound ($ob->contr->ns->sound ? 0 : 1); 253 $ob->contr->ns->sound ($ob->contr->ns->sound ? 0 : 1);
272 $ob->reply (undef, $ob->contr->ns->sound ? "The sounds are enabled." : "Silence is golden..."); 254 $ob->reply (undef, $ob->contr->ns->sound ? "The sounds are enabled." : "Silence is golden...");
273
274 1
275}; 255};
276 256
277cf::register_command brace => sub { 257cf::register_command brace => sub {
278 my ($ob, $arg) = @_; 258 my ($ob, $arg) = @_;
279 259
280 $ob->contr->braced ($ob->contr->braced ? 0 : 1); 260 $ob->contr->braced ($ob->contr->braced ? 0 : 1);
281 $ob->reply (undef, $ob->contr->braced ? "You are braced." : "Not braced."); 261 $ob->reply (undef, $ob->contr->braced ? "You are braced." : "Not braced.");
282
283 1
284}; 262};
285 263
286cf::register_command 'output-rate' => sub { 264cf::register_command 'output-rate' => sub {
287 my ($ob, $arg) = @_; 265 my ($ob, $arg) = @_;
288 266
289 return $ob->reply (undef, sprintf "Output rate is presently %dbps.", $ob->contr->ns->max_rate / $cf::TICK) 267 return $ob->reply (undef, sprintf "Output rate is presently %dbps.", $ob->contr->ns->max_rate / $cf::TICK)
290 unless $arg > 0; 268 unless $arg > 0;
291 269
292 # minimum is 5k/s 270 # minimum is 5k/s
271 # maximum is 100k/s, this should be configurable
293 $ob->contr->ns->max_rate ((List::Util::max 5000, $arg) * $cf::TICK); 272 $ob->contr->ns->max_rate ((List::Util::max 5000, List::Util::min 100000, $arg) * $cf::TICK);
294 $ob->reply (undef, sprintf "Output rate now set to %dbps.", $ob->contr->ns->max_rate / $cf::TICK); 273 $ob->reply (undef, sprintf "Output rate now set to %dbps.", $ob->contr->ns->max_rate / $cf::TICK);
295
296 1
297}; 274};
298 275
299cf::register_command 'output-count' => sub { 276cf::register_command 'output-count' => sub {
300 my ($ob, $arg) = @_; 277 my ($ob, $arg) = @_;
301 278
304 281
305 $arg = 4 if $arg < 4; 282 $arg = 4 if $arg < 4;
306 283
307 $ob->contr->outputs_count ($arg); 284 $ob->contr->outputs_count ($arg);
308 $ob->reply (undef, "Output count now set to " . $ob->contr->outputs_count); 285 $ob->reply (undef, "Output count now set to " . $ob->contr->outputs_count);
309
310 1
311}; 286};
312 287
313cf::register_command 'output-sync' => sub { 288cf::register_command 'output-sync' => sub {
314 my ($ob, $arg) = @_; 289 my ($ob, $arg) = @_;
315 290
318 293
319 $arg = 0.5 if $arg < 0.5; 294 $arg = 0.5 if $arg < 0.5;
320 295
321 $ob->contr->outputs_sync ($arg / $cf::TICK); 296 $ob->contr->outputs_sync ($arg / $cf::TICK);
322 $ob->reply (undef, sprintf "Output sync time now set to %.1fs", $ob->contr->outputs_sync * $cf::TICK); 297 $ob->reply (undef, sprintf "Output sync time now set to %.1fs", $ob->contr->outputs_sync * $cf::TICK);
323
324 1
325}; 298};
326 299
327# XXX: This has a bug. After one sets his wimpy level to 0 and resets it to 300# XXX: This has a bug. After one sets his wimpy level to 0 and resets it to
328# some other level (which may also be 0), this does not get echoed, 301# some other level (which may also be 0), this does not get echoed,
329# but it does get set. 302# but it does get set.
336 309
337 return $ob->run_away ($arg) && $ob->reply (undef, "Your new wimpy level is $arg.") 310 return $ob->run_away ($arg) && $ob->reply (undef, "Your new wimpy level is $arg.")
338 if $arg =~ /^\d+$/ and $arg <= 100; 311 if $arg =~ /^\d+$/ and $arg <= 100;
339 312
340 $ob->reply (undef, "Incorrect parameters for wimpy: $arg"); 313 $ob->reply (undef, "Incorrect parameters for wimpy: $arg");
341
342 1
343}; 314};
344 315
345cf::register_command peaceful => sub { 316cf::register_command peaceful => sub {
346 my ($ob, $arg) = @_; 317 my ($ob, $arg) = @_;
347 318
350 ." if you want to become hostile or in temple of Valriel" 321 ." if you want to become hostile or in temple of Valriel"
351 ." if you want to become peaceful again."); 322 ." if you want to become peaceful again.");
352 323
353 #$ob->contr->peaceful ($ob->contr->peaceful ? 0 : 1); 324 #$ob->contr->peaceful ($ob->contr->peaceful ? 0 : 1);
354 #$ob->reply (undef, $ob->contr->peaceful ? "You will attack other players." : "You will not attack other players."); 325 #$ob->reply (undef, $ob->contr->peaceful ? "You will attack other players." : "You will not attack other players.");
326};
355 327
328sub rename_to($$$) {
329 my ($ob, $from, $to) = @_;
330
331 $to =~ /^[a-zA-Z0-9.,=#\/%$!^ ]*$/
332 or return $ob->message ("rename: name must consist only of letters, digits, spaces and a few other things.");
333
334 127 >= length $to
335 or return $ob->message ("rename: new name must be <= 127 characters.");
336
337 my $item;
338
339 if (length $from) {
340 $item = $ob->find_best_object_match ($from)
341 or return $ob->message ("rename: could not find a matching item to rename.");
342 } else {
343 $item = $ob->find_marked_object
344 or return $ob->message ("rename: no from name and no marked item found to rename.");
345 }
346
347 $item->custom_name (length $to ? $to : undef);
348
349 if (length $to) {
350 $item->custom_name ($to);
351 $ob->message ("Your " . $item->base_name . " will now be called $to.");
352 } else {
353 $item->custom_name (undef);
354 $ob->message ("You stop calling your " . $item->base_name . " with weird names.");
355 }
356
357 $ob->esrv_update_item (cf::UPD_NAME, $item);
358
356 1 359 1
357}; 360}
358 361
359cf::register_command rename => sub { 362cf::register_command rename => sub {
360 my ($ob, $arg) = @_; 363 my ($ob, $arg) = @_;
361 364
362 $ob->speed_left ($ob->speed_left - 0.25); 365 $ob->speed_left ($ob->speed_left - 0.25);
376 # does not unquote $1 or $3 379 # does not unquote $1 or $3
377 rename_to $ob, $2||$1, $4||$3; 380 rename_to $ob, $2||$1, $4||$3;
378 } else { 381 } else {
379 $ob->reply (undef, 'Syntax error. Rename usage: rename ["oldname"] to "newname"'); 382 $ob->reply (undef, 'Syntax error. Rename usage: rename ["oldname"] to "newname"');
380 } 383 }
381
382 1
383}; 384};
384 385
385cf::register_command uptime => sub { 386cf::register_command uptime => sub {
386 my ($ob, $arg) = @_; 387 my ($ob, $arg) = @_;
387 388
388 my $startup = POSIX::strftime "%Y-%m-%d %H:%M:%S %Z", localtime $cf::UPTIME; 389 my $startup = POSIX::strftime "%Y-%m-%d %H:%M:%S %Z", localtime $cf::UPTIME;
389 my $runtime = sprintf "%.1f", (time - $cf::UPTIME) / 86400; 390 my $runtime = sprintf "%.1f", (time - $cf::UPTIME) / 86400;
390 $ob->reply (undef, "server started $startup, uptime ${runtime}\d"); 391 $ob->send_msg ("c/uptime" => "server started $startup, uptime ${runtime}\d", cf::NDI_REPLY | cf::NDI_CLEAR);
391
392 1
393}; 392};
394 393
395my %IN_MEMORY = ( 394my %IN_MEMORY = (
396 cf::MAP_IN_MEMORY => "I", 395 cf::MAP_ACTIVE => "I",
397 cf::MAP_SWAPPED => "S", 396 cf::MAP_SWAPPED => "S",
398 cf::MAP_LOADING => "L", 397 cf::MAP_LOADING => "L",
399); 398);
400 399
401cf::register_command maps => sub { 400cf::register_command maps => sub {
402 my ($ob, $arg) = @_; 401 my ($ob, $arg) = @_;
403 402
404 no re 'eval'; $arg = qr<$arg>; 403 no re 'eval'; $arg = qr<$arg>;
405 404
406 my $format = "%2s %1s %3s %5s %.60s\n"; 405 my $format = " %2s %1s %3s %5s %.60s\n";
407 406
408 $ob->reply (undef, (sprintf $format, "Pl", "I", "Svd", "Reset", "Name"), cf::NDI_BLACK | cf::NDI_UNIQUE); 407 my $msg = "\n" . sprintf $format, "Pl", "I", "Svd", "Reset", "Name";
409 408
410 for (sort keys %cf::MAP) { 409 for (sort keys %cf::MAP) {
411 my $map = $cf::MAP{$_} 410 my $map = $cf::MAP{$_}
412 or next; 411 or next;
413 412
415 next if $map->{deny_list}; 414 next if $map->{deny_list};
416 415
417 my $svd = int $cf::RUNTIME - $map->{last_save}; 416 my $svd = int $cf::RUNTIME - $map->{last_save};
418 $svd = "++" if $svd > 99; 417 $svd = "++" if $svd > 99;
419 418
420 $ob->reply (undef, 419 $msg .= sprintf $format,
421 (sprintf $format,
422 (scalar $map->players), 420 (scalar $map->players),
423 $IN_MEMORY{$map->in_memory} || "?", 421 $IN_MEMORY{$map->in_memory} || "?",
424 $svd, 422 $svd,
425 (int $map->reset_at - $cf::RUNTIME), 423 (int $map->reset_at - $cf::RUNTIME),
426 $map->visible_name), 424 $map->visible_name;
427 cf::NDI_BLACK | cf::NDI_UNIQUE);
428 }
429
430 1 425 }
431};
432 426
427 $ob->send_msg ("c/mapinfo" => $msg, cf::NDI_REPLY | cf::NDI_CLEAR);
428};
429

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines