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.80 by root, Tue Nov 7 16:30:55 2006 UTC vs.
Revision 1.85 by root, Mon Dec 11 22:56:57 2006 UTC

16# work around bug in YAML::Syck - bad news for perl6, will it be as broken wrt. unicode? 16# work around bug in YAML::Syck - bad news for perl6, will it be as broken wrt. unicode?
17$YAML::Syck::ImplicitUnicode = 1; 17$YAML::Syck::ImplicitUnicode = 1;
18 18
19use strict; 19use strict;
20 20
21our %COMMAND = ();
22our %COMMAND_TIME = ();
23our %EXTCMD = ();
24
21_init_vars; 25_init_vars;
22 26
23our %COMMAND = ();
24our @EVENT; 27our @EVENT;
25our $LIBDIR = maps_directory "perl"; 28our $LIBDIR = maps_directory "perl";
26 29
27our $TICK = MAX_TIME * 1e-6; 30our $TICK = MAX_TIME * 1e-6;
28our $TICK_WATCHER; 31our $TICK_WATCHER;
29our $NEXT_TICK; 32our $NEXT_TICK;
30 33
31our %CFG; 34our %CFG;
32 35
33our $uptime; 36our $UPTIME; $UPTIME ||= time;
34
35$uptime ||= time;
36 37
37############################################################################# 38#############################################################################
38 39
39=head2 GLOBAL VARIABLES 40=head2 GLOBAL VARIABLES
40 41
41=over 4 42=over 4
43
44=item $cf::UPTIME
45
46The timestamp of the server start (so not actually an uptime).
42 47
43=item $cf::LIBDIR 48=item $cf::LIBDIR
44 49
45The perl library directory, where extensions and cf-specific modules can 50The perl library directory, where extensions and cf-specific modules can
46be found. It will be added to C<@INC> automatically. 51be found. It will be added to C<@INC> automatically.
83}; 88};
84 89
85my %ext_pkg; 90my %ext_pkg;
86my @exts; 91my @exts;
87my @hook; 92my @hook;
88my %command;
89my %extcmd;
90 93
91=head2 UTILITY FUNCTIONS 94=head2 UTILITY FUNCTIONS
92 95
93=over 4 96=over 4
94 97
528sub object_freezer_as_string { 531sub object_freezer_as_string {
529 my ($rdata, $objs) = @_; 532 my ($rdata, $objs) = @_;
530 533
531 use Data::Dumper; 534 use Data::Dumper;
532 535
533 "$$rdata\n" . Dumper $objs 536 $$rdata . Dumper $objs
534} 537}
535 538
536sub object_thawer_load { 539sub object_thawer_load {
537 my ($filename) = @_; 540 my ($filename) = @_;
538 541
565 if exists $src->{_attachment}; 568 if exists $src->{_attachment};
566 }, 569 },
567; 570;
568 571
569############################################################################# 572#############################################################################
570# old plug-in events 573# command handling &c
571 574
572sub inject_event { 575=item cf::register_command $name => \&callback($ob,$args);
573 my $extension = shift;
574 my $event_code = shift;
575 576
576 my $cb = $hook[$event_code]{$extension} 577Register a callback for execution when the client sends the user command
577 or return; 578$name.
578 579
579 &$cb 580=cut
580}
581
582sub inject_global_event {
583 my $event = shift;
584
585 my $cb = $hook[$event]
586 or return;
587
588 List::Util::max map &$_, values %$cb
589}
590
591sub inject_command {
592 my ($name, $obj, $params) = @_;
593
594 for my $cmd (@{ $command{$name} }) {
595 $cmd->[1]->($obj, $params);
596 }
597
598 -1
599}
600 581
601sub register_command { 582sub register_command {
602 my ($name, $time, $cb) = @_; 583 my ($name, $cb) = @_;
603 584
604 my $caller = caller; 585 my $caller = caller;
605 #warn "registering command '$name/$time' to '$caller'"; 586 #warn "registering command '$name/$time' to '$caller'";
606 587
607 push @{ $command{$name} }, [$time, $cb, $caller]; 588 push @{ $COMMAND{$name} }, [$caller, $cb];
608 $COMMAND{"$name\000"} = List::Util::max map $_->[0], @{ $command{$name} };
609} 589}
590
591=item cf::register_extcmd $name => \&callback($pl,$packet);
592
593Register a callbackf ro execution when the client sends an extcmd packet.
594
595If the callback returns something, it is sent back as if reply was being
596called.
597
598=cut
610 599
611sub register_extcmd { 600sub register_extcmd {
612 my ($name, $cb) = @_; 601 my ($name, $cb) = @_;
613 602
614 my $caller = caller; 603 my $caller = caller;
615 #warn "registering extcmd '$name' to '$caller'"; 604 #warn "registering extcmd '$name' to '$caller'";
616 605
617 $extcmd{$name} = [$cb, $caller]; 606 $EXTCMD{$name} = [$cb, $caller];
618} 607}
608
609attach_to_players
610 on_command => sub {
611 my ($pl, $name, $params) = @_;
612
613 my $cb = $COMMAND{$name}
614 or return;
615
616 for my $cmd (@$cb) {
617 $cmd->[1]->($pl->ob, $params);
618 }
619
620 cf::override;
621 },
622 on_extcmd => sub {
623 my ($pl, $buf) = @_;
624
625 my $msg = eval { from_json $buf };
626
627 if (ref $msg) {
628 if (my $cb = $EXTCMD{$msg->{msgtype}}) {
629 if (my %reply = $cb->[0]->($pl, $msg)) {
630 $pl->ext_reply ($msg->{msgid}, %reply);
631 }
632 }
633 } else {
634 warn "player " . ($pl->ob->name) . " sent unparseable ext message: <$buf>\n";
635 }
636
637 cf::override;
638 },
639;
619 640
620sub register { 641sub register {
621 my ($base, $pkg) = @_; 642 my ($base, $pkg) = @_;
622 643
623 #TODO 644 #TODO
642 . "#line 1 \"$path\"\n{\n" 663 . "#line 1 \"$path\"\n{\n"
643 . (do { local $/; <$fh> }) 664 . (do { local $/; <$fh> })
644 . "\n};\n1"; 665 . "\n};\n1";
645 666
646 eval $source 667 eval $source
647 or die "$path: $@"; 668 or die $@ ? "$path: $@\n"
669 : "extension disabled.\n";
648 670
649 push @exts, $pkg; 671 push @exts, $pkg;
650 $ext_pkg{$base} = $pkg; 672 $ext_pkg{$base} = $pkg;
651 673
652# no strict 'refs'; 674# no strict 'refs';
665# for my $idx (0 .. $#PLUGIN_EVENT) { 687# for my $idx (0 .. $#PLUGIN_EVENT) {
666# delete $hook[$idx]{$pkg}; 688# delete $hook[$idx]{$pkg};
667# } 689# }
668 690
669 # remove commands 691 # remove commands
670 for my $name (keys %command) { 692 for my $name (keys %COMMAND) {
671 my @cb = grep $_->[2] ne $pkg, @{ $command{$name} }; 693 my @cb = grep $_->[0] ne $pkg, @{ $COMMAND{$name} };
672 694
673 if (@cb) { 695 if (@cb) {
674 $command{$name} = \@cb; 696 $COMMAND{$name} = \@cb;
675 $COMMAND{"$name\000"} = List::Util::max map $_->[0], @cb;
676 } else { 697 } else {
677 delete $command{$name};
678 delete $COMMAND{"$name\000"}; 698 delete $COMMAND{$name};
679 } 699 }
680 } 700 }
681 701
682 # remove extcmds 702 # remove extcmds
683 for my $name (grep $extcmd{$_}[1] eq $pkg, keys %extcmd) { 703 for my $name (grep $EXTCMD{$_}[1] eq $pkg, keys %EXTCMD) {
684 delete $extcmd{$name}; 704 delete $EXTCMD{$name};
685 } 705 }
686 706
687 if (my $cb = $pkg->can ("unload")) { 707 if (my $cb = $pkg->can ("unload")) {
688 eval { 708 eval {
689 $cb->($pkg); 709 $cb->($pkg);
703 load_extension $ext; 723 load_extension $ext;
704 1 724 1
705 } or warn "$ext not loaded: $@"; 725 } or warn "$ext not loaded: $@";
706 } 726 }
707} 727}
708
709#############################################################################
710# extcmd framework, basically convert ext <msg>
711# into pkg::->on_extcmd_arg1 (...) while shortcutting a few
712
713attach_to_players
714 on_extcmd => sub {
715 my ($pl, $buf) = @_;
716
717 my $msg = eval { from_json $buf };
718
719 if (ref $msg) {
720 if (my $cb = $extcmd{$msg->{msgtype}}) {
721 if (my %reply = $cb->[0]->($pl, $msg)) {
722 $pl->ext_reply ($msg->{msgid}, %reply);
723 }
724 }
725 } else {
726 warn "player " . ($pl->ob->name) . " sent unparseable ext message: <$buf>\n";
727 }
728
729 cf::override;
730 },
731;
732 728
733############################################################################# 729#############################################################################
734# load/save/clean perl data associated with a map 730# load/save/clean perl data associated with a map
735 731
736*cf::mapsupport::on_clean = sub { 732*cf::mapsupport::on_clean = sub {
1152 warn $_[0]; 1148 warn $_[0];
1153 print "$_[0]\n"; 1149 print "$_[0]\n";
1154 }; 1150 };
1155} 1151}
1156 1152
1153register "<global>", __PACKAGE__;
1154
1157register_command "perl-reload", 0, sub { 1155register_command "perl-reload" => sub {
1158 my ($who, $arg) = @_; 1156 my ($who, $arg) = @_;
1159 1157
1160 if ($who->flag (FLAG_WIZ)) { 1158 if ($who->flag (FLAG_WIZ)) {
1161 _perl_reload { 1159 _perl_reload {
1162 warn $_[0]; 1160 warn $_[0];
1163 $who->message ($_[0]); 1161 $who->message ($_[0]);
1164 }; 1162 };
1165 } 1163 }
1166}; 1164};
1167
1168register "<global>", __PACKAGE__;
1169 1165
1170unshift @INC, $LIBDIR; 1166unshift @INC, $LIBDIR;
1171 1167
1172$TICK_WATCHER = Event->timer ( 1168$TICK_WATCHER = Event->timer (
1173 prio => 1, 1169 prio => 1,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines