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.67 by root, Tue Sep 12 23:22:32 2006 UTC vs.
Revision 1.75 by root, Mon Oct 2 00:22:01 2006 UTC

5use Storable; 5use Storable;
6use Opcode; 6use Opcode;
7use Safe; 7use Safe;
8use Safe::Hole; 8use Safe::Hole;
9 9
10use YAML::Syck ();
10use Time::HiRes; 11use Time::HiRes;
11use Event; 12use Event;
12$Event::Eval = 1; # no idea why this is required, but it is 13$Event::Eval = 1; # no idea why this is required, but it is
13 14
15# work around bug in YAML::Syck - bad news for perl6, will it be as broken wrt. unicode?
16$YAML::Syck::ImplicitUnicode = 1;
17
14use strict; 18use strict;
15 19
16_init_vars; 20_init_vars;
17 21
18our %COMMAND = (); 22our %COMMAND = ();
20our $LIBDIR = maps_directory "perl"; 24our $LIBDIR = maps_directory "perl";
21 25
22our $TICK = MAX_TIME * 1e-6; 26our $TICK = MAX_TIME * 1e-6;
23our $TICK_WATCHER; 27our $TICK_WATCHER;
24our $NEXT_TICK; 28our $NEXT_TICK;
29
30our %CFG;
31
32#############################################################################
33
34=head2 GLOBAL VARIABLES
35
36=over 4
37
38=item $cf::LIBDIR
39
40The perl library directory, where extensions and cf-specific modules can
41be found. It will be added to C<@INC> automatically.
42
43=item $cf::TICK
44
45The interval between server ticks, in seconds.
46
47=item %cf::CFG
48
49Configuration for the server, loaded from C</etc/crossfire/config>, or
50from wherever your confdir points to.
51
52=back
53
54=cut
25 55
26BEGIN { 56BEGIN {
27 *CORE::GLOBAL::warn = sub { 57 *CORE::GLOBAL::warn = sub {
28 my $msg = join "", @_; 58 my $msg = join "", @_;
29 $msg .= "\n" 59 $msg .= "\n"
51my @exts; 81my @exts;
52my @hook; 82my @hook;
53my %command; 83my %command;
54my %extcmd; 84my %extcmd;
55 85
56############################################################################# 86=head2 UTILITY FUNCTIONS
57# utility functions 87
88=over 4
89
90=cut
58 91
59use JSON::Syck (); # TODO# replace by JSON::PC once working 92use JSON::Syck (); # TODO# replace by JSON::PC once working
93
94=item $ref = cf::from_json $json
95
96Converts a JSON string into the corresponding perl data structure.
97
98=cut
60 99
61sub from_json($) { 100sub from_json($) {
62 $JSON::Syck::ImplicitUnicode = 1; # work around JSON::Syck bugs 101 $JSON::Syck::ImplicitUnicode = 1; # work around JSON::Syck bugs
63 JSON::Syck::Load $_[0] 102 JSON::Syck::Load $_[0]
64} 103}
65 104
105=item $json = cf::to_json $ref
106
107Converts a perl data structure into its JSON representation.
108
109=cut
110
66sub to_json($) { 111sub to_json($) {
67 $JSON::Syck::ImplicitUnicode = 0; # work around JSON::Syck bugs 112 $JSON::Syck::ImplicitUnicode = 0; # work around JSON::Syck bugs
68 JSON::Syck::Dump $_[0] 113 JSON::Syck::Dump $_[0]
69} 114}
70 115
71############################################################################# 116=back
72# "new" plug-in system
73 117
118=cut
119
120#############################################################################
121
74=head3 EVENTS AND OBJECT ATTACHMENTS 122=head2 EVENTS AND OBJECT ATTACHMENTS
75 123
76=over 4 124=over 4
77 125
78=item $object->attach ($attachment, key => $value...) 126=item $object->attach ($attachment, key => $value...)
79 127
379removed in future versions), and there is no public API to access override 427removed in future versions), and there is no public API to access override
380results (if you must, access C<@cf::invoke_results> directly). 428results (if you must, access C<@cf::invoke_results> directly).
381 429
382=back 430=back
383 431
384=head2 methods valid for all pointers 432=cut
433
434#############################################################################
435
436=head2 METHODS VALID FOR ALL CORE OBJECTS
385 437
386=over 4 438=over 4
387 439
388=item $object->valid 440=item $object->valid, $player->valid, $map->valid
389
390=item $player->valid
391
392=item $map->valid
393 441
394Just because you have a perl object does not mean that the corresponding 442Just because you have a perl object does not mean that the corresponding
395C-level object still exists. If you try to access an object that has no 443C-level object still exists. If you try to access an object that has no
396valid C counterpart anymore you get an exception at runtime. This method 444valid C counterpart anymore you get an exception at runtime. This method
397can be used to test for existence of the C object part without causing an 445can be used to test for existence of the C object part without causing an
704 } 752 }
705 }, 753 },
706; 754;
707 755
708############################################################################# 756#############################################################################
709# core extensions - in perl 757
758=head2 CORE EXTENSIONS
759
760Functions and methods that extend core crossfire objects.
761
762=over 4
710 763
711=item cf::player::exists $login 764=item cf::player::exists $login
712 765
713Returns true when the given account exists. 766Returns true when the given account exists.
714 767
717sub cf::player::exists($) { 770sub cf::player::exists($) {
718 cf::player::find $_[0] 771 cf::player::find $_[0]
719 or -f sprintf "%s/%s/%s/%s.pl", cf::localdir, cf::playerdir, ($_[0]) x 2; 772 or -f sprintf "%s/%s/%s/%s.pl", cf::localdir, cf::playerdir, ($_[0]) x 2;
720} 773}
721 774
722=item $player->reply ($npc, $msg[, $flags]) 775=item $object->reply ($npc, $msg[, $flags])
723 776
724Sends a message to the player, as if the npc C<$npc> replied. C<$npc> 777Sends a message to the player, as if the npc C<$npc> replied. C<$npc>
725can be C<undef>. Does the right thing when the player is currently in a 778can be C<undef>. Does the right thing when the player is currently in a
726dialogue with the given NPC character. 779dialogue with the given NPC character.
727 780
754 $msg{msgid} = $id; 807 $msg{msgid} = $id;
755 808
756 $self->send ("ext " . to_json \%msg); 809 $self->send ("ext " . to_json \%msg);
757} 810}
758 811
812=back
813
814=cut
815
759############################################################################# 816#############################################################################
760# map scripting support 817
818=head2 SAFE SCRIPTING
819
820Functions that provide a safe environment to compile and execute
821snippets of perl code without them endangering the safety of the server
822itself. Looping constructs, I/O operators and other built-in functionality
823is not available in the safe scripting environment, and the number of
824functions and methods that cna be called is greatly reduced.
825
826=cut
761 827
762our $safe = new Safe "safe"; 828our $safe = new Safe "safe";
763our $safe_hole = new Safe::Hole; 829our $safe_hole = new Safe::Hole;
764 830
765$SIG{FPE} = 'IGNORE'; 831$SIG{FPE} = 'IGNORE';
766 832
767$safe->permit_only (Opcode::opset qw(:base_core :base_mem :base_orig :base_math sort time)); 833$safe->permit_only (Opcode::opset qw(:base_core :base_mem :base_orig :base_math sort time));
768 834
769# here we export the classes and methods available to script code 835# here we export the classes and methods available to script code
836
837=pod
838
839The following fucntions and emthods are available within a safe environment:
840
841 cf::object contr pay_amount pay_player
842 cf::object::player player
843 cf::player peaceful
844
845=cut
770 846
771for ( 847for (
772 ["cf::object" => qw(contr pay_amount pay_player)], 848 ["cf::object" => qw(contr pay_amount pay_player)],
773 ["cf::object::player" => qw(player)], 849 ["cf::object::player" => qw(player)],
774 ["cf::player" => qw(peaceful)], 850 ["cf::player" => qw(peaceful)],
777 my ($pkg, @funs) = @$_; 853 my ($pkg, @funs) = @$_;
778 *{"safe::$pkg\::$_"} = $safe_hole->wrap (\&{"$pkg\::$_"}) 854 *{"safe::$pkg\::$_"} = $safe_hole->wrap (\&{"$pkg\::$_"})
779 for @funs; 855 for @funs;
780} 856}
781 857
858=over 4
859
860=item @retval = safe_eval $code, [var => value, ...]
861
862Compiled and executes the given perl code snippet. additional var/value
863pairs result in temporary local (my) scalar variables of the given name
864that are available in the code snippet. Example:
865
866 my $five = safe_eval '$first + $second', first => 1, second => 4;
867
868=cut
869
782sub safe_eval($;@) { 870sub safe_eval($;@) {
783 my ($code, %vars) = @_; 871 my ($code, %vars) = @_;
784 872
785 my $qcode = $code; 873 my $qcode = $code;
786 $qcode =~ s/"/‟/g; # not allowed in #line filenames 874 $qcode =~ s/"/‟/g; # not allowed in #line filenames
808 } 896 }
809 897
810 wantarray ? @res : $res[0] 898 wantarray ? @res : $res[0]
811} 899}
812 900
901=item cf::register_script_function $function => $cb
902
903Register a function that can be called from within map/npc scripts. The
904function should be reasonably secure and should be put into a package name
905like the extension.
906
907Example: register a function that gets called whenever a map script calls
908C<rent::overview>, as used by the C<rent> extension.
909
910 cf::register_script_function "rent::overview" => sub {
911 ...
912 };
913
914=cut
915
813sub register_script_function { 916sub register_script_function {
814 my ($fun, $cb) = @_; 917 my ($fun, $cb) = @_;
815 918
816 no strict 'refs'; 919 no strict 'refs';
817 *{"safe::$fun"} = $safe_hole->wrap ($cb); 920 *{"safe::$fun"} = $safe_hole->wrap ($cb);
818} 921}
922
923=back
924
925=cut
819 926
820############################################################################# 927#############################################################################
821 928
822=head2 EXTENSION DATABASE SUPPORT 929=head2 EXTENSION DATABASE SUPPORT
823 930
876 waitpid $pid, 0 if $pid; 983 waitpid $pid, 0 if $pid;
877 if (0 == ($pid = fork)) { 984 if (0 == ($pid = fork)) {
878 $db->{_meta}{version} = 1; 985 $db->{_meta}{version} = 1;
879 Storable::nstore $db, "$path~"; 986 Storable::nstore $db, "$path~";
880 rename "$path~", $path; 987 rename "$path~", $path;
881 kill 9, $$ if defined $pid; #d# remove when binary updated
882 cf::_exit 0 if defined $pid; 988 cf::_exit 0 if defined $pid;
883 } 989 }
884 } 990 }
885 991
886 my $dirty; 992 my $dirty;
923} 1029}
924 1030
925############################################################################# 1031#############################################################################
926# the server's main() 1032# the server's main()
927 1033
1034sub cfg_load {
1035 open my $fh, "<:utf8", cf::confdir . "/config"
1036 or return;
1037
1038 local $/;
1039 *CFG = YAML::Syck::Load <$fh>;
1040}
1041
928sub main { 1042sub main {
1043 cfg_load;
929 db_load; 1044 db_load;
930 load_extensions; 1045 load_extensions;
931 Event::loop; 1046 Event::loop;
932} 1047}
933 1048
985 1100
986 # reload cf.pm 1101 # reload cf.pm
987 $msg->("reloading cf.pm"); 1102 $msg->("reloading cf.pm");
988 require cf; 1103 require cf;
989 1104
990 # load database again 1105 # load config and database again
1106 cf::cfg_load;
991 cf::db_load; 1107 cf::db_load;
992 1108
993 # load extensions 1109 # load extensions
994 $msg->("load extensions"); 1110 $msg->("load extensions");
995 cf::load_extensions; 1111 cf::load_extensions;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines