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.424 by root, Sun Apr 20 05:24:55 2008 UTC vs.
Revision 1.429 by root, Sat May 3 15:17:13 2008 UTC

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
2029 2031
2030 cf::lock_wait "map_data:$path";#d#remove 2032 cf::lock_wait "map_data:$path";#d#remove
2031 cf::lock_wait "map_find:$path"; 2033 cf::lock_wait "map_find:$path";
2032 2034
2033 $cf::MAP{$path} || do { 2035 $cf::MAP{$path} || do {
2034 my $guard1 = cf::lock_acquire "map_find:$path";
2035 my $guard2 = cf::lock_acquire "map_data:$path"; # just for the fun of it 2036 my $guard1 = cf::lock_acquire "map_data:$path"; # just for the fun of it
2037 my $guard2 = cf::lock_acquire "map_find:$path";
2036 2038
2037 my $map = new_from_path cf::map $path 2039 my $map = new_from_path cf::map $path
2038 or return; 2040 or return;
2039 2041
2040 $map->{last_save} = $cf::RUNTIME; 2042 $map->{last_save} = $cf::RUNTIME;
2043 or return; 2045 or return;
2044 2046
2045 if ($map->should_reset) {#d#TODO# disabled, crashy (locking issue?) 2047 if ($map->should_reset) {#d#TODO# disabled, crashy (locking issue?)
2046 # doing this can freeze the server in a sync job, obviously 2048 # doing this can freeze the server in a sync job, obviously
2047 #$cf::WAIT_FOR_TICK->wait; 2049 #$cf::WAIT_FOR_TICK->wait;
2050 undef $guard2;
2048 undef $guard1; 2051 undef $guard1;
2049 undef $guard2;
2050 $map->reset; 2052 $map->reset;
2051 return find $path; 2053 return find $path;
2052 } 2054 }
2053 2055
2054 $cf::MAP{$path} = $map 2056 $cf::MAP{$path} = $map
2457can be C<undef>. Does the right thing when the player is currently in a 2459can be C<undef>. Does the right thing when the player is currently in a
2458dialogue with the given NPC character. 2460dialogue with the given NPC character.
2459 2461
2460=cut 2462=cut
2461 2463
2464our $SAY_CHANNEL = {
2465 id => "say",
2466 title => "Map",
2467 reply => "say ",
2468 tooltip => "Things said to and replied from npcs near you and other players on the same map only.",
2469};
2470
2471our $CHAT_CHANNEL = {
2472 id => "chat",
2473 title => "Chat",
2474 reply => "chat ",
2475 tooltip => "Player chat and shouts, global to the server.",
2476};
2477
2462# rough implementation of a future "reply" method that works 2478# rough implementation of a future "reply" method that works
2463# with dialog boxes. 2479# with dialog boxes.
2464#TODO: the first argument must go, split into a $npc->reply_to ( method 2480#TODO: the first argument must go, split into a $npc->reply_to ( method
2465sub cf::object::player::reply($$$;$) { 2481sub cf::object::player::reply($$$;$) {
2466 my ($self, $npc, $msg, $flags) = @_; 2482 my ($self, $npc, $msg, $flags) = @_;
2477 my $dialog = $pl->{npc_dialog}; 2493 my $dialog = $pl->{npc_dialog};
2478 $dialog->{pl}->ext_msg ($dialog->{id}, update => msg => $dialog->{pl}->expand_cfpod ($msg)); 2494 $dialog->{pl}->ext_msg ($dialog->{id}, update => msg => $dialog->{pl}->expand_cfpod ($msg));
2479 2495
2480 } else { 2496 } else {
2481 $msg = $npc->name . " says: $msg" if $npc; 2497 $msg = $npc->name . " says: $msg" if $npc;
2482 $self->message ($msg, $flags); 2498 $self->send_msg ($SAY_CHANNEL => $msg, $flags);
2483 } 2499 }
2484 } 2500 }
2485} 2501}
2486 2502
2487=item $object->send_msg ($channel, $msg, $color, [extra...]) 2503=item $object->send_msg ($channel, $msg, $color, [extra...])
2832 id => "infobox", 2848 id => "infobox",
2833 title => "Map Info", 2849 title => "Map Info",
2834 reply => undef, 2850 reply => undef,
2835 tooltip => "Information related to the maps", 2851 tooltip => "Information related to the maps",
2836 }, 2852 },
2853 "c/party" => {
2854 id => "party",
2855 title => "Party",
2856 reply => "gsay ",
2857 tooltip => "Messages and chat related to your party",
2858 },
2837); 2859);
2838 2860
2839sub cf::client::send_msg { 2861sub cf::client::send_msg {
2840 my ($self, $channel, $msg, $color, @extra) = @_; 2862 my ($self, $channel, $msg, $color, @extra) = @_;
2841 2863
3078 3100
3079The following functions and methods are available within a safe environment: 3101The following functions and methods are available within a safe environment:
3080 3102
3081 cf::object 3103 cf::object
3082 contr pay_amount pay_player map x y force_find force_add destroy 3104 contr pay_amount pay_player map x y force_find force_add destroy
3083 insert remove name archname title slaying race decrease_ob_nr 3105 insert remove name archname title slaying race decrease split
3084 3106
3085 cf::object::player 3107 cf::object::player
3086 player 3108 player
3087 3109
3088 cf::player 3110 cf::player
3094=cut 3116=cut
3095 3117
3096for ( 3118for (
3097 ["cf::object" => qw(contr pay_amount pay_player map force_find force_add x y 3119 ["cf::object" => qw(contr pay_amount pay_player map force_find force_add x y
3098 insert remove inv name archname title slaying race 3120 insert remove inv name archname title slaying race
3099 decrease_ob_nr destroy)], 3121 decrease split destroy)],
3100 ["cf::object::player" => qw(player)], 3122 ["cf::object::player" => qw(player)],
3101 ["cf::player" => qw(peaceful)], 3123 ["cf::player" => qw(peaceful)],
3102 ["cf::map" => qw(trigger)], 3124 ["cf::map" => qw(trigger)],
3103) { 3125) {
3104 no strict 'refs'; 3126 no strict 'refs';

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines