--- deliantra/server/ext/login.ext 2008/09/16 16:03:02 1.90 +++ deliantra/server/ext/login.ext 2008/12/13 21:46:12 1.94 @@ -15,11 +15,8 @@ sub query { my ($ns, $flags, $text) = @_; - my $current = $Coro::current; - $ns->query ($flags, $text, sub { $current->ready; $current = $_[0] }); - Coro::schedule while ref $current; - - $current + $ns->query ($flags, $text, Coro::rouse_cb); + Coro::rouse_wait } sub can_cleanup { @@ -232,13 +229,13 @@ . "Chose another, or wait till the other session has ended.", cf::NDI_RED ); - } elsif ($user =~ /^[a-zA-Z0-9][a-zA-Z0-9\-_]{2,17}\z/) { + } elsif ($user =~ /^[a-zA-Z0-9][a-zA-Z0-9\-_]{2,19}\z/) { last; } else { $ns->send_drawinfo ( "Your username contains illegal characters " . "(only a-z, A-Z and 0-9 are allowed), " - . "or is not between 3 and 18 characters in length.", + . "or is not between 3 and 20 characters in length.", cf::NDI_RED ); } @@ -435,6 +432,9 @@ $ob->reply (undef, "Welcome to Deliantra!"); + # XXX: Workaround for delayed client ext protocol handshake + $pl->esrv_new_player; + delete $pl->{deny_save}; last; @@ -522,62 +522,4 @@ }, ); -############################################################################# - -our $SCHEDULE_INTERVAL = $cf::CFG{player_schedule_interval} || 10; # time the player scheduler sleeps between runs -our $SAVE_TIMEOUT = $cf::CFG{player_save_interval} || 20; # save players every n seconds - -our $SCHEDULER = cf::async_ext { - $Coro::current->{desc} = "player scheduler"; - - while () { - Coro::EV::timer_once $SCHEDULE_INTERVAL; - - # this weird form of iteration over values is used because - # the hash changes underneath us frequently, and for - # keeps a direct reference to the value without (in 5.8 perls) - # keeping a reference, so this is prone to crashes or worse. - my @players = keys %cf::PLAYER; - for (@players) { - my $pl = $cf::PLAYER{$_} - or next; - $pl->valid or next; - - eval { - if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) { - $pl->save; - - unless ($pl->active || $pl->ns) { - # check refcounts, this is tricky and needs to be adjusted to fit server internals - my $ob = $pl->ob; - - my $pl_ref = $pl->refcnt_cnt; - my $ob_ref = $ob->refcnt_cnt; - - ## pl_ref == $pl + ob->contr + %cf::PLAYER - ## ob_ref == $ob + pl->observe + simply being an object - if ($pl_ref == 3 && $ob_ref == 3) { - warn "player-scheduler destroy ", $ob->name;#d# - - # remove from sight and get fresh "copies" - $pl = delete $cf::PLAYER{$ob->name}; - $ob = $pl->ob; - - $pl->destroy; # destroys $ob - } else { - my $a_ = $pl->refcnt;#d# - my $b_ = $ob->refcnt;#d# - - warn "player-scheduler refcnt ", $ob->name, " pl $pl_ref/3 ob $ob_ref/3 (C pl $a_/1 ob $b_/2)\n";#d# - } - } - } - }; - warn $@ if $@; - cf::cede_to_tick; - }; - } -}; - -$SCHEDULER->prio (1);