--- deliantra/server/lib/cf.pm 2007/01/07 18:01:10 1.144 +++ deliantra/server/lib/cf.pm 2007/01/08 20:59:15 1.151 @@ -19,7 +19,7 @@ use Digest::MD5; use Fcntl; -use IO::AIO 2.31 (); +use IO::AIO 2.32 (); use YAML::Syck (); use Time::HiRes; @@ -120,7 +120,7 @@ $msg .= "\n" unless $msg =~ /\n$/; - LOG llevError, "cfperl: $msg"; + LOG llevError, $msg; }; } @@ -1088,10 +1088,18 @@ =cut +sub playerdir($) { + cf::localdir + . "/" + . cf::playerdir + . "/" + . (ref $_[0] ? $_[0]->ob->name : $_[0]) +} + sub path($) { - sprintf "%s/%s/%s/%s.pl", - cf::localdir, cf::playerdir, - (ref $_[0] ? $_[0]->ob->name : $_[0]) x 2 + my $login = ref $_[0] ? $_[0]->ob->name : $_[0]; + + (playerdir $login) . "/$login.pl" } sub find_active($) { @@ -1113,8 +1121,12 @@ my $guard = cf::lock_acquire "user_find:$login"; - $cf::PLAYER{$login} ||= (load_pl path $login or return); - }; + $cf::PLAYER{$_[0]} || do { + my $pl = load_pl path $login + or return; + $cf::PLAYER{$login} = $pl + } + } } sub save($) { @@ -1126,9 +1138,10 @@ my $guard = cf::lock_acquire "user_save:$path"; return if $pl->{deny_save}; + + Coro::AIO::aio_mkdir playerdir $pl, 0770; $pl->{last_save} = $cf::RUNTIME; - Coro::cede; $pl->save_pl ($path); Coro::cede; } @@ -1146,6 +1159,25 @@ $self } +sub quit_character { + my ($pl) = @_; + + $pl->{deny_save} = 1; + $pl->password ("*"); # this should lock out the player until we nuked the dir + + $pl->invoke (cf::EVENT_PLAYER_LOGOUT, 1) if $pl->active; + $pl->deactivate; + $pl->invoke (cf::EVENT_PLAYER_QUIT); + $pl->ns->destroy if $pl->ns; + + my $path = playerdir $pl; + my $temp = "$path~$cf::RUNTIME~deleting~"; + Coro::AIO::aio_rename $path, $temp; + delete $cf::PLAYER{$pl->ob->name}; + $pl->destroy; + IO::AIO::aio_rmtree $temp; +} + =item $player->ext_reply ($msgid, $msgtype, %msg) Sends an ext reply to the player. @@ -1652,7 +1684,8 @@ # warn "entering ", $map->path, " at ($x, $y)\n" # if $map; - $map or $self->message ("The exit is closed", cf::NDI_UNIQUE | cf::NDI_RED); + $map or $map->cluck ("oy");#d# + $map or $self->message ("The exit to '" . ($path->visible_name) . "' is closed", cf::NDI_UNIQUE | cf::NDI_RED); $self->leave_link ($map, $x, $y); })->prio (1); @@ -2070,7 +2103,7 @@ if (exists $CFG{mlockall}) { eval { - $CFG{mlockall} ? &mlockall : &munlockall + $CFG{mlockall} ? eval "mlockall()" : eval "munlockall()" and die "WARNING: m(un)lockall failed: $!\n"; }; warn $@ if $@;