--- deliantra/server/ext/login.ext 2007/01/08 22:32:10 1.20 +++ deliantra/server/ext/login.ext 2007/01/08 23:36:16 1.21 @@ -340,9 +340,9 @@ ############################################################################# -our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs -our $SAVE_TIMEOUT = 200; # save players every n seconds -our $SAVE_INTERVAL = 1.1; # save at max. one player every $SAVE_INTERVAL +our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs +our $SAVE_TIMEOUT = 20; # save players every n seconds +our $SAVE_INTERVAL = 1.1; # save at max. one player every $SAVE_INTERVAL our $SCHEDULER = cf::async_ext { while () { @@ -361,29 +361,33 @@ eval { if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) { $pl->save; - Coro::Timer::sleep $SAVE_INTERVAL; - } - unless ($pl->active) { - # check refcounts, this is tricky and needs to be adjusted to fit server internals - my $ob = $pl->ob; - Scalar::Util::weaken $pl; - Scalar::Util::weaken $ob; - my $a_ = $pl->refcnt; - my $b_ = $ob->refcnt; - my $pl_ref = $pl->refcnt_cnt; - my $ob_ref = $ob->refcnt_cnt; - - if ($pl_ref == 2 && $ob_ref == 1) { - warn "player-scheduler destroy ", $ob->name;#d# - #delete $cf::PLAYER{$ob->name}; + unless ($pl->active) { + # check refcounts, this is tricky and needs to be adjusted to fit server internals + my $ob = $pl->ob; + Scalar::Util::weaken $pl; + Scalar::Util::weaken $ob; + my $a_ = $pl->refcnt; + my $b_ = $ob->refcnt; + my $pl_ref = $pl->refcnt_cnt; + my $ob_ref = $ob->refcnt_cnt; + ## pl_ref == one from object + one from cf::PLAYER ## ob_ref == one from simply being an object - #$ob->destroy; - #$pl->destroy; - } else { - warn "player-scheduler refcnt ", $ob->name, " $pl_ref,$a_ $ob_ref,$b_\n";#d# + if ($pl_ref == 2 && $ob_ref == 1) { + warn "player-scheduler destroy ", $ob->name;#d# + + # remove from sight and get fresh "copies" + $pl = delete $cf::PLAYER{$ob->name}; + $ob = $pl->ob; + + $ob->destroy; + $pl->destroy; + } else { + warn "player-scheduler refcnt ", $ob->name, " $pl_ref,$a_ $ob_ref,$b_\n";#d# + } } + Coro::Timer::sleep $SAVE_INTERVAL; } }; warn $@ if $@;