--- deliantra/server/ext/commands.ext 2006/12/15 19:29:18 1.1 +++ deliantra/server/ext/commands.ext 2007/01/03 18:50:52 1.12 @@ -7,7 +7,7 @@ sub rename_to($$$) { my ($ob, $from, $to) = @_; - $to =~ /^[a-zA-Z0-9.,=#\/%$!^]*$/ + $to =~ /^[a-zA-Z0-9.,=#\/%$!^ ]*$/ or return $ob->message ("rename: name must consist only of letters, digits, spaces and a few other things."); 127 >= length $to @@ -47,13 +47,14 @@ my @pl; foreach my $pl (cf::player::list) { + my $ns = $pl->ns or next; my $ob = $pl->ob; next unless $ob->map && ($privileged || !$pl->hidden); $numwiz++ if $ob->flag (cf::FLAG_WIZ); - $numafk++ if $ob->flag (cf::FLAG_AFK); + $numafk++ if $ns->afk; push @pl, $pl; } @@ -62,16 +63,16 @@ "Total Players in The World. (" . (scalar @pl) . ") -- WIZ($numwiz) AFK($numafk) BOT(0)", ( map { - my ($pl, $ob) = ($_, $_->ob); + my ($pl, $ob, $ns) = ($_, $_->ob, $_->ns); "* " . $ob->name . "/" . $ob->level . " " . (length $pl->own_title ? $pl->own_title : "the " . $pl->title) . ($pl->peaceful ? " [peaceful]" : " [HOSTILE]") - . ($ob->flag (cf::FLAG_AFK) ? " [AFK]" : "") + . ($ns->afk ? " [AFK]" : "") . ($ob->flag (cf::FLAG_WIZ) ? " [WIZ]" : "") - . " [" . $pl->socket->client . "]" - . " [" . ($pl->peaceful || $privileged ? $ob->map->path : $ob->map->region ? $ob->map->region->name : "the unknown") . "]" - . (sprintf " [rtt %.3fs/%.3f]", $pl->socket->rtt * 1e-6, $pl->socket->rttvar * 1e-6) - . ($privileged ? " " . $pl->socket->host : "") + . " [" . $pl->ns->version . "]" + . " [" . ($pl->peaceful || $privileged ? $ob->map->{path}->visible_name : $ob->map->region ? $ob->map->region->name : "the unknown") . "]" + . (sprintf " [rtt %.3fs]", $pl->ns->rtt * 1e-6) + . ($privileged ? " " . $pl->ns->host : "") } sort { (lc $a->ob->name) cmp (lc $b->ob->name) } @pl ), eval { "* IRC: " . join ", ", ext::schmorp_irc::users }, @@ -123,4 +124,39 @@ 1 }; + +my %IN_MEMORY = ( + cf::MAP_IN_MEMORY => "I", + cf::MAP_SWAPPED => "S", + cf::MAP_LOADING => "L", +); + +cf::register_command maps => sub { + my ($ob, $arg) = @_; + + no re 'eval'; $arg = qr<$arg>; + + my $format = "%2s %1s %3s %5s %-60.60s\n"; + + $ob->reply (undef, sprintf $format, "Pl", "I", "Svd", "Reset", "Name"); + + for (sort keys %cf::MAP) { + my $map = $cf::MAP{$_} + or next; + + next unless $map->path =~ $arg; + + my $svd = int $cf::RUNTIME - $map->{last_save}; + $svd = "++" if $svd > 99; + + $ob->reply (undef, sprintf $format, + (scalar $map->players), + $IN_MEMORY{$map->in_memory} || "?", + $svd, + (int $map->reset_at - $cf::RUNTIME), + $map->{path}->visible_name); + } + + 1 +};