--- deliantra/server/lib/cf.pm 2007/01/22 03:44:41 1.190 +++ deliantra/server/lib/cf.pm 2007/01/28 00:20:02 1.197 @@ -10,7 +10,7 @@ use Safe; use Safe::Hole; -use Coro 3.4 (); +use Coro 3.5 (); use Coro::Event; use Coro::Timer; use Coro::Signal; @@ -1178,6 +1178,8 @@ sub normalise { my ($path, $base) = @_; + $path = "$path"; # make sure its a string + # map plan: # # /! non-realised random map exit (special hack!) @@ -1223,7 +1225,7 @@ } } - Carp::carp "unable to resolve path '$path'."; + Carp::carp "unable to resolve path '$path' (base '$base')."; () } @@ -1362,13 +1364,12 @@ $map->load_header or return; - if ($map->should_reset) { + if ($map->should_reset && 0) {#d#TODO# disabled, crashy (locking issue?) # doing this can freeze the server in a sync job, obviously #$cf::WAIT_FOR_TICK->wait; $map->reset; undef $guard; - $map = find $path - or return; + return find $path; } $cf::MAP{$path} = $map @@ -1381,6 +1382,8 @@ sub load { my ($self) = @_; + local $self->{deny_reset} = 1; # loading can take a long time + my $path = $self->{path}; my $guard = cf::lock_acquire "map_load:$path"; @@ -1732,7 +1735,7 @@ sub link_map { unless ($LINK_MAP) { $LINK_MAP = cf::map::find "{link}" - or do { warn "FATAL: unable to provide {link} map, exiting."; exit 1 }; + or cf::cleanup "FATAL: unable to provide {link} map, exiting."; $LINK_MAP->load; } @@ -1749,7 +1752,7 @@ $self->{_link_pos} ||= [$self->map->{path}, $self->x, $self->y] if $self->map; - $self->enter_map ($LINK_MAP || link_map, 20, 20); + $self->enter_map ($LINK_MAP || link_map, 10, 10); } sub cf::object::player::leave_link { @@ -1826,13 +1829,12 @@ $self->enter_link; (async { - my $map = cf::map::find $path; - $map = $map->customise_for ($self) if $map; - -# warn "entering ", $map->path, " at ($x, $y)\n" -# if $map; - - $map or $self->message ("The exit to '" . ($path->visible_name) . "' is closed", cf::NDI_UNIQUE | cf::NDI_RED); + my $map = eval { + my $map = cf::map::find $path; + $map = $map->customise_for ($self) if $map; + $map + } or + $self->message ("The exit to '$path' is closed", cf::NDI_UNIQUE | cf::NDI_RED); $self->leave_link ($map, $x, $y); })->prio (1); @@ -1900,16 +1902,21 @@ return unless $self->type == cf::PLAYER; + if ($exit->slaying eq "/!") { + #TODO: this should de-fi-ni-te-ly not be a sync-job + cf::sync_job { prepare_random_map $exit }; + } + + my $slaying = cf::map::normalise $exit->slaying, $exit->map && $exit->map->path; + my $hp = $exit->stats->hp; + my $sp = $exit->stats->sp; + $self->enter_link; (async { $self->deactivate_recursive; # just to be sure unless (eval { - prepare_random_map $exit - if $exit->slaying eq "/!"; - - my $path = new_from_path cf::map $exit->slaying, $exit->map && $exit->map->path; - $self->goto ($path, $exit->stats->hp, $exit->stats->sp); + $self->goto ($slaying, $hp, $sp); 1; }) { @@ -2296,6 +2303,7 @@ reentrant => 0, data => WF_AUTOCANCEL, signal => $signal, + prio => 0, cb => sub { cf::cleanup "SIG$signal"; }, @@ -2480,7 +2488,7 @@ $TICK_WATCHER = Event->timer ( reentrant => 0, parked => 1, - prio => -1, + prio => 0, at => $NEXT_TICK || $TICK, data => WF_AUTOCANCEL, cb => sub { @@ -2499,8 +2507,11 @@ $WAIT_FOR_TICK->broadcast; $WAIT_FOR_TICK_ONE->send if $WAIT_FOR_TICK_ONE->awaited; - my $AFTER = Event::time; - warn $AFTER - $NOW;#d# + Event::sweep; + Coro::cede_notself; + +# my $AFTER = Event::time; +# warn $AFTER - $NOW;#d# # if we are delayed by four ticks or more, skip them all $NEXT_TICK = Event::time if Event::time >= $NEXT_TICK + $TICK * 4; @@ -2510,7 +2521,7 @@ }, ); -IO::AIO::max_poll_time $TICK * 0.2; +IO::AIO::max_poll_time $TICK * 0.1; undef $Coro::AIO::WATCHER; $AIO_POLL_WATCHER = Event->io (