--- deliantra/Deliantra-Client/DC/Protocol.pm 2007/07/12 18:28:34 1.114 +++ deliantra/Deliantra-Client/DC/Protocol.pm 2007/07/14 13:04:42 1.120 @@ -59,44 +59,48 @@ my @songs; # request music from server if appropriate - my $pri = -100; - for my $face (@$faces) { - if (defined (my $chksum = $ev->{chksum}{$face})) { + if (my $faces = $ev->{faces}) { + for (@$faces) { + my ($face, $pri, $chksum) = @$_; utf8::downgrade $chksum; $chksum = unpack "H*", $chksum; $self->{music_map}{$face} = $chksum; # check if already cached - CFPlus::DB::get resmap => $chksum, sub { - my ($meta) = @_; - - if (defined $meta) { - $self->{music_meta}{$chksum} = $self->{json_coder}->decode ($meta); + CFPlus::DB::get "res-metadata" => $chksum, sub { + my ($meta_json) = @_; + my $path = CFPlus::DB::path_of_res $chksum; + + if (defined $meta_json) { + my $meta = $self->{json_coder}->decode ($meta_json); + $meta->{path} = $path; + $self->{music_meta}{$chksum} = $meta; } else { - ::message ({ markup => "starting to download song #$face, check your output-rate setting if your connection gets laggy." }); - $self->ask_face ($face, $pri, undef, sub { - my $num = $_[0]; + ::message ({ markup => "starting to download song #$face/$pri, check your output-rate setting if your connection gets laggy." }); + $self->ask_face ($face, -100 - $pri, undef, sub { my $len = length $_[1]; - my ($meta, $data) = unpack "(w/a*)*", $_[1]; - - CFPlus::DB::write_file $chksum, $data, sub { }; - CFPlus::DB::put resmap => $chksum => $meta, sub { }; - - $self->{music_meta}{$chksum} = $self->{json_coder}->decode ($meta); - ::message ({ markup => "downloaded song #$face, size $len octets" }); + my ($meta_json, $data) = unpack "(w/a*)*", $_[1]; - &::audio_music_set ($self->{songs}); + CFPlus::DB::write_file $path, $data, sub { + CFPlus::DB::put "res-metadata" => $chksum => $meta_json, sub { + my $meta = $self->{json_coder}->decode ($meta_json); + $meta->{path} = $path; + $self->{music_meta}{$chksum} = $meta; + + ::message ({ markup => "downloaded song #$face, size $len octets" }); + &::audio_music_set ($self->{songs}); + }; + }; }); } } } - - push @songs, $self->{music_map}{$face}; - --$pri; } - &::audio_music_set ($self->{songs} = \@songs); + if (my $play = $ev->{play}) { + &::audio_music_set ($self->{songs} = [map $self->{music_map}{$_}, @$play]); + } }); $self->connect_ext (event_capabilities => sub { @@ -763,6 +767,8 @@ sub set_texture { my ($self, $id, $data) = @_; + return unless $self->{map}; + $self->{texture}[$id] = my $tex = new_from_image CFPlus::Texture $data, minify => 1, mipmap => 1;