--- deliantra/server/ext/map-random.ext 2007/01/11 01:06:02 1.4 +++ deliantra/server/ext/map-random.ext 2007/01/24 16:29:10 1.10 @@ -1,16 +1,29 @@ -#! perl +#! perl # MANDATORY -use base "cf::path"; - -__PACKAGE__->register ("random"); +cf::map->register (qr{^\?random/([0-9a-f]{32})}); sub init { my ($self) = @_; - if (0 < Coro::AIO::aio_load "$cf::RANDOM_MAPS/$self->{path}.meta", my $data) { + $self->{random_id} = $1; + + if (0 < Coro::AIO::aio_load "$cf::RANDOM_MAPS/$self->{random_id}.meta", my $data) { $self->{random} = cf::from_json $data; $self->{random}{custom} ||= "$self->{random}{origin_map}+$self->{random}{origin_x}+$self->{random}{origin_y}"; + } else { + warn "unable to read meta file for $self->{random_id}\n"; + return 0; } + + 1 +} + +sub thawer_merge { + # we have to keep some variables in memory intact + local $_[0]{random_id}; + local $_[0]{random}; + + $_[0]->SUPER::thawer_merge ($_[1]); } sub visible_name { @@ -23,59 +36,60 @@ sub save_path { my ($self) = @_; - sprintf "%s/%s", $cf::RANDOM_MAPS, $self->{path} + sprintf "%s/%s.map", $cf::RANDOM_MAPS, $self->{random_id} } sub uniq_path { undef } -sub load_orig { +sub load_header_orig { my ($self) = @_; - $self->{random} - ? cf::map::generate_random_map "$self", $self->{random} - : () + return unless $self->{random}; + + $self->generate_random_map ($self->{random}); + + 1 } sub clean_random_maps { - cf::async { - my $files = Coro::AIO::aio_readdir $cf::RANDOM_MAPS - or return; - - my $META_TIMEOUT = $cf::CFG{map_random_meta_timeout} || 86400 * 7; - my $MAP_TIMEOUT = $cf::CFG{map_random_map_timeout} || 3600 * 6; - - for my $file (@$files) { - next if $file =~ /\.pst$/; - - Coro::AIO::aio_stat "$cf::RANDOM_MAPS/$file" - and next; - - my $age = $cf::NOW - (stat _)[8]; - - if ($file =~ /\.meta$/) { - if ($age > $META_TIMEOUT) { - warn "resetting random meta data for $file"; - IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file"; - } - } else { - if ($age > $MAP_TIMEOUT) { - warn "resetting random map $file"; - IO::AIO::aioreq_pri 4; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file"; - IO::AIO::aioreq_pri 4; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file.pst"; - } + my $files = Coro::AIO::aio_readdir $cf::RANDOM_MAPS + or return; + + my $META_TIMEOUT = $cf::CFG{map_random_meta_timeout} || 86400 * 7; + my $MAP_TIMEOUT = $cf::CFG{map_random_map_timeout} || 3600 * 6; + + for my $file (@$files) { + next if $file =~ /\.pst$/; + + Coro::AIO::aio_stat "$cf::RANDOM_MAPS/$file" + and next; + + my $age = $cf::NOW - (stat _)[8]; + + if ($file =~ /\.meta$/) { + if ($age > $META_TIMEOUT) { + warn "resetting random meta data for $file"; + IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file"; + } + } else { + if ($age > $MAP_TIMEOUT) { + warn "resetting random map $file"; + IO::AIO::aioreq_pri 4; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file"; + IO::AIO::aioreq_pri 4; IO::AIO::aio_unlink "$cf::RANDOM_MAPS/$file.pst"; } } - }; + } } # clean up old temp maps regularly Event->timer ( - data => cf::WF_AUTOCANCEL, - interval => 3600, - after => 600, - cb => \&clean_random_maps, + reentrant => 0, + data => cf::WF_AUTOCANCEL, + interval => 3600, + after => 60, + cb => Coro::unblock_sub { clean_random_maps }, ); 1