Deliantra-Client

 view release on metacpan or  search on metacpan

DC/Protocol.pm  view on Meta::CPAN


sub map_scroll {
   my ($self, $dx, $dy) = @_;

   $self->{map_widget}->scroll ($dx, $dy);
}

sub feed_map1a {
   my ($self, $data) = @_;

   my $missing = $self->{map}->map1a_update ($data, $self->{setup}{extmap});
   my $delay;

   for my $tile (@$missing) {
      next if $self->{delay}{$tile};

      $delay = 1;

      if (my $tex = $self->{texture}[$tile]) {
         $tex->upload;
      } else {
         $self->{delay}{$tile} = 1;

         # we assume the face is in-flight and will eventually arrive
         push @{$self->{tile_cb}{$tile}}, sub {
            delete $self->{delay}{$tile};
            $_[0]->upload;
         };
      }
   }

   if ($delay) {
      # delay the map drawing a tiny bit in the hope of getting the missing tiles fetched
      EV::once undef, 0, 0.03, sub {
         $self->{map_widget}->update
            if $self->{map_widget};
      };
   } else {
      $self->{map_widget}->update;
   }
}

sub magicmap {
   my ($self, $w, $h, $x, $y, $data) = @_;

   $self->{map_widget}->set_magicmap ($w, $h, $x, $y, $data);
}

sub flush_map {
   my ($self) = @_;

   return unless $self->{map_info};

   for my $map_info (values %{ $self->{map_cache} || {} }) {
      my ($hash, $rdata, $x, $y, $w, $h) = @$map_info;

      my $data = $self->{map}->get_rect ($x, $y, $w, $h);

      if ($data ne $$rdata) {
         $map_info->[1] = \$data;
         my $cdata = Compress::LZF::compress $data;
         DC::DB::put $self->{mapcache} => $hash => $cdata, sub { };
      }
   }
}

sub map_clear {
   my ($self) = @_;

   $self->flush_map;
   delete $self->{map_info};
   delete $self->{neigh_map};

   $self->{map}->clear;
   delete $self->{map_widget}{magicmap};
}

sub bg_fetch {
   my ($self) = @_;

   my $tile;
   
   do {
      $tile = pop @{$self->{bg_fetch}}
         or return;
   } while $self->{texture}[$tile];

   DC::DB::get tilecache => $tile, sub {
      my ($data) = @_;

      return unless $self->{map}; # stop when destroyed

      if (defined $data) {
         $self->have_tile ($tile, $data);
         $self->{texture}[$tile]->upload;
      }

      $self->bg_fetch;
   };
}

sub load_map($$$$$$) {
   my ($self, $hash, $x, $y, $w, $h) = @_;

   my $map_info = $self->{map_cache}{$hash} = [$hash, \"", $x, $y, $w, $h];

   my $cb = sub {
      $map_info->[1] = \$_[0];

      my $inprogress = @{ $self->{bg_fetch} || [] };
      unshift @{ $self->{bg_fetch} }, $self->{map}->set_rect ($x, $y, $_[0]);
      $self->bg_fetch unless $inprogress;
   };

   if (my $map_info = $self->{map_cache_old}{$hash}) {
      $cb->(${ $map_info->[1] });
   } else {
      my $gen = $self->{map_change_gen};

      DC::DB::get $self->{mapcache} => $hash, sub {
         return unless $gen == $self->{map_change_gen};
         return unless defined $_[0];



( run in 1.120 second using v1.01-cache-2.11-cpan-6aa56a78535 )