Code: Select all
# =======================
# reactOnNPC v.2.0.0
# =======================
# This plugin is licensed under the GNU GPL
# Copyright 2006 by hakore
#
# http://forums.openkore.com/viewtopic.php?f=34&t=198
package reactOnNPC;
use strict;
use Plugins;
use Globals;
use Utils;
use Commands;
use Log qw(message debug);
Plugins::register('reactOnNPC', "react on NPC messages", \&Unload);
my $hooks = (
   Plugins::addHooks(
            ['packet/npc_talk', \&onNPCTalk, undef],
            ['packet/npc_talk_close', \&onNPCAction, undef],
            ['packet/npc_talk_continue', \&onNPCAction, undef],
            ['packet/npc_talk_number', \&onNPCAction, undef],
            ['packet/npc_talk_responses', \&onNPCAction, undef],
            ['packet/npc_talk_text', \&onNPCAction, undef],
            ['mainLoop_pre', \&onCheckCmd, undef]
   )
);
my %reactOnNPC;
my @reactOnNPC;
sub Unload
{
   Plugins::delHooks($hooks);
};
sub onNPCTalk
{
   my (undef, $args) = @_;
   my $ID = unpack("V", substr($args->{RAW_MSG}, 4, 4));
   my $msg = unpack("Z*", substr($args->{RAW_MSG}, 8));
   $msg = I18N::bytesToString($msg);
   if (!defined %reactOnNPC || $reactOnNPC{action})
   {
      undef %reactOnNPC if defined %reactOnNPC;
      $reactOnNPC{index} = 0;
      $reactOnNPC{ID} = $ID;
      $reactOnNPC{msg}[$reactOnNPC{index}] = $msg;
   }
   else
   {
      $reactOnNPC{index}++;
      $reactOnNPC{msg}[$reactOnNPC{index}] = $msg;
   }
   debug "[reactOnNPC] NPC message saved ($reactOnNPC{index}): \"$msg\".\n", "reactOnNPC";
}
sub onGuildChat
{
   my (undef, $args) = @_;
   my ($chatMsgUser, $chatMsg); # Type: String
   my $msg; # Type: String
   $msg = I18N::bytesToString($args->{message});
   if (($chatMsgUser, $chatMsg) = $msg =~ /(.*?) : (.*)/) {
      $chatMsgUser =~ s/ $//;
      stripLanguageCode(\$chatMsg);
      $msg = "$chatMsgUser : $chatMsg";
   }
   if (!defined %reactOnGuildChat || $reactOnGuildChat{action})
   {
      undef %reactOnGuildChat if defined %reactOnGuildChat;
      $reactOnGuildChat{index} = 0;
      $reactOnGuildChat{msg}[$reactOnGuildChat{index}] = $msg;
   }
   else
   {
      if ($reactOnGuildChat{index} < 200)
      {
         $reactOnGuildChat{index}++;
         $reactOnGuildChat{msg}[$reactOnGuildChat{index}] = $msg;
      }
      else
      {
         shift @{$reactOnGuildChat{msg}};
         push @{$reactOnGuildChat{msg}}, $msg;
         debug "[reactOnNPC] Guild message limit reached. Messages shifted up.\n", "reactOnNPC";
         return;
      }
   }
   debug "[reactOnNPC] Guild message saved ($reactOnGuildChat{index}): \"$msg\".\n", "reactOnNPC";
}
sub onNPCAction
{
   my $type = substr(shift, 16);
   $reactOnNPC{action} = $type;
   debug "[reactOnNPC] onNPCAction type is: $type.\n", "reactOnNPC";
   if ($type eq 'responses')
   {
      my $args = shift;
      my $msg = unpack("Z*", substr($args->{RAW_MSG}, 8));
      $msg = I18N::bytesToString($msg);
      undef @{$reactOnNPC{responses}};
      my @responses = split /:/, $msg;
      foreach (@responses) {
         push @{$reactOnNPC{responses}}, $_ if $_ ne "";
      }
   }
   
   my $i = 0;
   while (exists $config{"reactOnNPC_$i"}) {
      if (
         !$config{"reactOnNPC_$i"}
         || !main::checkSelfCondition("reactOnNPC_$i")
         || ($config{"reactOnNPC_${i}_type"} && $config{"reactOnNPC_${i}_type"} ne $type)
      ) {
         debug "[reactOnNPC] Conditions for reactOnNPC_$i not met.\n", "reactOnNPC";
         $i++;
         next;
      }
      my $j = 0;
      my $ok = 1;
      while (exists $config{"reactOnNPC_${i}_msg_$j"})
      {
         my $msg;
         if (exists $reactOnNPC{msg}[$j])
         {
            $msg = $reactOnNPC{msg}[$j];
            # Remove RO color codes
            $msg =~ s/\^[a-fA-F0-9]{6}//g unless ($config{"reactOnNPC_${i}_useColors"});
         }
         if (!defined $msg || !match($j, $msg, $config{"reactOnNPC_${i}_msg_$j"}))
         {
            debug "[reactOnNPC] One or more lines doesn't match for \"reactOnNPC_$i\" ($j).\n", "reactOnNPC";
            $ok = 0;
            last;
         }
         $j++;
      }
      if ($ok)
      {
         my $cmd = $config{"reactOnNPC_$i"};
         $cmd =~ s/#(\d+)~(\d+)/$reactOnNPC{match}[$1][$2]/g;
         my $kws = 'eval|resp';
         while (my ($kw, $expr) = $cmd =~ /\@($kws)\(((?:(?!(?<!\@)\@$kws\().)+?)(?<!\@)\)/)
         {
            my $eval;
            my $eval_expr = $expr;
            $eval_expr =~ s/\@(?=[\@)])//g;
            if ($kw eq 'eval')
            {
               $eval = eval $eval_expr;
            }
            elsif ($kw eq 'resp')
            {
               $i = 0;
               foreach (@{$reactOnNPC{responses}}) {
                  if (match(undef, $_, $eval_expr))
                  {
                     last;
                  }
                  $i++;
               }
               $eval = $i;
            }
            $expr = quotemeta $expr;
            $cmd =~ s/\@$kw\($expr\)/$eval/g;
         }
         if (my $delay = $config{"reactOnNPC_${i}_delay"})
         {
            my $params = {
               cmd => $cmd,
               time => time,
               timeout => $delay
            };
            debug "[reactOnNPC] React to NPC with delay. Execute command \"$cmd\" after $delay seconds.\n", "success";
            push @reactOnNPC, $params;
         }
         else
         {
            message "[reactOnNPC] Reacting to NPC. Executing command \"$cmd\".\n", "success";
            Commands::run($cmd);
         }
         last;
      }
      $i++;
   }
   undef %reactOnNPC if $type eq 'close';
}
sub onCheckCmd
{
   for (my $i = 0; $i < @reactOnNPC; $i++)
   {
      my $args = $reactOnNPC[$i];
      if (timeOut($args->{time}, $args->{timeout}))
      {
         message "[reactOnNPC] Reacting to NPC. Executing command \"".$args->{cmd}."\".\n", "success";
         Commands::run($args->{cmd});
      }
   }
}
sub match
{
   my ($line, $subject, $pattern) = @_;
   
   debug "[reactOnNPC] Matching \"$subject\" to \"$pattern\" ($line)... ", "reactOnNPC";
   if (my ($re, $ci) = $pattern =~ /^\/(.+?)\/(i?)$/)
   {
      if (($ci && $subject =~ /$re/i) || (!$ci && $subject =~ /$re/))
      {
         if (defined $line)
         {
            no strict;
            foreach my $index (1..$#-)
            {
               $reactOnNPC{match}[$line][$index] = ${$index};
            }
         }
         debug "regexp ok.\n", "reactOnNPC";
         return 1;
      }
   }
   elsif ($subject eq $pattern)
   {
      debug "ok.\n", "reactOnNPC";
      return 1;
   }
   debug "doesn't match.\n", "reactOnNPC";
}
return 1;but im receiving some error upon starting kore.
The error message 9s:
Plugin contains syntax errors:
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 75
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 75
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 77
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 77
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 78
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 79
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 79
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 83
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 85
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 86
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 86
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 90
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 91
Global symbol "%reactOnGuildChat" requires explicit package name at plugins/Macro/reactOnNpc.pl line 96
BEGIN not safe after errors--compilation aborted at plugins/Macro/ReactOnNpc.pl line 226

