--- deliantra/server/lib/cf.pm 2006/10/02 15:28:36 1.76 +++ deliantra/server/lib/cf.pm 2006/12/11 02:54:57 1.84 @@ -7,6 +7,7 @@ use Safe; use Safe::Hole; +use IO::AIO (); use YAML::Syck (); use Time::HiRes; use Event; @@ -29,9 +30,7 @@ our %CFG; -our $uptime; - -$uptime ||= time; +our $UPTIME; $UPTIME ||= time; ############################################################################# @@ -39,6 +38,10 @@ =over 4 +=item $cf::UPTIME + +The timestamp of the server start (so not actually an uptime). + =item $cf::LIBDIR The perl library directory, where extensions and cf-specific modules can @@ -524,6 +527,14 @@ } } +sub object_freezer_as_string { + my ($rdata, $objs) = @_; + + use Data::Dumper; + + $$rdata . Dumper $objs +} + sub object_thawer_load { my ($filename) = @_; @@ -635,7 +646,8 @@ . "\n};\n1"; eval $source - or die "$path: $@"; + or die $@ ? "$path: $@\n" + : "extension disabled.\n"; push @exts, $pkg; $ext_pkg{$base} = $pkg; @@ -776,7 +788,7 @@ or -f sprintf "%s/%s/%s/%s.pl", cf::localdir, cf::playerdir, ($_[0]) x 2; } -=item $object->reply ($npc, $msg[, $flags]) +=item $player_object->reply ($npc, $msg[, $flags]) Sends a message to the player, as if the npc C<$npc> replied. C<$npc> can be C. Does the right thing when the player is currently in a @@ -813,7 +825,21 @@ $self->send ("ext " . to_json \%msg); } -=back +=item $player_object->may ("access") + +Returns wether the given player is authorized to access resource "access" +(e.g. "command_wizcast"). + +=cut + +sub cf::object::player::may { + my ($self, $access) = @_; + + $self->flag (cf::FLAG_WIZ) || + (ref $cf::CFG{"may_$access"} + ? scalar grep $self->name eq $_, @{$cf::CFG{"may_$access"}} + : $cf::CFG{"may_$access"}) +} =cut @@ -825,7 +851,7 @@ snippets of perl code without them endangering the safety of the server itself. Looping constructs, I/O operators and other built-in functionality is not available in the safe scripting environment, and the number of -functions and methods that cna be called is greatly reduced. +functions and methods that can be called is greatly reduced. =cut @@ -971,13 +997,14 @@ =cut +our $DB; + { - my $db; my $path = cf::localdir . "/database.pst"; sub db_load() { warn "loading database $path\n";#d# remove later - $db = stat $path ? Storable::retrieve $path : { }; + $DB = stat $path ? Storable::retrieve $path : { }; } my $pid; @@ -986,8 +1013,8 @@ warn "saving database $path\n";#d# remove later waitpid $pid, 0 if $pid; if (0 == ($pid = fork)) { - $db->{_meta}{version} = 1; - Storable::nstore $db, "$path~"; + $DB->{_meta}{version} = 1; + Storable::nstore $DB, "$path~"; rename "$path~", $path; cf::_exit 0 if defined $pid; } @@ -1011,15 +1038,15 @@ sub db_get($;$) { @_ >= 2 - ? $db->{$_[0]}{$_[1]} - : ($db->{$_[0]} ||= { }) + ? $DB->{$_[0]}{$_[1]} + : ($DB->{$_[0]} ||= { }) } sub db_put($$;$) { if (@_ >= 3) { - $db->{$_[0]}{$_[1]} = $_[2]; + $DB->{$_[0]}{$_[1]} = $_[2]; } else { - $db->{$_[0]} = $_[1]; + $DB->{$_[0]} = $_[1]; } db_dirty; } @@ -1146,15 +1173,16 @@ unshift @INC, $LIBDIR; $TICK_WATCHER = Event->timer ( - prio => 1, - at => $NEXT_TICK || 1, - cb => sub { + prio => 1, + async => 1, + at => $NEXT_TICK || 1, + cb => sub { cf::server_tick; # one server iteration my $NOW = Event::time; $NEXT_TICK += $TICK; - # if we are delayed by four ticks, skip them all + # if we are delayed by four ticks or more, skip them all $NEXT_TICK = $NOW if $NOW >= $NEXT_TICK + $TICK * 4; $TICK_WATCHER->at ($NEXT_TICK); @@ -1162,5 +1190,12 @@ }, ); +IO::AIO::max_poll_time $TICK * 0.2; + +Event->io (fd => IO::AIO::poll_fileno, + poll => 'r', + prio => 5, + cb => \&IO::AIO::poll_cb); + 1