… | |
… | |
60 | |
60 | |
61 | my ($token, $dx, $dy) = split / /, $data; |
61 | my ($token, $dx, $dy) = split / /, $data; |
62 | |
62 | |
63 | my %res; |
63 | my %res; |
64 | |
64 | |
65 | my $near = abs ($dx) <= 2 && abs ($dy) <= 2; |
65 | my $near = (abs $dx) <= 2 && (abs $dy) <= 2; |
66 | |
66 | |
67 | if ($pl->cell_visible ($dx, $dy)) { |
67 | if ($pl->cell_visible ($dx, $dy)) { |
68 | for my $ob ($pl->ob->map->at ($pl->ob->x + $dx, $pl->ob->y + $dy)) { |
68 | for my $ob ($pl->ob->map->at ($pl->ob->x + $dx, $pl->ob->y + $dy)) { |
69 | $res{npc_dialog} = $ob->name |
69 | $res{npc_dialog} = $ob->name |
70 | if $near && $ob->message =~ /^\@match /; |
70 | if $near && $ob->message =~ /^\@match /; |
… | |
… | |
77 | cf::register_extcmd npc_dialog_begin => sub { |
77 | cf::register_extcmd npc_dialog_begin => sub { |
78 | my ($pl, $data) = @_; |
78 | my ($pl, $data) = @_; |
79 | |
79 | |
80 | my ($token, $dx, $dy) = split / /, $data; |
80 | my ($token, $dx, $dy) = split / /, $data; |
81 | |
81 | |
82 | return unless abs ($dx) <= 2 && abs ($dy) <= 2; |
82 | return unless (abs $dx) <= 2 && (abs $dy) <= 2; |
83 | return unless $pl->cell_visible ($dx, $dy); |
83 | return unless $pl->cell_visible ($dx, $dy); |
84 | |
84 | |
85 | for my $npc ($pl->ob->map->at ($pl->ob->x + $dx, $pl->ob->y + $dy)) { |
85 | for my $npc ($pl->ob->map->at ($pl->ob->x + $dx, $pl->ob->y + $dy)) { |
86 | if (my @match = parse_message $npc->get_message) { |
86 | if (my @match = parse_message $npc->get_message) { |
87 | $dialog{$token} = { |
87 | $dialog{$token} = { |
… | |
… | |
112 | my ($pl, $token) = @_; |
112 | my ($pl, $token) = @_; |
113 | |
113 | |
114 | delete $dialog{$token}; |
114 | delete $dialog{$token}; |
115 | }; |
115 | }; |
116 | |
116 | |
|
|
117 | sub on_clock { |
|
|
118 | return 0 unless %dialog; |
|
|
119 | |
|
|
120 | while (my ($token, $dialog) = each %dialog) { |
|
|
121 | if (my $pl = cf::player::find $dialog->{name}) { |
|
|
122 | my (undef, $dx, $dy) = $pl->ob->rangevector ($dialog->{npc}); |
|
|
123 | next if (abs $dx) <= 2 && (abs $dy) <= 2; |
|
|
124 | |
|
|
125 | $pl->send ("ext $token out_of_range"); |
|
|
126 | } |
|
|
127 | delete $dialog{$token}; |
|
|
128 | } |
|
|
129 | |
|
|
130 | 0 |
|
|
131 | } |
|
|
132 | |