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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines