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.335 by root, Mon Aug 20 22:21:48 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 $facedata->{resource}{"res/exp_table"} = {
2831 type => FT_RSRC,
2832 data => $enc->encode ([map cf::level_to_min_exp $_, 0 .. cf::settings->max_level]),
2833 };
2834 cf::cede_to_tick;
2826 2835
2827 { 2836 {
2828 my $faces = $facedata->{faceinfo}; 2837 my $faces = $facedata->{faceinfo};
2829 2838
2830 while (my ($face, $info) = each %$faces) { 2839 while (my ($face, $info) = each %$faces) {
2831 my $idx = (cf::face::find $face) || cf::face::alloc $face; 2840 my $idx = (cf::face::find $face) || cf::face::alloc $face;
2832 cf::face::set_visibility $idx, $info->{visibility}; 2841 cf::face::set_visibility $idx, $info->{visibility};
2833 cf::face::set_magicmap $idx, $info->{magicmap}; 2842 cf::face::set_magicmap $idx, $info->{magicmap};
2834 cf::face::set_data $idx, 0, $info->{data32}, $info->{chksum32}; 2843 cf::face::set_data $idx, 0, $info->{data32}, Digest::MD5::md5 $info->{data32};
2835 cf::face::set_data $idx, 1, $info->{data64}, $info->{chksum64}; 2844 cf::face::set_data $idx, 1, $info->{data64}, Digest::MD5::md5 $info->{data64};
2836 2845
2837 cf::cede_to_tick; 2846 cf::cede_to_tick;
2838 } 2847 }
2839 2848
2840 while (my ($face, $info) = each %$faces) { 2849 while (my ($face, $info) = each %$faces) {
2865 2874
2866 { 2875 {
2867 # TODO: for gcfclient pleasure, we should give resources 2876 # TODO: for gcfclient pleasure, we should give resources
2868 # that gcfclient doesn't grok a >10000 face index. 2877 # that gcfclient doesn't grok a >10000 face index.
2869 my $res = $facedata->{resource}; 2878 my $res = $facedata->{resource};
2870 my $enc = JSON::XS->new->utf8->canonical;
2871 2879
2872 my $soundconf = delete $res->{"res/sound.conf"}; 2880 my $soundconf = delete $res->{"res/sound.conf"};
2873 2881
2874 while (my ($name, $info) = each %$res) { 2882 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; 2883 my $idx = (cf::face::find $name) || cf::face::alloc $name;
2884 my $data;
2881 2885
2882 if ($info->{type} & 1) { 2886 if ($info->{type} & 1) {
2883 # prepend meta info 2887 # prepend meta info
2884 2888
2889 my $meta = $enc->encode ({
2890 name => $name,
2891 %{ $info->{meta} || {} },
2892 });
2893
2885 my $data = pack "(w/a*)*", $meta, $info->{data}; 2894 $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 } 2895 }
2892 2896
2897 cf::face::set_data $idx, 0, $data, Digest::MD5::md5 $data;
2893 cf::face::set_type $idx, $info->{type}; 2898 cf::face::set_type $idx, $info->{type};
2894 2899
2895 cf::cede_to_tick; 2900 cf::cede_to_tick;
2896 } 2901 }
2897 2902

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines