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.421 by root, Tue Apr 15 18:43:11 2008 UTC vs.
Revision 1.427 by root, Sat Apr 26 12:25:45 2008 UTC

427 } 427 }
428 } 428 }
429}; 429};
430 430
431sub get_slot($;$$) { 431sub get_slot($;$$) {
432 return if tick_inhibit; 432 return if tick_inhibit || $Coro::current == $Coro::main;
433 433
434 my ($time, $pri, $name) = @_; 434 my ($time, $pri, $name) = @_;
435 435
436 $time = $TICK * .6 if $time > $TICK * .6; 436 $time = $TICK * .6 if $time > $TICK * .6;
437 my $sig = new Coro::Signal; 437 my $sig = new Coro::Signal;
1141 utf8::decode (my $decname = $filename); 1141 utf8::decode (my $decname = $filename);
1142 warn sprintf "saving %s (%d,%d)\n", 1142 warn sprintf "saving %s (%d,%d)\n",
1143 $decname, length $$rdata, scalar @$objs; 1143 $decname, length $$rdata, scalar @$objs;
1144 1144
1145 if (my $fh = aio_open "$filename~", O_WRONLY | O_CREAT, 0600) { 1145 if (my $fh = aio_open "$filename~", O_WRONLY | O_CREAT, 0600) {
1146 chmod SAVE_MODE, $fh; 1146 aio_chmod $fh, SAVE_MODE;
1147 aio_write $fh, 0, (length $$rdata), $$rdata, 0; 1147 aio_write $fh, 0, (length $$rdata), $$rdata, 0;
1148 aio_fsync $fh if $cf::USE_FSYNC; 1148 aio_fsync $fh if $cf::USE_FSYNC;
1149 close $fh; 1149 aio_close $fh;
1150 1150
1151 if (@$objs) { 1151 if (@$objs) {
1152 if (my $fh = aio_open "$filename.pst~", O_WRONLY | O_CREAT, 0600) { 1152 if (my $fh = aio_open "$filename.pst~", O_WRONLY | O_CREAT, 0600) {
1153 chmod SAVE_MODE, $fh; 1153 aio_chmod $fh, SAVE_MODE;
1154 my $data = Coro::Storable::nfreeze { version => 1, objs => $objs }; 1154 my $data = Coro::Storable::nfreeze { version => 1, objs => $objs };
1155 aio_write $fh, 0, (length $data), $data, 0; 1155 aio_write $fh, 0, (length $data), $data, 0;
1156 aio_fsync $fh if $cf::USE_FSYNC; 1156 aio_fsync $fh if $cf::USE_FSYNC;
1157 close $fh; 1157 aio_close $fh;
1158 aio_rename "$filename.pst~", "$filename.pst"; 1158 aio_rename "$filename.pst~", "$filename.pst";
1159 } 1159 }
1160 } else { 1160 } else {
1161 aio_unlink "$filename.pst"; 1161 aio_unlink "$filename.pst";
1162 } 1162 }
1456 my $f = new_from_file cf::object::thawer path $login 1456 my $f = new_from_file cf::object::thawer path $login
1457 or return; 1457 or return;
1458 1458
1459 my $pl = cf::player::load_pl $f 1459 my $pl = cf::player::load_pl $f
1460 or return; 1460 or return;
1461
1461 local $cf::PLAYER_LOADING{$login} = $pl; 1462 local $cf::PLAYER_LOADING{$login} = $pl;
1462 $f->resolve_delayed_derefs; 1463 $f->resolve_delayed_derefs;
1463 $cf::PLAYER{$login} = $pl 1464 $cf::PLAYER{$login} = $pl
1464 } 1465 }
1465 } 1466 }
1570 1571
1571 for my $login (@$dirs) { 1572 for my $login (@$dirs) {
1572 my $path = path $login; 1573 my $path = path $login;
1573 1574
1574 # a .pst is a dead give-away for a valid player 1575 # a .pst is a dead give-away for a valid player
1575 unless (-e "$path.pst") { 1576 # if no pst file found, open and chekc for blocked users
1577 if (aio_stat "$path.pst") {
1576 my $fh = aio_open $path, Fcntl::O_RDONLY, 0 or next; 1578 my $fh = aio_open $path, Fcntl::O_RDONLY, 0 or next;
1577 aio_read $fh, 0, 512, my $buf, 0 or next; 1579 aio_read $fh, 0, 512, my $buf, 0 or next;
1578 $buf !~ /^password -------------$/m or next; # official not-valid tag 1580 $buf !~ /^password -------------$/m or next; # official not-valid tag
1579 } 1581 }
1580 1582
2699 $rmp->{origin_y} = $exit->y; 2701 $rmp->{origin_y} = $exit->y;
2700 } 2702 }
2701 2703
2702 $rmp->{random_seed} ||= $exit->random_seed; 2704 $rmp->{random_seed} ||= $exit->random_seed;
2703 2705
2704 my $data = JSON::XS->new->utf8->pretty->canolicalize->encode ($rmp); 2706 my $data = JSON::XS->new->utf8->pretty->canonical->encode ($rmp);
2705 my $md5 = Digest::MD5::md5_hex $data; 2707 my $md5 = Digest::MD5::md5_hex $data;
2706 my $meta = "$RANDOMDIR/$md5.meta"; 2708 my $meta = "$RANDOMDIR/$md5.meta";
2707 2709
2708 if (my $fh = aio_open "$meta~", O_WRONLY | O_CREAT, 0666) { 2710 if (my $fh = aio_open "$meta~", O_WRONLY | O_CREAT, 0666) {
2709 aio_write $fh, 0, (length $data), $data, 0; 2711 aio_write $fh, 0, (length $data), $data, 0;
2832 id => "infobox", 2834 id => "infobox",
2833 title => "Map Info", 2835 title => "Map Info",
2834 reply => undef, 2836 reply => undef,
2835 tooltip => "Information related to the maps", 2837 tooltip => "Information related to the maps",
2836 }, 2838 },
2839 "c/party" => {
2840 id => "party",
2841 title => "Party",
2842 reply => "gsay ",
2843 tooltip => "Messages and chat related to your party",
2844 },
2837); 2845);
2838 2846
2839sub cf::client::send_msg { 2847sub cf::client::send_msg {
2840 my ($self, $channel, $msg, $color, @extra) = @_; 2848 my ($self, $channel, $msg, $color, @extra) = @_;
2841 2849
3078 3086
3079The following functions and methods are available within a safe environment: 3087The following functions and methods are available within a safe environment:
3080 3088
3081 cf::object 3089 cf::object
3082 contr pay_amount pay_player map x y force_find force_add destroy 3090 contr pay_amount pay_player map x y force_find force_add destroy
3083 insert remove name archname title slaying race decrease_ob_nr 3091 insert remove name archname title slaying race decrease split
3084 3092
3085 cf::object::player 3093 cf::object::player
3086 player 3094 player
3087 3095
3088 cf::player 3096 cf::player
3094=cut 3102=cut
3095 3103
3096for ( 3104for (
3097 ["cf::object" => qw(contr pay_amount pay_player map force_find force_add x y 3105 ["cf::object" => qw(contr pay_amount pay_player map force_find force_add x y
3098 insert remove inv name archname title slaying race 3106 insert remove inv name archname title slaying race
3099 decrease_ob_nr destroy)], 3107 decrease split destroy)],
3100 ["cf::object::player" => qw(player)], 3108 ["cf::object::player" => qw(player)],
3101 ["cf::player" => qw(peaceful)], 3109 ["cf::player" => qw(peaceful)],
3102 ["cf::map" => qw(trigger)], 3110 ["cf::map" => qw(trigger)],
3103) { 3111) {
3104 no strict 'refs'; 3112 no strict 'refs';
3312 while (my ($k, $v) = each %$want) { 3320 while (my ($k, $v) = each %$want) {
3313 $ns->fx_want ($k, $v); 3321 $ns->fx_want ($k, $v);
3314 } 3322 }
3315}; 3323};
3316 3324
3325sub load_resource_file($) {
3326 my $guard = lock_acquire "load_resource_file";
3327
3328 my $status = load_resource_file_ $_[0];
3329 get_slot 0.1, 100;
3330 cf::arch::commit_load;
3331
3332 $status
3333}
3334
3317sub reload_regions { 3335sub reload_regions {
3318 # HACK to clear player env face cache, we need some signal framework 3336 # HACK to clear player env face cache, we need some signal framework
3319 # for this (global event?) 3337 # for this (global event?)
3320 %ext::player_env::MUSIC_FACE_CACHE = (); 3338 %ext::player_env::MUSIC_FACE_CACHE = ();
3321 3339
3334} 3352}
3335 3353
3336sub reload_archetypes { 3354sub reload_archetypes {
3337 load_resource_file "$DATADIR/archetypes" 3355 load_resource_file "$DATADIR/archetypes"
3338 or die "unable to load archetypes\n"; 3356 or die "unable to load archetypes\n";
3339 #d# NEED to laod twice to resolve forward references
3340 # this really needs to be done in an extra post-pass
3341 # (which needs to be synchronous, so solve it differently)
3342 load_resource_file "$DATADIR/archetypes"
3343 or die "unable to load archetypes\n";
3344} 3357}
3345 3358
3346sub reload_treasures { 3359sub reload_treasures {
3347 load_resource_file "$DATADIR/treasures" 3360 load_resource_file "$DATADIR/treasures"
3348 or die "unable to load treasurelists\n"; 3361 or die "unable to load treasurelists\n";
3349} 3362}
3350 3363
3351sub reload_resources { 3364sub reload_resources {
3352 warn "reloading resource files...\n"; 3365 warn "reloading resource files...\n";
3353 3366
3367 reload_facedata;
3368 reload_archetypes;
3354 reload_regions; 3369 reload_regions;
3355 reload_facedata;
3356 #reload_archetypes;#d#
3357 reload_archetypes;
3358 reload_treasures; 3370 reload_treasures;
3359 3371
3360 warn "finished reloading resource files\n"; 3372 warn "finished reloading resource files\n";
3361} 3373}
3362 3374
3363sub init { 3375sub init {
3376 my $guard = freeze_mainloop;
3377
3364 reload_resources; 3378 reload_resources;
3365} 3379}
3366 3380
3367sub reload_config { 3381sub reload_config {
3368 open my $fh, "<:utf8", "$CONFDIR/config" 3382 open my $fh, "<:utf8", "$CONFDIR/config"
3393 $Coro::current->{desc} = "IDLE BUG HANDLER"; 3407 $Coro::current->{desc} = "IDLE BUG HANDLER";
3394 EV::loop EV::LOOP_ONESHOT; 3408 EV::loop EV::LOOP_ONESHOT;
3395 })->prio (Coro::PRIO_MAX); 3409 })->prio (Coro::PRIO_MAX);
3396 }; 3410 };
3397 3411
3412 {
3413 my $guard = freeze_mainloop;
3398 reload_config; 3414 reload_config;
3399 db_init; 3415 db_init;
3400 load_extensions; 3416 load_extensions;
3401 3417
3402 $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority 3418 $Coro::current->prio (Coro::PRIO_MAX); # give the main loop max. priority
3403 evthread_start IO::AIO::poll_fileno; 3419 evthread_start IO::AIO::poll_fileno;
3420 }
3421
3404 EV::loop; 3422 EV::loop;
3405} 3423}
3406 3424
3407############################################################################# 3425#############################################################################
3408# initialisation and cleanup 3426# initialisation and cleanup
3690 3708
3691our @WAIT_FOR_TICK; 3709our @WAIT_FOR_TICK;
3692our @WAIT_FOR_TICK_BEGIN; 3710our @WAIT_FOR_TICK_BEGIN;
3693 3711
3694sub wait_for_tick { 3712sub wait_for_tick {
3695 return if tick_inhibit;
3696 return if $Coro::current == $Coro::main; 3713 return if tick_inhibit || $Coro::current == $Coro::main;
3697 3714
3698 my $signal = new Coro::Signal; 3715 my $signal = new Coro::Signal;
3699 push @WAIT_FOR_TICK, $signal; 3716 push @WAIT_FOR_TICK, $signal;
3700 $signal->wait; 3717 $signal->wait;
3701} 3718}
3702 3719
3703sub wait_for_tick_begin { 3720sub wait_for_tick_begin {
3704 return if tick_inhibit;
3705 return if $Coro::current == $Coro::main; 3721 return if tick_inhibit || $Coro::current == $Coro::main;
3706 3722
3707 my $signal = new Coro::Signal; 3723 my $signal = new Coro::Signal;
3708 push @WAIT_FOR_TICK_BEGIN, $signal; 3724 push @WAIT_FOR_TICK_BEGIN, $signal;
3709 $signal->wait; 3725 $signal->wait;
3710} 3726}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines