--- deliantra/Deliantra-Client/DC/Protocol.pm 2006/07/30 13:16:44 1.69 +++ deliantra/Deliantra-Client/DC/Protocol.pm 2006/07/30 17:43:27 1.70 @@ -896,9 +896,11 @@ sub logged_in { my ($self) = @_; - $self->send_ext_req (cfplus_support => "1", sub { - $self->{cfplus_ext} = $_[0]; + $self->send_ext_req (cfplus_support => version => 1, sub { + $self->{cfplus_ext} = $_[0]{version}; $self->update_server_info; + + 0 }); $self->update_server_info; @@ -912,15 +914,15 @@ my ($self, $x, $y) = @_; if ($self->{cfplus_ext}) { - $self->send_ext_req (lookat => "$x $y", sub { - my %res = split /\x00/, $_[0]; + $self->send_ext_req (lookat => dx => $x, dy => $y, sub { + my ($msg) = @_; - if (exists $res{npc_dialog}) { + if (exists $msg->{npc_dialog}) { # start npc chat dialog $self->{npc_dialog} = new CFPlus::NPCDialog:: dx => $x, dy => $y, - title => "$res{npc_dialog} (NPC)", + title => "$msg->{npc_dialog} (NPC)", conn => $self, ; } @@ -997,9 +999,10 @@ $self->update_options; - $self->{token} = $self->{conn}->ext_token; - $self->{conn}->connect_ext ($self->{token} => sub { $this->feed (@_) }); - $self->{conn}->send ("ext npc_dialog_begin $self->{token} $self->{dx} $self->{dy}"); + $self->{id} = $self->{conn}->send_ext_req ( + npc_dialog_begin => dx => $self->{dx}, dy => $self->{dy}, + sub { $this && $this->feed (@_) } + ); $self->{entry}->grab_focus; @@ -1032,23 +1035,18 @@ } sub feed { - my ($self, $data) = @_; + my ($self, $msg) = @_; Scalar::Util::weaken $self; - my ($type, $msg) = split / /, $data, 2; - - if ($type eq "msg") { - my ($msg, @kw) = split /\x00/, $msg; + if ($msg->{msgtype} eq "reply") { + $self->{kw}{$_} = 1 for @{$msg->{add_topics} || []}; + $self->{kw}{$_} = 0 for @{$msg->{del_topics} || []}; - utf8::decode $_ for ($msg, @kw); - - $self->{kw}{$_} = 1 for @kw; - - $msg = "\n" . CFPlus::UI::asxml $msg; + my $text = "\n" . CFPlus::asxml $msg->{msg}; my $match = join "|", map "\\b\Q$_\E\\b", sort { (length $b) <=> (length $a) } keys %{ $self->{kw} }; my @link; - $msg =~ s{ + $text =~ s{ ($match) }{ my $kw = $1; @@ -1066,7 +1064,7 @@ chr 0xfffc }giex; - $self->{textview}->add_paragraph ({ markup => $msg, widget => \@link }); + $self->{textview}->add_paragraph ({ markup => $text, widget => \@link }); $self->{textview}->scroll_to_bottom; $self->update_options; } else { @@ -1082,8 +1080,7 @@ $self->{textview}->add_paragraph ({ markup => "\n" . CFPlus::asxml $msg }); $self->{textview}->scroll_to_bottom; - utf8::encode $msg; - $self->{conn}->send ("ext npc_dialog_tell $self->{token} $msg"); + $self->{conn}->send_ext_msg (npc_dialog_tell => msgid => $self->{id}, msg => $msg); } sub destroy { @@ -1091,9 +1088,11 @@ #Carp::cluck "debug\n";#d# #todo# enable: destroy gets called twice because scalar keys {} is 1 - $self->{conn}->send ("ext npc_dialog_end $self->{token}") if $self->{token}; - delete $self->{conn}{npc_dialog}; - $self->{conn}->disconnect_ext ($self->{token}); + if ($self->{conn}) { + $self->{conn}->send_ext_msg (npc_dialog_end => msgid => $self->{id}) if $self->{id}; + delete $self->{conn}{npc_dialog}; + $self->{conn}->disconnect_ext ($self->{id}); + } $self->SUPER::destroy; }