ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/Protocol.pm
(Generate patch)

Comparing deliantra/Deliantra-Client/DC/Protocol.pm (file contents):
Revision 1.30 by root, Sun Jun 11 18:41:30 2006 UTC vs.
Revision 1.33 by root, Mon Jun 12 14:06:27 2006 UTC

625 my ($self, $player) = @_; 625 my ($self, $player) = @_;
626 626
627 $::STATWIDS->{weight}->set_text (sprintf "Weight: %.1fkg", $player->{weight} / 1000); 627 $::STATWIDS->{weight}->set_text (sprintf "Weight: %.1fkg", $player->{weight} / 1000);
628} 628}
629 629
630sub logged_in { 630sub update_server_info {
631 my ($self) = @_; 631 my ($self) = @_;
632
633 $self->send_ext_req (cfplus => "version", "1", sub {
634 $self->{cfplus_ext} = $_[0];
635 });
636
637 $self->send_command ("output-sync $::CFG->{output_sync}");
638 $self->send_command ("output-count $::CFG->{output_count}");
639 $self->send_command ("pickup $::CFG->{pickup}");
640 632
641 my @yesno = ("<span foreground='red'>no</span>", "<span foreground='green'>yes</span>"); 633 my @yesno = ("<span foreground='red'>no</span>", "<span foreground='green'>yes</span>");
642 634
643 $::SERVER_INFO->set_markup ( 635 $::SERVER_INFO->set_markup (
644 "server <tt>$self->{host}:$self->{port}</tt>\n" 636 "server <tt>$self->{host}:$self->{port}</tt>\n"
645 . "protocol version <tt>$self->{version}</tt>\n" 637 . "protocol version <tt>$self->{version}</tt>\n"
646 . "minimap support $yesno[$self->{setup}{mapinfocmd} > 0]\n" 638 . "minimap support $yesno[$self->{setup}{mapinfocmd} > 0]\n"
647 . "extended command support $yesno[$self->{setup}{extcmd} > 0]\n" 639 . "extended command support $yesno[$self->{setup}{extcmd} > 0]\n"
648 . "cfplus support $yesno[$self->{cfplus_ext} > 0]\n" 640 . "cfplus support $yesno[$self->{cfplus_ext} > 0]"
641 . ($self->{cfplus_ext} > 0 ? ", version $self->{cfplus_ext}" : "") ."\n"
649 . "map size $self->{mapw}×$self->{maph}\n" 642 . "map size $self->{mapw}×$self->{maph}\n"
650 ); 643 );
651} 644}
652 645
646sub logged_in {
647 my ($self) = @_;
648
649 $self->send_ext_req (cfplus_support => "1", sub {
650 $self->{cfplus_ext} = $_[0];
651 $self->update_server_info;
652 });
653
654 $self->update_server_info;
655
656 $self->send_command ("output-sync $::CFG->{output_sync}");
657 $self->send_command ("output-count $::CFG->{output_count}");
658 $self->send_command ("pickup $::CFG->{pickup}");
659}
660
661sub lookat {
662 my ($self, $x, $y) = @_;
663
664 if ($self->{cfplus_ext}) {
665 $self->send_ext_req (lookat => "$x $y", sub {
666 my %res = split /\x00/, $_[0];
667
668 if (exists $res{npc_dialog}) {
669 # start npc chat dialog
670 $self->{npc_dialog} = new CFClient::NPCDialog::
671 dx => $x,
672 dy => $y,
673 title => "$res{npc_dialog} (NPC)",
674 conn => $self,
675 ;
676 }
677 });
678 }
679
680 $self->send ("lookat $x $y");
681}
682
683sub destroy {
684 my ($self) = @_;
685
686 $self->{npc_dialog}->destroy
687 if $self->{npc_dialog};
688
689 $self->SUPER::destroy;
690}
691
692package CFClient::NPCDialog;
693
694our @ISA = 'CFClient::UI::FancyFrame';
695
696sub new {
697 my $class = shift;
698
699 my $self = $class->SUPER::new (
700 x => 'center',
701 y => 'center',
702 name => "npc_dialog",
703 force_w => $::WIDTH * 0.7,
704 force_h => $::HEIGHT * 0.7,
705 title => "NPC Dialog",
706 kw => { hi => 0, yes => 0, no => 0 },
707 @_,
708 );
709
710 Scalar::Util::weaken (my $this = $self);
711
712 # better use a pane...
713 $self->add (my $hbox = new CFClient::UI::HBox);
714 $hbox->add ($self->{textview} = new CFClient::UI::TextScroller expand => 1);
715
716 $hbox->add (my $vbox = new CFClient::UI::VBox);
717
718 $vbox->add (new CFClient::UI::Label text => "Message Entry:");
719 $vbox->add ($self->{entry} = new CFClient::UI::Entry
720 tooltip => "Enter a message you want to tell the NPC and press <b>return</b>.\n\n"
721 . "Sometimes you have to tell an NPC something you cannot find out during "
722 . "a normal conversation (such as a password). In those cases you have to use "
723 . "this text entry. You can also enter responses manually instead of using the response "
724 . "buttons below.",
725 on_activate => sub {
726 my ($entry, $text) = @_;
727
728 return unless $text =~ /\S/;
729
730 $entry->set_text ("");
731 $this->send ($text);
732 },
733 );
734
735 $vbox->add ($self->{options} = new CFClient::UI::VBox);
736
737 $self->{close_button} = new CFClient::UI::Button
738 text => "Bye (close)",
739 tooltip => "Use this button to end talking to the NPC. This also closes the dialog window.",
740 on_activate => sub { $this->destroy },
741 ;
742
743 $self->update_options;
744
745 $self->{token} = $self->{conn}->ext_token;
746 $self->{conn}->connect_ext ($self->{token} => sub { $this->feed (@_) });
747 $self->{conn}->send ("ext npc_dialog_begin $self->{token} $self->{dx} $self->{dy}");
748
749 $self->{entry}->focus_in;
750
751 $self->{textview}->add_paragraph ([1, 1, 0, 1], "<small>[starting conversation with <b>$self->{title}</b>]</small>\n\n");
752
753 $self->show;
754 $self
755};
756
757sub update_options {
758 my ($self) = @_;
759
760 Scalar::Util::weaken $self;
761
762 $self->{options}->clear;
763 $self->{options}->add ($self->{close_button});
764
765 for my $kw (sort keys %{ $self->{kw} }) {
766 $self->{options}->add (new CFClient::UI::Button
767 text => $kw,
768 on_activate => sub {
769 $self->send ($kw);
770 },
771 );
772 }
773}
774
775sub feed {
776 my ($self, $data) = @_;
777
778 my ($type, $msg) = split / /, $data, 2;
779
780 if ($type eq "msg") {
781 my ($msg, @kw) = split /\x00/, $msg;
782 $self->{kw}{$_} = 1 for @kw;
783
784 $msg = CFClient::UI::Label::escape $msg;
785 my $match = join "|", map "\\b\Q$_\E\\b", sort { (length $b) <=> (length $a) } keys %{ $self->{kw} };
786 $msg =~ s/($match)/<span foreground='#c0c0ff' underline='none'>$1<\/span>/gi; # underline when http-ready, huh.
787
788 $self->{textview}->add_paragraph ([1, 1, 1, 1], "\n$msg");
789 $self->update_options;
790 } else {
791 $self->destroy;
792 }
793
794 1
795}
796
797sub send {
798 my ($self, $msg) = @_;
799
800 $self->{conn}->send ("ext npc_dialog_tell $self->{token} $msg");
801 $self->{textview}->add_paragraph ([1, 1, 0, 1], "\n" . CFClient::UI::Label::escape $msg);
802}
803
804sub destroy {
805 my ($self) = @_;
806
807 #Carp::cluck "debug\n";#d# #todo# enable: destroyx gets called twice because scalar keys {} is 1
808
809 delete $self->{conn}{npc_dialog};
810 $self->{conn}->disconnect_ext ($self->{token});
811
812 $self->SUPER::destroy;
813}
814
6531; 8151;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines