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.300 by root, Tue Jul 10 06:44:29 2007 UTC vs.
Revision 1.307 by root, Sun Jul 15 22:39:48 2007 UTC

29use Fcntl; 29use Fcntl;
30use YAML::Syck (); 30use YAML::Syck ();
31use IO::AIO 2.32 (); 31use IO::AIO 2.32 ();
32use Time::HiRes; 32use Time::HiRes;
33use Compress::LZF; 33use Compress::LZF;
34use Digest::MD5 ();
34 35
35# configure various modules to our taste 36# configure various modules to our taste
36# 37#
37$Storable::canonical = 1; # reduce rsync transfers 38$Storable::canonical = 1; # reduce rsync transfers
38Coro::State::cctx_stacksize 256000; # 1-2MB stack, for deep recursions in maze generator 39Coro::State::cctx_stacksize 256000; # 1-2MB stack, for deep recursions in maze generator
1435 s/\s+\n/\n/g; # ws line-ends 1436 s/\s+\n/\n/g; # ws line-ends
1436 s/\n\n+/\n/g; # double lines 1437 s/\n\n+/\n/g; # double lines
1437 s/^\n+//; # beginning lines 1438 s/^\n+//; # beginning lines
1438 s/\n+$//; # ending lines 1439 s/\n+$//; # ending lines
1439 1440
1440 warn $_;#d#
1441 $_ 1441 $_
1442} 1442}
1443 1443
1444sub hintmode { 1444sub hintmode {
1445 $_[0]{hintmode} = $_[1] if @_ > 1; 1445 $_[0]{hintmode} = $_[1] if @_ > 1;
1489 my ($path) = @_; 1489 my ($path) = @_;
1490 1490
1491 my ($match, $specificity); 1491 my ($match, $specificity);
1492 1492
1493 for my $region (list) { 1493 for my $region (list) {
1494 if ($region->match && $path =~ $region->match) { 1494 if ($region->{match} && $path =~ $region->{match}) {
1495 ($match, $specificity) = ($region, $region->specificity) 1495 ($match, $specificity) = ($region, $region->specificity)
1496 if $region->specificity > $specificity; 1496 if $region->specificity > $specificity;
1497 } 1497 }
1498 } 1498 }
1499 1499
2256 2256
2257 local $self->{_prev_pos} = $link_pos; # ugly hack for rent.ext 2257 local $self->{_prev_pos} = $link_pos; # ugly hack for rent.ext
2258 $self->enter_map ($map, $x, $y); 2258 $self->enter_map ($map, $x, $y);
2259} 2259}
2260 2260
2261=item $player_object->goto ($path, $x, $y[, $check->($map)]) 2261=item $player_object->goto ($path, $x, $y[, $check->($map)[, $done->()]])
2262 2262
2263Moves the player to the given map-path and coordinates by first freezing 2263Moves the player to the given map-path and coordinates by first freezing
2264her, loading and preparing them map, calling the provided $check callback 2264her, loading and preparing them map, calling the provided $check callback
2265that has to return the map if sucecssful, and then unfreezes the player on 2265that has to return the map if sucecssful, and then unfreezes the player on
2266the new (success) or old (failed) map position. 2266the new (success) or old (failed) map position. In either case, $done will
2267be called at the end of this process.
2267 2268
2268=cut 2269=cut
2269 2270
2270our $GOTOGEN; 2271our $GOTOGEN;
2271 2272
2272sub cf::object::player::goto { 2273sub cf::object::player::goto {
2273 my ($self, $path, $x, $y, $check) = @_; 2274 my ($self, $path, $x, $y, $check, $done) = @_;
2274 2275
2275 # do generation counting so two concurrent goto's will be executed in-order 2276 # do generation counting so two concurrent goto's will be executed in-order
2276 my $gen = $self->{_goto_generation} = ++$GOTOGEN; 2277 my $gen = $self->{_goto_generation} = ++$GOTOGEN;
2277 2278
2278 $self->enter_link; 2279 $self->enter_link;
2298 2299
2299 if ($gen == $self->{_goto_generation}) { 2300 if ($gen == $self->{_goto_generation}) {
2300 delete $self->{_goto_generation}; 2301 delete $self->{_goto_generation};
2301 $self->leave_link ($map, $x, $y); 2302 $self->leave_link ($map, $x, $y);
2302 } 2303 }
2304
2305 $done->() if $done;
2303 })->prio (1); 2306 })->prio (1);
2304} 2307}
2305 2308
2306=item $player_object->enter_exit ($exit_object) 2309=item $player_object->enter_exit ($exit_object)
2307 2310
2465=cut 2468=cut
2466 2469
2467sub cf::client::ext_event($$%) { 2470sub cf::client::ext_event($$%) {
2468 my ($self, $type, %msg) = @_; 2471 my ($self, $type, %msg) = @_;
2469 2472
2473 return unless $self->extcmd;
2474
2470 $msg{msgtype} = "event_$type"; 2475 $msg{msgtype} = "event_$type";
2471 $self->send_packet ("ext " . $self->{json_coder}->encode (\%msg)); 2476 $self->send_packet ("ext " . $self->{json_coder}->encode (\%msg));
2472} 2477}
2473 2478
2474=item $success = $client->query ($flags, "text", \&cb) 2479=item $success = $client->query ($flags, "text", \&cb)
2720 { 2725 {
2721 my $faces = $facedata->{faceinfo}; 2726 my $faces = $facedata->{faceinfo};
2722 2727
2723 while (my ($face, $info) = each %$faces) { 2728 while (my ($face, $info) = each %$faces) {
2724 my $idx = (cf::face::find $face) || cf::face::alloc $face; 2729 my $idx = (cf::face::find $face) || cf::face::alloc $face;
2725 cf::face::set $idx, $info->{visibility}, $info->{magicmap}; 2730 cf::face::set_visibility $idx, $info->{visibility};
2731 cf::face::set_magicmap $idx, $info->{magicmap};
2726 cf::face::set_data $idx, 0, $info->{data32}, $info->{chksum32}; 2732 cf::face::set_data $idx, 0, $info->{data32}, $info->{chksum32};
2727 cf::face::set_data $idx, 1, $info->{data64}, $info->{chksum64}; 2733 cf::face::set_data $idx, 1, $info->{data64}, $info->{chksum64};
2728 Coro::cede; 2734
2735 cf::cede_to_tick;
2729 } 2736 }
2730 2737
2731 while (my ($face, $info) = each %$faces) { 2738 while (my ($face, $info) = each %$faces) {
2732 next unless $info->{smooth}; 2739 next unless $info->{smooth};
2733 my $idx = cf::face::find $face 2740 my $idx = cf::face::find $face
2734 or next; 2741 or next;
2735 if (my $smooth = cf::face::find $info->{smooth}) { 2742 if (my $smooth = cf::face::find $info->{smooth}) {
2743 cf::face::set_smooth $idx, $smooth;
2736 cf::face::set_smooth $idx, $smooth, $info->{smoothlevel}; 2744 cf::face::set_smoothlevel $idx, $info->{smoothlevel};
2737 } else { 2745 } else {
2738 warn "smooth face '$info->{smooth}' not found for face '$face'"; 2746 warn "smooth face '$info->{smooth}' not found for face '$face'";
2739 } 2747 }
2740 Coro::cede; 2748
2749 cf::cede_to_tick;
2741 } 2750 }
2742 } 2751 }
2743 2752
2744 { 2753 {
2745 my $anims = $facedata->{animinfo}; 2754 my $anims = $facedata->{animinfo};
2746 2755
2747 while (my ($anim, $info) = each %$anims) { 2756 while (my ($anim, $info) = each %$anims) {
2748 cf::anim::set $anim, $info->{frames}, $info->{facings}; 2757 cf::anim::set $anim, $info->{frames}, $info->{facings};
2749 Coro::cede; 2758 cf::cede_to_tick;
2750 } 2759 }
2751 2760
2752 cf::anim::invalidate_all; # d'oh 2761 cf::anim::invalidate_all; # d'oh
2762 }
2763
2764 {
2765 # TODO: for gcfclient pleasure, we should give resources
2766 # that gcfclient doesn't grok a >10000 face index.
2767 my $res = $facedata->{resource};
2768 my $enc = JSON::XS->new->utf8->canonical;
2769
2770 while (my ($name, $info) = each %$res) {
2771 my $meta = $enc->encode ({
2772 name => $name,
2773 type => $info->{type},
2774 copyright => $info->{copyright}, #TODO#
2775 });
2776
2777 my $idx = (cf::face::find $name) || cf::face::alloc $name;
2778
2779 if ($name =~ /\.jpg$/) {
2780 cf::face::set_data $idx, 0, $info->{data}, $info->{chksum};#d# temp hack
2781 cf::face::set_data $idx, 1, $info->{data}, $info->{chksum};#d# temp hack
2782 } else {
2783 my $data = pack "(w/a*)*", $meta, $info->{data};
2784 my $chk = Digest::MD5::md5 "$info->{chksum},$meta"; # mangle data checksum and metadata
2785
2786 cf::face::set_type $idx, 1;
2787 cf::face::set_data $idx, 0, $data, $chk;
2788 }
2789
2790 cf::cede_to_tick;
2791 }
2753 } 2792 }
2754 2793
2755 1 2794 1
2756} 2795}
2757 2796
2758sub reload_regions { 2797sub reload_regions {
2759 load_resource_file "$MAPDIR/regions" 2798 load_resource_file "$MAPDIR/regions"
2760 or die "unable to load regions file\n"; 2799 or die "unable to load regions file\n";
2800
2801 for (cf::region::list) {
2802 $_->{match} = qr/$_->{match}/
2803 if exists $_->{match};
2804 }
2761} 2805}
2762 2806
2763sub reload_facedata { 2807sub reload_facedata {
2764 load_facedata "$DATADIR/facedata" 2808 load_facedata "$DATADIR/facedata"
2765 or die "unable to load facedata\n"; 2809 or die "unable to load facedata\n";

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines