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.586 by root, Wed Oct 31 15:02:02 2012 UTC vs.
Revision 1.589 by root, Sun Nov 4 01:01:13 2012 UTC

32use Safe; 32use Safe;
33use Safe::Hole; 33use Safe::Hole;
34use Storable (); 34use Storable ();
35use Carp (); 35use Carp ();
36 36
37use Guard (); 37use AnyEvent ();
38use AnyEvent::IO ();
39use AnyEvent::DNS ();
40
38use Coro (); 41use Coro ();
39use Coro::State; 42use Coro::State;
40use Coro::Handle; 43use Coro::Handle;
41use Coro::EV; 44use Coro::EV;
42use Coro::AnyEvent; 45use Coro::AnyEvent;
48use Coro::AIO; 51use Coro::AIO;
49use Coro::BDB 1.6; 52use Coro::BDB 1.6;
50use Coro::Storable; 53use Coro::Storable;
51use Coro::Util (); 54use Coro::Util ();
52 55
56use Guard ();
53use JSON::XS 2.01 (); 57use JSON::XS 2.01 ();
54use BDB (); 58use BDB ();
55use Data::Dumper; 59use Data::Dumper;
56use Fcntl; 60use Fcntl;
57use YAML::XS (); 61use YAML::XS ();
3505############################################################################# 3509#############################################################################
3506# the server's init and main functions 3510# the server's init and main functions
3507 3511
3508our %FACEHASH; # hash => idx, #d# HACK for http server 3512our %FACEHASH; # hash => idx, #d# HACK for http server
3509 3513
3514# internal api, not fianlised
3515sub add_face {
3516 my ($name, $type, $data) = @_;
3517
3518 my $idx = cf::face::find $name;
3519
3520 if ($idx) {
3521 delete $FACEHASH{cf::face::get_chksum $idx};
3522 } else {
3523 $idx = cf::face::alloc $name;
3524 }
3525
3526 my $hash = cf::face::mangle_chksum Digest::MD5::md5 $data;
3527
3528 cf::face::set_type $idx, $type;
3529 cf::face::set_data $idx, 0, $data, $hash;
3530 cf::face::set_meta $idx, $type & 1 ? undef : undef;
3531 $FACEHASH{$hash} = $idx;#d#
3532
3533 $idx
3534}
3535
3510sub load_facedata($) { 3536sub load_facedata($) {
3511 my ($path) = @_; 3537 my ($path) = @_;
3512 3538
3513 # HACK to clear player env face cache, we need some signal framework 3539 # HACK to clear player env face cache, we need some signal framework
3514 # for this (global event?) 3540 # for this (global event?)
3521 my $facedata = decode_storable load_file $path; 3547 my $facedata = decode_storable load_file $path;
3522 3548
3523 $facedata->{version} == 2 3549 $facedata->{version} == 2
3524 or cf::cleanup "$path: version mismatch, cannot proceed."; 3550 or cf::cleanup "$path: version mismatch, cannot proceed.";
3525 3551
3526 # patch in the exptable
3527 my $exp_table = $enc->encode ([map cf::level_to_min_exp $_, 1 .. cf::settings->max_level]);
3528 $facedata->{resource}{"res/exp_table"} = {
3529 type => FT_RSRC,
3530 data => $exp_table,
3531 hash => (Digest::MD5::md5 $exp_table),
3532 };
3533 cf::cede_to_tick; 3552 cf::cede_to_tick;
3534 3553
3535 { 3554 {
3536 my $faces = $facedata->{faceinfo}; 3555 my $faces = $facedata->{faceinfo};
3537 3556
3583 while (my ($name, $info) = each %$res) { 3602 while (my ($name, $info) = each %$res) {
3584 if (defined (my $type = $info->{type})) { 3603 if (defined (my $type = $info->{type})) {
3585 # TODO: different hash - must free and use new index, or cache ixface data queue 3604 # TODO: different hash - must free and use new index, or cache ixface data queue
3586 my $idx = (cf::face::find $name) || cf::face::alloc $name; 3605 my $idx = (cf::face::find $name) || cf::face::alloc $name;
3587 3606
3607 cf::face::set_type $idx, $type;
3588 cf::face::set_data $idx, 0, $info->{data}, $info->{hash}; 3608 cf::face::set_data $idx, 0, $info->{data}, $info->{hash};
3589 cf::face::set_type $idx, $type;
3590 cf::face::set_meta $idx, $type & 1 ? undef : $info->{meta}; # preserve meta unless prepended already 3609 cf::face::set_meta $idx, $type & 1 ? undef : $info->{meta}; # preserve meta unless prepended already
3591 $FACEHASH{$info->{hash}} = $idx;#d# 3610 $FACEHASH{$info->{hash}} = $idx;#d#
3592 } else { 3611 } else {
3593# $RESOURCE{$name} = $info; # unused 3612# $RESOURCE{$name} = $info; # unused
3594 } 3613 }
3618 cf::arch::commit_load; 3637 cf::arch::commit_load;
3619 3638
3620 $status 3639 $status
3621} 3640}
3622 3641
3642sub reload_exp_table {
3643 _reload_exp_table;
3644
3645 add_face "res/exp_table" => FT_RSRC,
3646 JSON::XS->new->utf8->canonical->encode (
3647 [map cf::level_to_min_exp $_, 1 .. cf::settings->max_level]
3648 );
3649}
3650
3651sub reload_materials {
3652 _reload_materials;
3653}
3654
3623sub reload_regions { 3655sub reload_regions {
3624 # HACK to clear player env face cache, we need some signal framework 3656 # HACK to clear player env face cache, we need some signal framework
3625 # for this (global event?) 3657 # for this (global event?)
3626 %ext::player_env::MUSIC_FACE_CACHE = (); 3658 %ext::player_env::MUSIC_FACE_CACHE = ();
3627 3659
3640} 3672}
3641 3673
3642sub reload_archetypes { 3674sub reload_archetypes {
3643 load_resource_file "$DATADIR/archetypes" 3675 load_resource_file "$DATADIR/archetypes"
3644 or die "unable to load archetypes\n"; 3676 or die "unable to load archetypes\n";
3677
3678 add_face "res/skill_info" => FT_RSRC,
3679 JSON::XS->new->utf8->canonical->encode (
3680 [map [cf::arch::skillvec ($_)->name], 0 .. cf::arch::skillvec_size - 1]
3681 );
3682 add_face "res/spell_paths" => FT_RSRC,
3683 JSON::XS->new->utf8->canonical->encode (
3684 [map [cf::spellpathnames ($_)], 0 .. NRSPELLPATHS - 1]
3685 );
3645} 3686}
3646 3687
3647sub reload_treasures { 3688sub reload_treasures {
3648 load_resource_file "$DATADIR/treasures" 3689 load_resource_file "$DATADIR/treasures"
3649 or die "unable to load treasurelists\n"; 3690 or die "unable to load treasurelists\n";
3670} 3711}
3671 3712
3672sub reload_resources { 3713sub reload_resources {
3673 trace "reloading resource files...\n"; 3714 trace "reloading resource files...\n";
3674 3715
3675 reload_exp_table;
3676 reload_materials; 3716 reload_materials;
3677 reload_facedata; 3717 reload_facedata;
3718 reload_exp_table;
3678 reload_sound; 3719 reload_sound;
3679 reload_archetypes; 3720 reload_archetypes;
3680 reload_regions; 3721 reload_regions;
3681 reload_treasures; 3722 reload_treasures;
3682 3723
3741 LOG llevInfo, "Copyright (C) 1992 Frank Tore Johansen."; 3782 LOG llevInfo, "Copyright (C) 1992 Frank Tore Johansen.";
3742 3783
3743 $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority 3784 $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority
3744 3785
3745 # we must not ever block the main coroutine 3786 # we must not ever block the main coroutine
3746 local $Coro::idle = sub { 3787 $Coro::idle = sub {
3747 Carp::cluck "FATAL: Coro::idle was called, major BUG, use cf::sync_job!\n";#d# 3788 Carp::cluck "FATAL: Coro::idle was called, major BUG, use cf::sync_job!\n";#d#
3748 (async { 3789 (async {
3749 $Coro::current->{desc} = "IDLE BUG HANDLER"; 3790 $Coro::current->{desc} = "IDLE BUG HANDLER";
3750 EV::loop EV::LOOP_ONESHOT; 3791 EV::loop EV::LOOP_ONESHOT;
3751 })->prio (Coro::PRIO_MAX); 3792 })->prio (Coro::PRIO_MAX);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines