--- deliantra/server/lib/cf.pm 2007/09/07 18:10:52 1.358 +++ deliantra/server/lib/cf.pm 2007/09/10 12:44:06 1.362 @@ -189,7 +189,6 @@ $msg =~ s/([\x00-\x08\x0b-\x1f])/sprintf "\\x%02x", ord $1/ge; - utf8::encode $msg; LOG llevError, $msg; }; } @@ -1019,8 +1018,9 @@ sync_job { if (length $$rdata) { + utf8::decode (my $decname = $filename); warn sprintf "saving %s (%d,%d)\n", - $filename, length $$rdata, scalar @$objs; + $decname, length $$rdata, scalar @$objs; if (my $fh = aio_open "$filename~", O_WRONLY | O_CREAT, 0600) { chmod SAVE_MODE, $fh; @@ -1080,8 +1080,9 @@ $av = eval { (Storable::thaw $av)->{objs} }; } - warn sprintf "loading %s (%d)\n", - $filename, length $data, scalar @{$av || []}; + utf8::decode (my $decname = $filename); + warn sprintf "loading %s (%d,%d)\n", + $decname, length $data, scalar @{$av || []}; ($data, $av) } @@ -1279,6 +1280,20 @@ =over 4 +=item cf::player::num_playing + +Returns the official number of playing players, as per the Crossfire metaserver rules. + +=cut + +sub num_playing { + scalar grep + $_->ob->map + && !$_->hidden + && !$_->ob->flag (cf::FLAG_WIZ), + cf::player::list +} + =item cf::player::find $login Returns the given player object, loading it if necessary (might block). @@ -1893,7 +1908,7 @@ my $guard = cf::lock_acquire "map_data:$path"; return unless $self->valid; - return if $self->in_memory != cf::MAP_SWAPPED; + return unless $self->in_memory == cf::MAP_SWAPPED; $self->in_memory (cf::MAP_LOADING); @@ -2075,9 +2090,11 @@ return if $self->in_memory != cf::MAP_IN_MEMORY; return if $self->{deny_save}; + $self->in_memory (cf::MAP_SWAPPED); + $self->deactivate; + $_->clear_links_to ($self) for values %cf::MAP; $self->clear; - $self->in_memory (cf::MAP_SWAPPED); } sub reset_at { @@ -2120,9 +2137,8 @@ delete $cf::MAP{$self->path}; $self->deactivate; - $self->clear; - $_->clear_links_to ($self) for values %cf::MAP; + $self->clear; $self->unlink_save; $self->destroy;