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.293 by root, Tue Jul 3 05:14:15 2007 UTC vs.
Revision 1.300 by root, Tue Jul 10 06:44:29 2007 UTC

409Coro::Storable. May, of course, block. Note that the executed sub may 409Coro::Storable. May, of course, block. Note that the executed sub may
410never block itself or use any form of Event handling. 410never block itself or use any form of Event handling.
411 411
412=cut 412=cut
413 413
414sub _store_scalar {
415 open my $fh, ">", \my $buf
416 or die "fork_call: cannot open fh-to-buf in child : $!";
417 Storable::store_fd $_[0], $fh;
418 close $fh;
419
420 $buf
421}
422
414sub fork_call(&@) { 423sub fork_call(&@) {
415 my ($cb, @args) = @_; 424 my ($cb, @args) = @_;
416 425
417# socketpair my $fh1, my $fh2, Socket::AF_UNIX, Socket::SOCK_STREAM, Socket::PF_UNSPEC 426# socketpair my $fh1, my $fh2, Socket::AF_UNIX, Socket::SOCK_STREAM, Socket::PF_UNSPEC
418# or die "socketpair: $!"; 427# or die "socketpair: $!";
421 430
422 if (my $pid = fork) { 431 if (my $pid = fork) {
423 close $fh2; 432 close $fh2;
424 433
425 my $res = (Coro::Handle::unblock $fh1)->readline (undef); 434 my $res = (Coro::Handle::unblock $fh1)->readline (undef);
435 warn "pst<$res>" unless $res =~ /^pst/;
426 $res = Coro::Storable::thaw $res; 436 $res = Coro::Storable::thaw $res;
427 437
428 waitpid $pid, 0; # should not block anymore, we expect the child to simply behave 438 waitpid $pid, 0; # should not block anymore, we expect the child to simply behave
429 439
430 die $$res unless "ARRAY" eq ref $res; 440 Carp::confess $$res unless "ARRAY" eq ref $res;
431 441
432 return wantarray ? @$res : $res->[-1]; 442 return wantarray ? @$res : $res->[-1];
433 } else { 443 } else {
434 reset_signals; 444 reset_signals;
435 local $SIG{__WARN__}; 445 local $SIG{__WARN__};
436 local $SIG{__DIE__}; 446 local $SIG{__DIE__};
447 # just in case, this hack effectively disables event
448 # in the child. cleaner and slower would be canceling all watchers,
449 # but this works for the time being.
450 local $Coro::idle;
451 $Coro::current->prio (Coro::PRIO_MAX);
452
437 eval { 453 eval {
438 close $fh1; 454 close $fh1;
439 455
440 my @res = eval { $cb->(@args) }; 456 my @res = eval { $cb->(@args) };
457
441 syswrite $fh2, Coro::Storable::freeze +($@ ? \"$@" : \@res); 458 syswrite $fh2, _store_scalar $@ ? \"$@" : \@res;
459 close $fh2;
442 }; 460 };
443 461
444 warn $@ if $@; 462 warn $@ if $@;
445 _exit 0; 463 _exit 0;
446 } 464 }
1412 1430
1413 # create single paragraphs (very hackish) 1431 # create single paragraphs (very hackish)
1414 s/(?<=\S)\n(?=\w)/ /g; 1432 s/(?<=\S)\n(?=\w)/ /g;
1415 1433
1416 # compress some whitespace 1434 # compress some whitespace
1417 1 while s/\s*\n\s*\n\s*/\n/; 1435 s/\s+\n/\n/g; # ws line-ends
1436 s/\n\n+/\n/g; # double lines
1437 s/^\n+//; # beginning lines
1438 s/\n+$//; # ending lines
1418 1439
1419 s/^\s+//; 1440 warn $_;#d#
1420 s/\s+$//;
1421
1422 $_ 1441 $_
1423} 1442}
1424 1443
1425sub hintmode { 1444sub hintmode {
1426 $_[0]{hintmode} = $_[1] if @_ > 1; 1445 $_[0]{hintmode} = $_[1] if @_ > 1;
2357 my $hp = $exit->stats->hp; 2376 my $hp = $exit->stats->hp;
2358 my $sp = $exit->stats->sp; 2377 my $sp = $exit->stats->sp;
2359 2378
2360 $self->enter_link; 2379 $self->enter_link;
2361 2380
2381 # if exit is damned, update players death & WoR home-position
2382 $self->contr->savebed ($slaying, $hp, $sp)
2383 if $exit->flag (FLAG_DAMNED);
2384
2362 (async { 2385 (async {
2363 $self->deactivate_recursive; # just to be sure 2386 $self->deactivate_recursive; # just to be sure
2364 unless (eval { 2387 unless (eval {
2365 $self->goto ($slaying, $hp, $sp); 2388 $self->goto ($slaying, $hp, $sp);
2366 2389
2406 2429
2407sub cf::client::send_msg { 2430sub cf::client::send_msg {
2408 my ($self, $color, $type, $msg, @extra) = @_; 2431 my ($self, $color, $type, $msg, @extra) = @_;
2409 2432
2410 $msg = $self->pl->expand_cfpod ($msg); 2433 $msg = $self->pl->expand_cfpod ($msg);
2434
2435 return unless @extra || length $msg;
2411 2436
2412 if ($self->can_msg) { 2437 if ($self->can_msg) {
2413 $self->send_packet ("msg " . $self->{json_coder}->encode ([$color, $type, $msg, @extra])); 2438 $self->send_packet ("msg " . $self->{json_coder}->encode ([$color, $type, $msg, @extra]));
2414 } else { 2439 } else {
2415 # replace some tags by gcfclient-compatible ones 2440 # replace some tags by gcfclient-compatible ones
2576 2601
2577=pod 2602=pod
2578 2603
2579The following functions and methods are available within a safe environment: 2604The following functions and methods are available within a safe environment:
2580 2605
2581 cf::object contr pay_amount pay_player map 2606 cf::object
2607 contr pay_amount pay_player map x y force_find force_add
2608 insert remove
2609
2582 cf::object::player player 2610 cf::object::player
2583 cf::player peaceful 2611 player
2584 cf::map trigger 2612
2613 cf::player
2614 peaceful
2615
2616 cf::map
2617 trigger
2585 2618
2586=cut 2619=cut
2587 2620
2588for ( 2621for (
2589 ["cf::object" => qw(contr pay_amount pay_player map)], 2622 ["cf::object" => qw(contr pay_amount pay_player map force_find force_add x y
2623 insert remove)],
2590 ["cf::object::player" => qw(player)], 2624 ["cf::object::player" => qw(player)],
2591 ["cf::player" => qw(peaceful)], 2625 ["cf::player" => qw(peaceful)],
2592 ["cf::map" => qw(trigger)], 2626 ["cf::map" => qw(trigger)],
2593) { 2627) {
2594 no strict 'refs'; 2628 no strict 'refs';

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines