ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/login.ext
(Generate patch)

Comparing deliantra/server/ext/login.ext (file contents):
Revision 1.19 by root, Mon Jan 8 19:25:53 2007 UTC vs.
Revision 1.25 by root, Sat Jan 13 23:06:13 2007 UTC

1#! perl 1#! perl # MANDATORY
2 2
3# login handling 3# login handling
4 4
5use Fcntl; 5use Fcntl;
6use Coro::AIO; 6use Coro::AIO;
294 294
295 my $pl = $ob->contr; 295 my $pl = $ob->contr;
296 296
297 # update respawn position 297 # update respawn position
298 $pl->savebed ($bed->map->path, $bed->x, $bed->y); 298 $pl->savebed ($bed->map->path, $bed->x, $bed->y);
299 cf::async { $pl->save };
299 300
300 $pl->killer ("left"); 301 $pl->killer ("left");
301 $ob->check_score; 302 $ob->check_score;
302 303
303 $ob->reply (undef, "In the future, you will wake up here when you die."); 304 $ob->reply (undef, "In the future, you will wake up here when you die.");
338 on_addme => \&addme, 339 on_addme => \&addme,
339); 340);
340 341
341############################################################################# 342#############################################################################
342 343
343our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs 344our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs
344our $SAVE_TIMEOUT = 200; # save players every n seconds 345our $SAVE_TIMEOUT = 20; # save players every n seconds
345our $SAVE_INTERVAL = 0.1; # save at max. one player every $SAVE_INTERVAL
346 346
347our $SCHEDULER = cf::async_ext { 347our $SCHEDULER = cf::async_ext {
348 while () { 348 while () {
349 Coro::Timer::sleep $SCHEDULE_INTERVAL; 349 Coro::Timer::sleep $SCHEDULE_INTERVAL;
350 350
358 or next; 358 or next;
359 $pl->valid or next; 359 $pl->valid or next;
360 360
361 eval { 361 eval {
362 if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) { 362 if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) {
363 $cf::WAIT_FOR_TICK_ONE->wait;
363 $pl->save; 364 $pl->save;
364 Coro::Timer::sleep $SAVE_INTERVAL;
365 }
366 365
367 unless ($pl->active) { 366 unless ($pl->active) {
368 # check refcounts, this is tricky and needs to be adjusted to fit server internals 367 # check refcounts, this is tricky and needs to be adjusted to fit server internals
369 my $ob = $pl->ob; 368 my $ob = $pl->ob;
370 Scalar::Util::weaken $pl; 369 Scalar::Util::weaken $pl;
371 Scalar::Util::weaken $ob; 370 Scalar::Util::weaken $ob;
372 my $a_ = $pl->refcnt; 371 my $a_ = $pl->refcnt;#d#
373 my $b_ = $ob->refcnt; 372 my $b_ = $ob->refcnt;#d#
374 my $pl_ref = $pl->refcnt_cnt; 373 my $pl_ref = $pl->refcnt_cnt;
375 my $ob_ref = $ob->refcnt_cnt; 374 my $ob_ref = $ob->refcnt_cnt;
376 375
377 if ($pl_ref == 2 && $ob_ref == 1) {
378 warn "player-scheduler destroy ", $ob->name;#d#
379 delete $cf::PLAYER{$ob->name};
380 # pl_ref == one from object + one from cf::PLAYER 376 ## pl_ref == one from object + one from cf::PLAYER
381 # ob_ref == one from simply being an object 377 ## ob_ref == one from simply being an object
378 if ($pl_ref == 2 && $ob_ref == 1) {
379 warn "player-scheduler destroy ", $ob->name;#d#
380
381 # remove from sight and get fresh "copies"
382 $pl = delete $cf::PLAYER{$ob->name};
383 $ob = $pl->ob;
384
382 $ob->destroy; 385 $ob->destroy;
383 $pl->destroy; 386 $pl->destroy;
384 } else { 387 } else {
385 warn "player-scheduler refcnt ", $ob->name, " $pl_ref,$a_ $ob_ref,$b_\n";#d# 388 warn "player-scheduler refcnt ", $ob->name, " $pl_ref,$a_ $ob_ref,$b_\n";#d#
389 }
386 } 390 }
387 } 391 }
388 }; 392 };
389 warn $@ if $@; 393 warn $@ if $@;
390 Coro::cede; 394 Coro::cede;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines