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.269 by root, Tue May 22 21:35:26 2007 UTC vs.
Revision 1.270 by root, Sat May 26 15:44:06 2007 UTC

1904 $self->deactivate_recursive; 1904 $self->deactivate_recursive;
1905 1905
1906 return if UNIVERSAL::isa $self->map, "ext::map_link"; 1906 return if UNIVERSAL::isa $self->map, "ext::map_link";
1907 1907
1908 $self->{_link_pos} ||= [$self->map->{path}, $self->x, $self->y] 1908 $self->{_link_pos} ||= [$self->map->{path}, $self->x, $self->y]
1909 if $self->map; 1909 if $self->map && $self->map->{path} ne "{link}";
1910 1910
1911 $self->enter_map ($LINK_MAP || link_map, 10, 10); 1911 $self->enter_map ($LINK_MAP || link_map, 10, 10);
1912} 1912}
1913 1913
1914sub cf::object::player::leave_link { 1914sub cf::object::player::leave_link {
1915 my ($self, $map, $x, $y) = @_; 1915 my ($self, $map, $x, $y) = @_;
1916
1917 return unless $self->contr->active;
1916 1918
1917 my $link_pos = delete $self->{_link_pos}; 1919 my $link_pos = delete $self->{_link_pos};
1918 1920
1919 unless ($map) { 1921 unless ($map) {
1920 # restore original map position 1922 # restore original map position
1943 1945
1944 local $self->{_prev_pos} = $link_pos; # ugly hack for rent.ext 1946 local $self->{_prev_pos} = $link_pos; # ugly hack for rent.ext
1945 $self->enter_map ($map, $x, $y); 1947 $self->enter_map ($map, $x, $y);
1946} 1948}
1947 1949
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)]) 1950=item $player_object->goto ($path, $x, $y[, $check->($map)])
1981 1951
1982Moves the player to the given map-path and coordinates by first freezing 1952Moves the player to the given map-path and coordinates by first freezing
1983her, loading and preparing them map, calling the provided $check callback 1953her, loading and preparing them map, calling the provided $check callback
1984that has to return the map if sucecssful, and then unfreezes the player on 1954that has to return the map if sucecssful, and then unfreezes the player on
1985the new (success) or old (failed) map position. 1955the new (success) or old (failed) map position.
1986 1956
1987=cut 1957=cut
1988 1958
1959our $GOTOGEN;
1960
1989sub cf::object::player::goto { 1961sub cf::object::player::goto {
1990 my ($self, $path, $x, $y, $check) = @_; 1962 my ($self, $path, $x, $y, $check) = @_;
1963
1964 # do generation counting so two concurrent goto's will be executed in-order
1965 my $gen = $self->{_goto_generation} = ++$GOTOGEN;
1991 1966
1992 $self->enter_link; 1967 $self->enter_link;
1993 1968
1994 (async { 1969 (async {
1995 my $map = eval { 1970 my $map = eval {
2008 if ($@) { 1983 if ($@) {
2009 $self->message ("Something went wrong within the server, please report this incident!", cf::NDI_UNIQUE | cf::NDI_RED); 1984 $self->message ("Something went wrong within the server, please report this incident!", cf::NDI_UNIQUE | cf::NDI_RED);
2010 LOG llevError | logBacktrace, Carp::longmess $@; 1985 LOG llevError | logBacktrace, Carp::longmess $@;
2011 } 1986 }
2012 1987
1988 if ($gen == $self->{_goto_generation}) {
1989 delete $self->{_goto_generation};
2013 $self->leave_link ($map, $x, $y); 1990 $self->leave_link ($map, $x, $y);
1991 }
2014 })->prio (1); 1992 })->prio (1);
2015} 1993}
2016 1994
2017=item $player_object->enter_exit ($exit_object) 1995=item $player_object->enter_exit ($exit_object)
2018 1996

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines