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.143 by root, Sun Jan 7 02:39:14 2007 UTC vs.
Revision 1.145 by root, Sun Jan 7 21:54:59 2007 UTC

17use Coro::Semaphore; 17use Coro::Semaphore;
18use Coro::AIO; 18use Coro::AIO;
19 19
20use Digest::MD5; 20use Digest::MD5;
21use Fcntl; 21use Fcntl;
22use IO::AIO 2.31 (); 22use IO::AIO 2.32 ();
23use YAML::Syck (); 23use YAML::Syck ();
24use Time::HiRes; 24use Time::HiRes;
25 25
26use Event; $Event::Eval = 1; # no idea why this is required, but it is 26use Event; $Event::Eval = 1; # no idea why this is required, but it is
27 27
1086 1086
1087Returns the given player object, loading it if necessary (might block). 1087Returns the given player object, loading it if necessary (might block).
1088 1088
1089=cut 1089=cut
1090 1090
1091sub playerdir($) {
1092 cf::localdir
1093 . "/"
1094 . cf::playerdir
1095 . "/"
1096 . (ref $_[0] ? $_[0]->ob->name : $_[0])
1097}
1098
1091sub path($) { 1099sub path($) {
1092 sprintf "%s/%s/%s/%s.pl", 1100 my $login = ref $_[0] ? $_[0]->ob->name : $_[0];
1093 cf::localdir, cf::playerdir, 1101
1094 (ref $_[0] ? $_[0]->ob->name : $_[0]) x 2 1102 (playerdir $login) . "/$login.pl"
1095} 1103}
1096 1104
1097sub find_active($) { 1105sub find_active($) {
1098 $cf::PLAYER{$_[0]} 1106 $cf::PLAYER{$_[0]}
1099 and $cf::PLAYER{$_[0]}->active 1107 and $cf::PLAYER{$_[0]}->active
1142 $self->{deny_save} = 1; 1150 $self->{deny_save} = 1;
1143 1151
1144 $cf::PLAYER{$login} = $self; 1152 $cf::PLAYER{$login} = $self;
1145 1153
1146 $self 1154 $self
1155}
1156
1157sub quit_character {
1158 my ($pl) = @_;
1159
1160 $pl->{deny_save} = 1;
1161 $pl->password ("*"); # this should lock out the player until we nuked the dir
1162
1163 $pl->invoke (cf::EVENT_PLAYER_LOGOUT, 1) if $pl->active;
1164 $pl->deactivate;
1165 $pl->invoke (cf::EVENT_PLAYER_QUIT);
1166 $pl->ns->destroy if $pl->ns;
1167
1168 my $path = playerdir $pl;
1169 my $temp = "$path~$cf::RUNTIME~deleting~";
1170 IO::AIO::aio_rename $path, $temp, sub {
1171 delete $cf::PLAYER{$pl->ob->name};
1172 $pl->destroy;
1173
1174 IO::AIO::aio_rmtree $temp;
1175 };
1147} 1176}
1148 1177
1149=item $player->ext_reply ($msgid, $msgtype, %msg) 1178=item $player->ext_reply ($msgid, $msgtype, %msg)
1150 1179
1151Sends an ext reply to the player. 1180Sends an ext reply to the player.
1474} 1503}
1475 1504
1476sub emergency_save { 1505sub emergency_save {
1477 my $freeze_guard = cf::freeze_mainloop; 1506 my $freeze_guard = cf::freeze_mainloop;
1478 1507
1479 warn "enter emergency map save\n"; 1508 warn "enter emergency perl save\n";
1480 1509
1481 cf::sync_job { 1510 cf::sync_job {
1511 warn "begin emergency player save\n";
1512 $_->save for values %cf::PLAYER;
1513 warn "end emergency player save\n";
1514
1482 warn "begin emergency map save\n"; 1515 warn "begin emergency map save\n";
1483 $_->save for values %cf::MAP; 1516 $_->save for values %cf::MAP;
1517 warn "end emergency map save\n";
1484 }; 1518 };
1485 1519
1486 warn "end emergency map save\n"; 1520 warn "leave emergency perl save\n";
1487} 1521}
1488 1522
1489package cf; 1523package cf;
1490 1524
1491=back 1525=back
2167 cf::load_extensions; 2201 cf::load_extensions;
2168 2202
2169 # reattach attachments to objects 2203 # reattach attachments to objects
2170 warn "reattach"; 2204 warn "reattach";
2171 _global_reattach; 2205 _global_reattach;
2206 reattach $_ for values %MAP;
2172 }; 2207 };
2173 2208
2174 if ($@) { 2209 if ($@) {
2175 warn $@; 2210 warn $@;
2176 warn "error while reloading, exiting."; 2211 warn "error while reloading, exiting.";

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines