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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines