#! perl # additional support for cfplus client use NPC_Dialogue; cf::register_extcmd cfplus_support => sub { my ($pl, $msg) = @_; # $msg->{version} (version => 1) }; my %dialog; # currently active dialogs my $timer = Event->timer (interval => 0.2, parked => 1, cb => sub { while (my ($id, $dialog) = each %dialog) { my (undef, $dx, $dy) = $dialog->{ob}->rangevector ($dialog->{npc}); next if (abs $dx) <= 2 && (abs $dy) <= 2; $dialog->{ob}->contr->ext_reply ($id => msgtype => "error", msg => "out of range"); delete $dialog{$id}; } $_[0]->w->stop unless keys %dialog; }); sub dialog_tell { my ($id, $dialog, $msg) = @_; my $pl = $dialog->{ob}->contr; my ($reply, @kw) = $dialog->tell ($msg); $reply = "..." unless $reply; $pl->ext_reply ($id => msgtype => "reply", msg => $reply, add_topics => \@kw); } # return "interesting" information about the given tile # currently only returns the npc_dialog title when a dialog is possible cf::register_extcmd lookat => sub { my ($pl, $msg) = @_; my ($dx, $dy) = @$msg{qw(dx dy)}; my $near = (abs $dx) <= 2 && (abs $dy) <= 2; my %res; if ($pl->cell_visible ($dx, $dy)) { for my $ob ($pl->ob->map->at ($pl->ob->x + $dx, $pl->ob->y + $dy)) { $res{npc_dialog} = $ob->name if $near && NPC_Dialogue::has_dialogue $ob; } } %res }; cf::register_extcmd npc_dialog_begin => sub { my ($pl, $msg) = @_; my ($id, $dx, $dy) = @$msg{qw(msgid dx dy)}; return unless (abs $dx) <= 2 && (abs $dy) <= 2; return unless $pl->cell_visible ($dx, $dy); for my $npc ($pl->ob->map->at ($pl->ob->x + $dx, $pl->ob->y + $dy)) { if (NPC_Dialogue::has_dialogue $npc) { $dialog{$id} = new NPC_Dialogue ob => $pl->ob, npc => $npc; dialog_tell $id, $dialog{$id}, "hi"; $timer->start; return; } } (msgtype => "error", msg => "nothing to talk to found") }; cf::register_extcmd npc_dialog_tell => sub { my ($pl, $msg) = @_; dialog_tell $msg->{msgid}, $dialog{$msg->{msgid}}, $msg->{msg} if $dialog{$msg->{msgid}}; () }; cf::register_extcmd npc_dialog_end => sub { my ($pl, $msg) = @_; delete $dialog{$msg->{msgid}}; () }; sub on_logout { my ($pl, $host) = @_; delete $dialog{$_} for grep $pl->ob == $dialog{$_}{ob}, keys %dialog; 0 } sub on_unload { while (my ($id, $dialog) = each %dialog) { $dialog->{ob}->contr->ext_reply ($id => msgtype => "error", msg => "npc dialogue module was reloaded"); } %dialog = (); 0 }