--- deliantra/server/lib/cf.pm 2012/11/18 08:34:23 1.606 +++ deliantra/server/lib/cf.pm 2012/11/21 12:47:09 1.612 @@ -599,6 +599,8 @@ while () { next_job: + Coro::cede; + my $avail = cf::till_tick; for (0 .. $#SLOT_QUEUE) { @@ -606,7 +608,6 @@ $busy = 0; my $job = splice @SLOT_QUEUE, $_, 1, (); $job->[2]->send; - Coro::cede; goto next_job; } else { $SLOT_QUEUE[$_][0] *= $SLOT_DECAY; @@ -614,8 +615,7 @@ } if (@SLOT_QUEUE) { - # we do not use wait_for_tick() as it returns immediately when tick is inactive - $WAIT_FOR_TICK->wait; + wait_for_tick; } else { $busy = 0; Coro::schedule; @@ -3044,20 +3044,6 @@ =over 4 -=item $client->send_drawinfo ($text, $flags) - -Sends a drawinfo packet to the client. Circumvents output buffering so -should not be used under normal circumstances. - -=cut - -sub cf::client::send_drawinfo { - my ($self, $text, $flags) = @_; - - utf8::encode $text; - $self->send_packet (sprintf "msg %d 0 %s", $flags || cf::NDI_BLACK, $text); -} - =item $client->send_big_packet ($pkt) Like C, but tries to compress large packets, and fragments @@ -3292,6 +3278,44 @@ 1 } +=item $client->update_command_faces + +=cut + +our %COMMAND_FACE; + +sub cf::client::update_command_faces { + my ($self) = @_; + + my @faces = grep $_, + $COMMAND_FACE{standard}, + $COMMAND_FACE{emote}, + $COMMAND_FACE{skill}, + $self->pl->ob->flag (cf::FLAG_WIZ) ? $COMMAND_FACE{dm} : (), + ; + + $self->send_face ($_) + for @faces; + $self->flush_fx; + + $self->ext_msg (command_list => @faces); +} + +=item cf::client::set_command_face $type, $commands + +=cut + +sub cf::client::set_command_face { + my ($type, $list) = @_; + + my $idx = &cf::face::set ( #d# ugly forward reference + "command_list/$type" => cf::FT_RSRC, + JSON::XS->new->utf8->encode ([ sort @$list ]) + ); + + $COMMAND_FACE{$type} = $idx; +} + cf::client->attach ( on_connect => sub { my ($ns) = @_; @@ -3765,6 +3789,20 @@ JSON::XS->new->utf8->canonical->encode ( [map [cf::spellpathnames ($_)], 0 .. NRSPELLPATHS - 1] ); + + # command completion + my @commands; + + for (0..cf::arch::skillvec_size - 1) { + my $skill = cf::arch::skillvec $_; + my $name = $skill->name; + my $flags = cf::skill_flags $skill->subtype; + + push @commands, "ready_skill $name" if $flags & (SF_COMBAT | SF_RANGED | SF_GRACE); + push @commands, "use_skill $name" if $flags & (SF_USE | SF_AUTARK | SF_GRACE); + } + + cf::client::set_command_face skill => \@commands; } sub reload_treasures {