--- deliantra/server/lib/cf.pm 2007/08/20 22:09:04 1.334 +++ deliantra/server/lib/cf.pm 2007/08/27 01:13:48 1.343 @@ -1151,12 +1151,15 @@ ? @$msg : ($msg->{msgtype}, $msg->{msgid}, %$msg); # TODO: version 1, remove - if (my $cb = $EXTCMD{$type}) { - my @reply = $cb->($pl, @payload); + my @reply; - $pl->ext_reply ($reply, @reply) - if $reply; + if (my $cb = $EXTCMD{$type}) { + @reply = $cb->($pl, @payload); } + + $pl->ext_reply ($reply, @reply) + if $reply; + } else { warn "player " . ($pl->ob->name) . " sent unparseable ext message: <$buf>\n"; } @@ -1507,13 +1510,7 @@ sub ext_reply($$@) { my ($self, $id, @msg) = @_; - if ($self->ns->extcmd == 2) { - $self->send ("ext " . $self->ns->{json_coder}->encode (["reply-$id", @msg])); - } elsif ($self->ns->extcmd == 1) { - #TODO: version 1, remove - unshift @msg, msgtype => "reply", msgid => $id; - $self->send ("ext " . $self->ns->{json_coder}->encode ({@msg})); - } + $self->ns->ext_reply ($id, @msg) } =item $player->ext_msg ($type, @msg) @@ -1952,6 +1949,9 @@ sub do_load_sync { my ($map) = @_; + cf::LOG cf::llevDebug | cf::logBacktrace, "do_load_sync" + if $Coro::current == $Coro::main; + cf::sync_job { $map->load }; } @@ -1959,23 +1959,24 @@ our $MAP_PREFETCHER = undef; sub find_async { - my ($path, $origin) = @_; + my ($path, $origin, $load) = @_; $path = normalise $path, $origin && $origin->{path}; if (my $map = $cf::MAP{$path}) { - return $map if $map->in_memory == cf::MAP_IN_MEMORY; + return $map if !$load || $map->in_memory == cf::MAP_IN_MEMORY; } - undef $MAP_PREFETCH{$path}; + $MAP_PREFETCH{$path} |= $load; + $MAP_PREFETCHER ||= cf::async { while (%MAP_PREFETCH) { - for my $path (keys %MAP_PREFETCH) { - if (my $map = find $path) { - $map->load; + while (my ($k, $v) = each %MAP_PREFETCH) { + if (my $map = find $k) { + $map->load if $v; } - delete $MAP_PREFETCH{$path}; + delete $MAP_PREFETCH{$k}; } } undef $MAP_PREFETCHER; @@ -2559,16 +2560,32 @@ sub cf::client::ext_msg($$@) { my ($self, $type, @msg) = @_; - my $extcmd = $self->extcmd; - - if ($extcmd == 2) { + if ($self->extcmd == 2) { $self->send_packet ("ext " . $self->{json_coder}->encode ([$type, @msg])); - } elsif ($extcmd == 1) { # TODO: remove + } elsif ($self->extcmd == 1) { # TODO: remove push @msg, msgtype => "event_$type"; $self->send_packet ("ext " . $self->{json_coder}->encode ({@msg})); } } +=item $client->ext_reply ($msgid, @msg) + +Sends an ext reply to the client. + +=cut + +sub cf::client::ext_reply($$@) { + my ($self, $id, @msg) = @_; + + if ($self->extcmd == 2) { + $self->send_packet ("ext " . $self->{json_coder}->encode (["reply-$id", @msg])); + } elsif ($self->extcmd == 1) { + #TODO: version 1, remove + unshift @msg, msgtype => "reply", msgid => $id; + $self->send_packet ("ext " . $self->{json_coder}->encode ({@msg})); + } +} + =item $success = $client->query ($flags, "text", \&cb) Queues a query to the client, calling the given callback with @@ -2636,12 +2653,15 @@ ? @$msg : ($msg->{msgtype}, $msg->{msgid}, %$msg); # TODO: version 1, remove - if (my $cb = $EXTICMD{$type}) { - my @reply = $cb->($ns, @payload); + my @reply; - $ns->ext_reply ($reply, @reply) - if $reply; + if (my $cb = $EXTICMD{$type}) { + @reply = $cb->($ns, @payload); } + + $ns->ext_reply ($reply, @reply) + if $reply; + } else { warn "client " . ($ns->pl ? $ns->pl->ob->name : $ns->host) . " sent unparseable exti message: <$buf>\n"; } @@ -2712,7 +2732,7 @@ cf::object contr pay_amount pay_player map x y force_find force_add - insert remove name archname title slaying race + insert remove name archname title slaying race decrease_ob_nr cf::object::player player @@ -2727,7 +2747,8 @@ for ( ["cf::object" => qw(contr pay_amount pay_player map force_find force_add x y - insert remove inv name archname title slaying race)], + insert remove inv name archname title slaying race + decrease_ob_nr)], ["cf::object::player" => qw(player)], ["cf::player" => qw(peaceful)], ["cf::map" => qw(trigger)], @@ -2827,10 +2848,9 @@ or cf::cleanup "$path: version mismatch, cannot proceed."; # patch in the exptable - cf::cede_to_tick; $facedata->{resource}{"res/exp_table"} = { type => FT_RSRC, - data => $enc->encode ([map cf::level_to_min_exp $_, 0 .. cf::settings->max_level]), + data => $enc->encode ([map cf::level_to_min_exp $_, 1 .. cf::settings->max_level]), }; cf::cede_to_tick; @@ -2893,6 +2913,8 @@ }); $data = pack "(w/a*)*", $meta, $info->{data}; + } else { + $data = $info->{data}; } cf::face::set_data $idx, 0, $data, Digest::MD5::md5 $data;