reactOnNpc.pl . trying to put guild chat in it. error

Other plugins for extending OpenKore's functionality. This forum is only for posting new plugins and commenting on existing plugins. For support, use the Support forum.

Moderator: Moderators

Message
Author
nicolas0349
Human
Human
Posts: 25
Joined: 14 Feb 2011, 13:34
Noob?: Yes

reactOnNpc.pl . trying to put guild chat in it. error

#1 Post by nicolas0349 »

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

EternalHarvest
Developers
Developers
Posts: 1798
Joined: 05 Dec 2008, 05:42
Noob?: Yes

Re: reactOnNpc.pl . trying to put guild chat in it. error

#2 Post by EternalHarvest »

http://perldoc.perl.org/functions/my.html

Also, your sub onNPCTalk is never called, add a corresponding hook for it.

nicolas0349
Human
Human
Posts: 25
Joined: 14 Feb 2011, 13:34
Noob?: Yes

Re: reactOnNpc.pl . trying to put guild chat in it. error

#3 Post by nicolas0349 »

thank you sir for the reply.

but im not really good in perl.

could you explain more about adding a corresponding hook for in sub onNPCTalk?

Post Reply