ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/lib/cf.pm
(Generate patch)

Comparing deliantra/server/lib/cf.pm (file contents):
Revision 1.333 by root, Sun Aug 19 09:14:50 2007 UTC vs.
Revision 1.334 by root, Mon Aug 20 22:09:04 2007 UTC

2811# the server's init and main functions 2811# the server's init and main functions
2812 2812
2813sub load_facedata($) { 2813sub load_facedata($) {
2814 my ($path) = @_; 2814 my ($path) = @_;
2815 2815
2816 my $enc = JSON::XS->new->utf8->canonical;
2817
2816 warn "loading facedata from $path\n"; 2818 warn "loading facedata from $path\n";
2817 2819
2818 my $facedata; 2820 my $facedata;
2819 0 < aio_load $path, $facedata 2821 0 < aio_load $path, $facedata
2820 or die "$path: $!"; 2822 or die "$path: $!";
2821 2823
2822 $facedata = Coro::Storable::thaw $facedata; 2824 $facedata = Coro::Storable::thaw $facedata;
2823 2825
2824 $facedata->{version} == 2 2826 $facedata->{version} == 2
2825 or cf::cleanup "$path: version mismatch, cannot proceed."; 2827 or cf::cleanup "$path: version mismatch, cannot proceed.";
2828
2829 # patch in the exptable
2830 cf::cede_to_tick;
2831 $facedata->{resource}{"res/exp_table"} = {
2832 type => FT_RSRC,
2833 data => $enc->encode ([map cf::level_to_min_exp $_, 0 .. cf::settings->max_level]),
2834 };
2835 cf::cede_to_tick;
2826 2836
2827 { 2837 {
2828 my $faces = $facedata->{faceinfo}; 2838 my $faces = $facedata->{faceinfo};
2829 2839
2830 while (my ($face, $info) = each %$faces) { 2840 while (my ($face, $info) = each %$faces) {
2831 my $idx = (cf::face::find $face) || cf::face::alloc $face; 2841 my $idx = (cf::face::find $face) || cf::face::alloc $face;
2832 cf::face::set_visibility $idx, $info->{visibility}; 2842 cf::face::set_visibility $idx, $info->{visibility};
2833 cf::face::set_magicmap $idx, $info->{magicmap}; 2843 cf::face::set_magicmap $idx, $info->{magicmap};
2834 cf::face::set_data $idx, 0, $info->{data32}, $info->{chksum32}; 2844 cf::face::set_data $idx, 0, $info->{data32}, Digest::MD5::md5 $info->{data32};
2835 cf::face::set_data $idx, 1, $info->{data64}, $info->{chksum64}; 2845 cf::face::set_data $idx, 1, $info->{data64}, Digest::MD5::md5 $info->{data64};
2836 2846
2837 cf::cede_to_tick; 2847 cf::cede_to_tick;
2838 } 2848 }
2839 2849
2840 while (my ($face, $info) = each %$faces) { 2850 while (my ($face, $info) = each %$faces) {
2865 2875
2866 { 2876 {
2867 # TODO: for gcfclient pleasure, we should give resources 2877 # TODO: for gcfclient pleasure, we should give resources
2868 # that gcfclient doesn't grok a >10000 face index. 2878 # that gcfclient doesn't grok a >10000 face index.
2869 my $res = $facedata->{resource}; 2879 my $res = $facedata->{resource};
2870 my $enc = JSON::XS->new->utf8->canonical;
2871 2880
2872 my $soundconf = delete $res->{"res/sound.conf"}; 2881 my $soundconf = delete $res->{"res/sound.conf"};
2873 2882
2874 while (my ($name, $info) = each %$res) { 2883 while (my ($name, $info) = each %$res) {
2875 my $meta = $enc->encode ({
2876 name => $name,
2877 %{ $info->{meta} || {} },
2878 });
2879
2880 my $idx = (cf::face::find $name) || cf::face::alloc $name; 2884 my $idx = (cf::face::find $name) || cf::face::alloc $name;
2885 my $data;
2881 2886
2882 if ($info->{type} & 1) { 2887 if ($info->{type} & 1) {
2883 # prepend meta info 2888 # prepend meta info
2884 2889
2890 my $meta = $enc->encode ({
2891 name => $name,
2892 %{ $info->{meta} || {} },
2893 });
2894
2885 my $data = pack "(w/a*)*", $meta, $info->{data}; 2895 $data = pack "(w/a*)*", $meta, $info->{data};
2886 my $chk = Digest::MD5::md5 "$info->{chksum},$meta"; # mangle data checksum and metadata
2887
2888 cf::face::set_data $idx, 0, $data, $chk;
2889 } else {
2890 cf::face::set_data $idx, 0, $info->{data}, $info->{chksum};
2891 } 2896 }
2892 2897
2898 cf::face::set_data $idx, 0, $data, Digest::MD5::md5 $data;
2893 cf::face::set_type $idx, $info->{type}; 2899 cf::face::set_type $idx, $info->{type};
2894 2900
2895 cf::cede_to_tick; 2901 cf::cede_to_tick;
2896 } 2902 }
2897 2903

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines