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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines