ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/lib/cf.pm
(Generate patch)

Comparing deliantra/server/lib/cf.pm (file contents):
Revision 1.268 by root, Tue May 22 10:50:00 2007 UTC vs.
Revision 1.271 by root, Fri Jun 1 06:04:08 2007 UTC

395 my $runtime = "$LOCALDIR/runtime"; 395 my $runtime = "$LOCALDIR/runtime";
396 396
397 # first touch the runtime file to show we are still running: 397 # first touch the runtime file to show we are still running:
398 # the fsync below can take a very very long time. 398 # the fsync below can take a very very long time.
399 399
400 if (my $fh = aio_open $runtime, O_WRONLY, 0) { 400 IO::AIO::aio_utime $runtime, undef, undef;
401 utime undef, undef, $fh;
402 }
403 401
404 my $guard = cf::lock_acquire "write_runtime"; 402 my $guard = cf::lock_acquire "write_runtime";
405 403
406 my $fh = aio_open "$runtime~", O_WRONLY | O_CREAT, 0644 404 my $fh = aio_open "$runtime~", O_WRONLY | O_CREAT, 0644
407 or return; 405 or return;
416 # always fsync - this file is important 414 # always fsync - this file is important
417 aio_fsync $fh 415 aio_fsync $fh
418 and return; 416 and return;
419 417
420 # touch it again to show we are up-to-date 418 # touch it again to show we are up-to-date
421 utime undef, undef, $fh; 419 aio_utime $fh, undef, undef;
422 420
423 close $fh 421 close $fh
424 or return; 422 or return;
425 423
426 aio_rename "$runtime~", $runtime 424 aio_rename "$runtime~", $runtime
1904 $self->deactivate_recursive; 1902 $self->deactivate_recursive;
1905 1903
1906 return if UNIVERSAL::isa $self->map, "ext::map_link"; 1904 return if UNIVERSAL::isa $self->map, "ext::map_link";
1907 1905
1908 $self->{_link_pos} ||= [$self->map->{path}, $self->x, $self->y] 1906 $self->{_link_pos} ||= [$self->map->{path}, $self->x, $self->y]
1909 if $self->map; 1907 if $self->map && $self->map->{path} ne "{link}";
1910 1908
1911 $self->enter_map ($LINK_MAP || link_map, 10, 10); 1909 $self->enter_map ($LINK_MAP || link_map, 10, 10);
1912} 1910}
1913 1911
1914sub cf::object::player::leave_link { 1912sub cf::object::player::leave_link {
1915 my ($self, $map, $x, $y) = @_; 1913 my ($self, $map, $x, $y) = @_;
1914
1915 return unless $self->contr->active;
1916 1916
1917 my $link_pos = delete $self->{_link_pos}; 1917 my $link_pos = delete $self->{_link_pos};
1918 1918
1919 unless ($map) { 1919 unless ($map) {
1920 # restore original map position 1920 # restore original map position
1943 1943
1944 local $self->{_prev_pos} = $link_pos; # ugly hack for rent.ext 1944 local $self->{_prev_pos} = $link_pos; # ugly hack for rent.ext
1945 $self->enter_map ($map, $x, $y); 1945 $self->enter_map ($map, $x, $y);
1946} 1946}
1947 1947
1948cf::player->attach (
1949 on_logout => sub {
1950 my ($pl) = @_;
1951
1952 # abort map switching before logout
1953 if ($pl->ob->{_link_pos}) {
1954 cf::sync_job {
1955 $pl->ob->leave_link
1956 };
1957 }
1958 },
1959 on_login => sub {
1960 my ($pl) = @_;
1961
1962 # try to abort aborted map switching on player login :)
1963 # should happen only on crashes
1964 if ($pl->ob->{_link_pos}) {
1965 $pl->ob->enter_link;
1966 (async {
1967 $pl->ob->reply (undef,
1968 "There was an internal problem at your last logout, "
1969 . "the server will try to bring you to your intended destination in a second.",
1970 cf::NDI_RED);
1971 # we need this sleep as the login has a concurrent enter_exit running
1972 # and this sleep increases chances of the player not ending up in scorn
1973 Coro::Timer::sleep 1;
1974 $pl->ob->leave_link;
1975 })->prio (2);
1976 }
1977 },
1978);
1979
1980=item $player_object->goto ($path, $x, $y[, $check->($map)]) 1948=item $player_object->goto ($path, $x, $y[, $check->($map)])
1981 1949
1982Moves the player to the given map-path and coordinates by first freezing 1950Moves the player to the given map-path and coordinates by first freezing
1983her, loading and preparing them map, calling the provided $check callback 1951her, loading and preparing them map, calling the provided $check callback
1984that has to return the map if sucecssful, and then unfreezes the player on 1952that has to return the map if sucecssful, and then unfreezes the player on
1985the new (success) or old (failed) map position. 1953the new (success) or old (failed) map position.
1986 1954
1987=cut 1955=cut
1988 1956
1957our $GOTOGEN;
1958
1989sub cf::object::player::goto { 1959sub cf::object::player::goto {
1990 my ($self, $path, $x, $y, $check) = @_; 1960 my ($self, $path, $x, $y, $check) = @_;
1991 1961
1992 #d# #TODO# 1962 # do generation counting so two concurrent goto's will be executed in-order
1993 if ($check && !ref $check) { 1963 my $gen = $self->{_goto_generation} = ++$GOTOGEN;
1994 warn Carp::longmess "goto called with non-ref check argument";#d#
1995 undef $check;
1996 }
1997 1964
1998 $self->enter_link; 1965 $self->enter_link;
1999 1966
2000 (async { 1967 (async {
2001 my $map = eval { 1968 my $map = eval {
2014 if ($@) { 1981 if ($@) {
2015 $self->message ("Something went wrong within the server, please report this incident!", cf::NDI_UNIQUE | cf::NDI_RED); 1982 $self->message ("Something went wrong within the server, please report this incident!", cf::NDI_UNIQUE | cf::NDI_RED);
2016 LOG llevError | logBacktrace, Carp::longmess $@; 1983 LOG llevError | logBacktrace, Carp::longmess $@;
2017 } 1984 }
2018 1985
1986 if ($gen == $self->{_goto_generation}) {
1987 delete $self->{_goto_generation};
2019 $self->leave_link ($map, $x, $y); 1988 $self->leave_link ($map, $x, $y);
1989 }
2020 })->prio (1); 1990 })->prio (1);
2021} 1991}
2022 1992
2023=item $player_object->enter_exit ($exit_object) 1993=item $player_object->enter_exit ($exit_object)
2024 1994
2508 2478
2509 warn $@ if $@; 2479 warn $@ if $@;
2510 _exit 0; 2480 _exit 0;
2511 } 2481 }
2512} 2482}
2513
2514
2515 2483
2516############################################################################# 2484#############################################################################
2517# the server's init and main functions 2485# the server's init and main functions
2518 2486
2519sub load_facedata($) { 2487sub load_facedata($) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines