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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines