--- deliantra/Deliantra-Client/DC/Protocol.pm 2007/07/24 00:28:07 1.130 +++ deliantra/Deliantra-Client/DC/Protocol.pm 2007/07/24 04:54:48 1.131 @@ -23,7 +23,7 @@ setup_req => { extmap => 1, excmd => 1, - ywidget => 1, + ywidget => 1,#d# %{$arg{setup_req} || {}}, }, ); @@ -51,62 +51,20 @@ CFPlus::Pod::find command => "*"; $self->connect_ext (music => sub { - my (%ev) = @_; + my ($ev) = @_; - return unless $::CFG->{bgm_enable}; - - my $faces = $ev{faces}; - my @songs; - - # request music from server if appropriate - 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 "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; - &::audio_music_set ($self->{songs}); - } else { - ::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_json, $data) = unpack "(w/a*)*", $_[1]; - - 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}); - }; - }; - }); - } - } - } - } - - if (my $play = $ev{play}) { - &::audio_music_set ($self->{songs} = [map $self->{music_map}{$_}, @$play]); - } + &::audio_music_set ($self->{songs} = $ev->{play}) + if $ev->{play}; }); $self->connect_ext (capabilities => sub { my (%cap) = @_; + $self->send_exti_msg (fx_want => { + 3 => !!$::CFG->{bgm_enable}, # FT_MUSIC + 5 => !!$::CFG->{audio_enable}, # FT_SOUND + }); + if (my $ts = $cap{tileset}) { if (my ($default) = grep $_->[2] & 1, @$ts) { $self->{tileset} = $default; @@ -758,25 +716,62 @@ sub face_find { my ($self, $facenum, $face, $cb) = @_; - my $hash = "$face->{chksum},$face->{name}"; + if ($face->{type} == 0) { # FT_FACE + my $id = CFPlus::DB::get_tile_id_sync $face->{name}; - my $id = CFPlus::DB::get_tile_id_sync $hash; + $face->{id} = $id; + $self->{faceid}[$facenum] = $id; - $face->{id} = $id; - $self->{faceid}[$facenum] = $id; + $self->{map}->set_tileid ($facenum => $id); - $self->{map}->set_tileid ($facenum => $id); + CFPlus::DB::get tilecache => $id, $cb; - CFPlus::DB::get tilecache => $id, $cb; + } elsif ($face->{type} & 1) { # with metadata + #::message ({ markup => "starting to download song #$face/$pri, check your output-rate setting if your connection gets laggy." }); + CFPlus::DB::get "res-metadata" => $face->{name}, $cb; + } } sub face_update { my ($self, $facenum, $face, $changed) = @_; - CFPlus::DB::put tilecache => $face->{id} => $face->{image}, sub { } - if $changed; + if ($face->{type} == 0) { # FT_FACE + CFPlus::DB::put tilecache => $face->{id} => $face->{image}, sub { } + if $changed; + + $self->set_texture ($face->{id} => delete $face->{data}); - $self->set_texture ($face->{id} => delete $face->{image}); + } elsif ($face->{type} & 1) { # split metadata + my $cb = sub { }; + + if ($face->{type} == 3) { # FT_MUSIC + $cb = sub { + $self->{music_meta}{$facenum} = $face; + + ::message ({ markup => "downloaded song #$facenum" }) + if $changed; + + &::audio_music_set ($self->{songs}); + }; + } + + if ($changed) { # new data + my ($meta_json, $data) = unpack "(w/a*)*", delete $face->{data}; + my $path = CFPlus::DB::path_of_res $face->{name}; + + CFPlus::DB::write_file $path, $data, sub { + CFPlus::DB::put "res-metadata" => $face->{name} => $meta_json, sub { + $face->{meta} = $self->{json_coder}->decode ($meta_json); + $face->{path} = $path; + + $cb->(); + }; + }; + } else { + $face->{meta} = $self->{json_coder}->decode (delete $face->{data}); + $cb->(); + } + } } sub smooth_update {