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.13 by root, Sun Jan 7 23:10:42 2007 UTC vs.
Revision 1.17 by root, Mon Jan 8 14:11:05 2007 UTC

292 on_apply => sub { 292 on_apply => sub {
293 my ($bed, $ob) = @_; 293 my ($bed, $ob) = @_;
294 294
295 return cf::override 0 unless $ob->type == cf::PLAYER; 295 return cf::override 0 unless $ob->type == cf::PLAYER;
296 296
297 my $pl = $ob->pl; 297 my $pl = $ob->contr;
298 298
299 # update respawn position 299 # update respawn position
300 $pl->savebed ($bed->map->path, $bed->x, $bed->y); 300 $pl->savebed ($bed->map->path, $bed->x, $bed->y);
301 301
302 $pl->killer ("left"); 302 $pl->killer ("left");
329 329
330 if ($cleanly) { 330 if ($cleanly) {
331 $_->ob->message ("$name left the game.", cf::NDI_DK_ORANGE | cf::NDI_UNIQUE) for cf::player::list; 331 $_->ob->message ("$name left the game.", cf::NDI_DK_ORANGE | cf::NDI_UNIQUE) for cf::player::list;
332 } else { 332 } else {
333 $_->ob->message ("$name uncerimoniously disconnected.", cf::NDI_DK_ORANGE | cf::NDI_UNIQUE) for cf::player::list; 333 $_->ob->message ("$name uncerimoniously disconnected.", cf::NDI_DK_ORANGE | cf::NDI_UNIQUE) for cf::player::list;
334 delete $pl->{clean_save};
334 } 335 }
335 }, 336 },
336); 337);
337 338
338cf::client->attach ( 339cf::client->attach (
340); 341);
341 342
342############################################################################# 343#############################################################################
343 344
344our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs 345our $SCHEDULE_INTERVAL = 10; # time the player scheduler sleeps between runs
345our $SWAP_TIMEOUT = 30; # time after which an unused player is evicted form memory
346our $SAVE_TIMEOUT = 20; # save players every n seconds 346our $SAVE_TIMEOUT = 200; # save players every n seconds
347our $SAVE_INTERVAL = 0.1; # save at max. one player every $SAVE_INTERVAL 347our $SAVE_INTERVAL = 0.1; # save at max. one player every $SAVE_INTERVAL
348 348
349our $SCHEDULER = cf::async_ext { 349our $SCHEDULER = cf::async_ext {
350 while () { 350 while () {
351 Coro::Timer::sleep $SCHEDULE_INTERVAL; 351 Coro::Timer::sleep $SCHEDULE_INTERVAL;
363 eval { 363 eval {
364 if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) { 364 if ($pl->{last_save} + $SAVE_TIMEOUT <= $cf::RUNTIME) {
365 $pl->save; 365 $pl->save;
366 Coro::Timer::sleep $SAVE_INTERVAL; 366 Coro::Timer::sleep $SAVE_INTERVAL;
367 } 367 }
368
369 unless ($pl->active) {
370 # check refcounts, this is tricky and needs to be adjusted to fit server internals
371 my $ob = $pl->ob;
372 Scalar::Util::weaken $pl;
373 Scalar::Util::weaken $ob;
374 my $a_ = $pl->refcnt;
375 my $b_ = $ob->refcnt;
376 my $pl_ref = $pl->refcnt_cnt;
377 my $ob_ref = $ob->refcnt_cnt;
378
379 if ($pl_ref == 2 && $ob_ref == 1) {
380 warn "player-scheduler destroy ", $ob->name;#d#
381 delete $cf::PLAYER{$ob->name};
382 # pl_ref == one from object + one from cf::PLAYER
383 # ob_ref == one from simply being an object
384 $ob->destroy;
385 $pl->destroy;
386 } else {
387 warn "player-scheduler refcnt ", $ob->name, " $pl_ref,$a_ $ob_ref,$b_\n";#d#
388 }
389 }
368 }; 390 };
369 warn $@ if $@; 391 warn $@ if $@;
370 Coro::cede; 392 Coro::cede;
371 }; 393 };
372 } 394 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines