Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: macro.pl
- ===================================================================
- --- macro.pl (revision 8992)
- +++ macro.pl (working copy)
- @@ -21,10 +21,17 @@
- use Translation qw/T TF/;
- use lib $Plugins::current_plugin_folder;
- use Macro::Data;
- +use Macro::Utilities qw(callMacro);
- +use Macro::Plugin;
- +use Macro::Lists;
- +use Macro::Lists::Automacro;
- +use Macro::Lists::Condition;
- +use Macro::Lists::Macro;
- +use Macro::Parser;
- +use Macro::FileParser;
- use Macro::Script;
- -use Macro::Parser qw(parseMacroFile);
- -use Macro::Automacro qw(automacroCheck consoleCheckWrapper releaseAM);
- -use Macro::Utilities qw(callMacro);
- +use Macro::Automacro;
- +use Macro::Macro;
- #########
- # startup
- @@ -38,8 +45,7 @@
- my $chooks = Commands::register(
- ['macro', "Macro plugin", \&commandHandler]
- );
- -my $autohooks;
- -my $loghook;
- +
- my $cfID;
- my $macro_file;
- @@ -48,29 +54,11 @@
- my (undef, $args) = @_;
- if ($args->{key} eq 'macro_file') {
- Settings::removeFile($cfID);
- - $cfID = Settings::addControlFile($args->{val}, loader => [ \&parseAndHook, \%macro]);
- + $cfID = Settings::addControlFile($args->{val}, loader => [ \&parseAndHook]);
- Settings::loadByHandle($cfID);
- }
- }
- -# onstart3
- -sub onstart3 {
- - &checkConfig;
- - $cfID = Settings::addControlFile($macro_file,loader => [\&parseAndHook,\%macro], mustExist => 0);
- - Settings::loadByHandle($cfID);
- -
- - if (
- - $interface->isa ('Interface::Wx')
- - && $interface->{viewMenu}
- - && $interface->can ('addMenu')
- - && $interface->can ('openWindow')
- - ) {
- - $interface->addMenu ($interface->{viewMenu}, T('Macro debugger'), sub {
- - $interface->openWindow (T('Macro'), 'Macro::Wx::Debugger', 1);
- - }, T('Interactive debugger for macro plugin'));
- - }
- -}
- -
- # onReload
- sub Reload {
- message "macro plugin reloading, ", 'success';
- @@ -89,59 +77,28 @@
- sub cleanup {
- message "cleaning up\n", 'success';
- Settings::removeFile($cfID) if defined $cfID;
- - Log::delHook($loghook);
- - foreach (@{$autohooks}) {Plugins::delHook($_)}
- - undef $autohooks;
- - undef $queue;
- - undef %macro;
- - undef %automacro;
- - undef %varStack
- -}
- -
- -# onFile(Re)load
- -sub parseAndHook {
- - my $file = shift;
- - if (parseMacroFile($file, 0)) {
- - Plugins::callHook ('macro/parseAndHook');
- - &hookOnDemand; return 1
- + if (defined $macroPlugin) {
- + $macroPlugin->cleanHooks();
- }
- - error "error loading $file.\n";
- - return 0
- + undef $macroPlugin;
- }
- -# only adds hooks that are needed
- -sub hookOnDemand {
- - foreach (@{$autohooks}) {Plugins::delHook($_)}
- - undef $autohooks;
- - Log::delHook($loghook) if defined $loghook;
- - my %load = ('AI_pre' => 1);
- - my $hookToLog;
- - foreach my $a (keys %automacro) {
- - next if $automacro{$a}->{disabled};
- - if (defined $automacro{$a}->{spell}) {
- - if (!defined $load{'is_casting'}) {$load{'is_casting'} = 1}
- - if (!defined $load{'packet_skilluse'}) {$load{'packet_skilluse'} = 1}
- - }
- - if (defined $automacro{$a}->{areaSpell} && !defined $load{'packet_areaSpell'}) {$load{'packet_areaSpell'} = 1}
- - if (defined $automacro{$a}->{pm} && !defined $load{'packet_privMsg'}) {$load{'packet_privMsg'} = 1}
- - if (defined $automacro{$a}->{pubm} && !defined $load{'packet_pubMsg'}) {$load{'packet_pubMsg'} = 1}
- - if (defined $automacro{$a}->{system} && !defined $load{'packet_sysMsg'}) {$load{'packet_sysMsg'} = 1;}
- - if (defined $automacro{$a}->{party} && !defined $load{'packet_partyMsg'}) {$load{'packet_partyMsg'} = 1}
- - if (defined $automacro{$a}->{guild} && !defined $load{'packet_guildMsg'}) {$load{'packet_guildMsg'} = 1}
- - if (defined $automacro{$a}->{mapchange} && !defined $load{'packet_mapChange'}) {$load{'packet_mapChange'} = 1}
- - if (defined $automacro{$a}->{hook} && !defined $load{$automacro{$a}->{hook}}) {$load{$automacro{$a}->{hook}} = 1}
- - if (defined $automacro{$a}->{console} && !defined $hookToLog) {$hookToLog = 1}
- - if (defined $automacro{$a}->{playerguild} && !defined $load{'player'}) {$load{'player'} = 1}
- - if (defined $automacro{$a}->{playerguild} && !defined $load{'charNameUpdate'}) {$load{'charNameUpdate'} = 1}
- +# onstart3
- +sub onstart3 {
- + &checkConfig;
- + $cfID = Settings::addControlFile($macro_file,loader => [\&parseAndHook], mustExist => 0);
- + Settings::loadByHandle($cfID);
- +
- + if (
- + $interface->isa ('Interface::Wx')
- + && $interface->{viewMenu}
- + && $interface->can ('addMenu')
- + && $interface->can ('openWindow')
- + ) {
- + $interface->addMenu ($interface->{viewMenu}, T('Macro debugger'), sub {
- + $interface->openWindow (T('Macro'), 'Macro::Wx::Debugger', 1);
- + }, T('Interactive debugger for macro plugin'));
- }
- - foreach my $l (keys %load) {
- - message "[macro] hooking to $l\n";
- - push(@{$autohooks}, Plugins::addHook($l, \&automacroCheck))
- - }
- - if ($hookToLog) {
- - message "[macro] hooking to log\n";
- - $loghook = Log::addHook(\&consoleCheckWrapper)
- - }
- }
- # checks macro configuration
- @@ -154,9 +111,30 @@
- configModify('macro_orphans', 'terminate')
- }
- - return 1
- + return 1;
- }
- +# onFile(Re)load
- +sub parseAndHook {
- + my $file = shift;
- + if (defined $macroPlugin) {
- + $macroPlugin->reload();
- + } else {
- + $macroPlugin = new Macro::Plugin();
- + }
- +
- +
- + if (parseMacroFile($file, 0)) {
- + Plugins::callHook ('macro/parseAndHook');
- +
- + $macroPlugin->hookOnDemand();
- +
- + return 1;
- + }
- + error "error loading $file.\n";
- + return 0
- +}
- +
- # macro command handler
- sub commandHandler {
- ### no parameter given
- @@ -176,61 +154,48 @@
- ### parameter: list
- if ($arg eq 'list') {
- message(sprintf("The following macros are available:\n%smacros%s\n","-"x10,"-"x9), "list");
- - foreach my $m (keys %macro) {message "$m\n" unless $m =~ /^tempMacro/}
- + foreach my $macro (@{$macroPlugin->{macro}->getItems()}) {message $macro->{name}."\n"}
- message(sprintf("%sautomacros%s\n", "-"x8, "-"x7), "list");
- - foreach my $a (sort {
- - ($automacro{$a}->{priority} or 0) <=> ($automacro{$b}->{priority} or 0)
- - } keys %automacro) {message "$a\n"}
- + foreach my $automacro (@{$macroPlugin->{automacro}->getItems()}) {message $automacro->{name}."\n"}
- message(sprintf("%sPerl Sub%s\n", "-"x9, "-"x8), "list");
- foreach my $s (@perl_name) {message "$s\n"}
- message(sprintf("%s\n","-"x25), "list");
- ### parameter: status
- } elsif ($arg eq 'status') {
- - if (defined $queue) {
- - message(sprintf("macro %s\n", $queue->name), "list");
- - message(sprintf("status: %s\n", $queue->registered?"running":"waiting"));
- - my %tmp = $queue->timeout;
- + if ($macroPlugin->isOnQueue()) {
- + message(sprintf("macro %s\n", $macroPlugin->{queue}->name), "list");
- + message(sprintf("status: %s\n", $macroPlugin->{queue}->registered?"running":"waiting"));
- + my %tmp = $macroPlugin->{queue}->timeout;
- message(sprintf("delay: %ds\n", $tmp{timeout}));
- - message(sprintf("line: %d\n", $queue->line));
- - message(sprintf("override AI: %s\n", $queue->overrideAI?"yes":"no"));
- - message(sprintf("paused: %s\n", $onHold?"yes":"no"));
- - message(sprintf("finished: %s\n", $queue->finished?"yes":"no"));
- + message(sprintf("line: %d\n", $macroPlugin->{queue}->line));
- + message(sprintf("override AI: %s\n", $macroPlugin->{queue}->overrideAI?"yes":"no"));
- + message(sprintf("paused: %s\n", $macroPlugin->isPaused()?"yes":"no"));
- + message(sprintf("finished: %s\n", $macroPlugin->{queue}->finished?"yes":"no"));
- } else {
- message "There's no macro currently running.\n"
- }
- ### parameter: stop
- } elsif ($arg eq 'stop') {
- - undef $queue;
- - message "macro queue cleared.\n"
- + $macroPlugin->clearQueue();
- ### parameter: pause
- } elsif ($arg eq 'pause') {
- - if (defined $queue) {
- - $onHold = 1;
- - message "macro ".$queue->name." paused.\n"
- - } else {
- - warning "There's no macro currently running.\n"
- - }
- + $macroPlugin->pauseMacro();
- ### parameter: resume
- } elsif ($arg eq 'resume') {
- - if (defined $queue) {
- - $onHold = 0;
- - message "macro ".$queue->name." resumed.\n"
- - } else {
- - warning "There's no macro currently running.\n"
- - }
- + $macroPlugin->resumeMacro();
- ### parameter: reset
- - } elsif ($arg eq 'reset') {
- - if (!defined $params[0]) {
- - foreach my $am (keys %automacro) {undef $automacro{$am}->{disabled}}
- - message "automacro runonce list cleared.\n";
- - return
- - }
- - for my $reset (@params) {
- - my $ret = releaseAM($reset);
- - if ($ret == 1) {message "automacro $reset reenabled.\n"}
- - elsif ($ret == 0) {warning "automacro $reset wasn't disabled.\n"}
- - else {error "automacro $reset not found.\n"}
- - }
- + #} elsif ($arg eq 'reset') {
- + # if (!defined $params[0]) {
- + # foreach my $am (keys %automacro) {undef $automacro{$am}->{disabled}}
- + # message "automacro runonce list cleared.\n";
- + # return
- + # }
- + # for my $reset (@params) {
- + # my $ret = releaseAM($reset);
- + # if ($ret == 1) {message "automacro $reset reenabled.\n"}
- + ## elsif ($ret == 0) {warning "automacro $reset wasn't disabled.\n"}
- + # else {error "automacro $reset not found.\n"}
- + # }
- ### parameter: version
- } elsif ($arg eq 'version') {
- message "macro plugin version $Version\n", "list";
- @@ -243,12 +208,12 @@
- ### debug
- } elsif ($arg eq 'varstack') {
- message "Varstack List\n", "menu";
- - foreach my $v (keys %varStack) {
- - message "\$varStack{$v} = [".$varStack{$v}."]\n", "menu"
- + foreach my $v (keys %{$macroPlugin->{macroVars}}) {
- + message "\$macroPlugin->{macroVars}{$v} = [".$macroPlugin->{macroVars}{$v}."]\n", "menu"
- }
- ### parameter: probably a macro
- } else {
- - if (defined $queue) {
- + if ($macroPlugin->isOnQueue()) {
- warning "a macro is already running. Wait until the macro has finished or call 'macro stop'\n";
- return
- }
- @@ -263,24 +228,23 @@
- if ($params[$idx] =~ /^--/) {$cparms = substr(join(' ', map { "$_" } @params), 2); last}
- }
- - delete $varStack{$_} for grep /^\.param\d+$/, keys %varStack;
- + $macroPlugin->deleteVar($_) for grep /^\.param\d+$/, keys %{$macroPlugin->{macroVars}};
- if ($cparms) {
- #parse macro parameters
- my @new_params = $cparms =~ /"[^"]+"|\S+/g;
- foreach my $p (1..@new_params) {
- - $varStack{".param".$p} = $new_params[$p-1];
- - $varStack{".param".$p} = substr($varStack{".param".$p}, 1, -1) if ($varStack{".param".$p} =~ /^".*"$/); # remove quotes
- + $macroPlugin->setVarValue(".param".$p,$new_params[$p-1]);
- + $macroPlugin->setVarValue(".param".$p,substr($macroPlugin->getVar(".param".$p), 1, -1)) if ($macroPlugin->getVar(".param".$p) =~ /^".*"$/);
- }
- }
- - $queue = new Macro::Script($arg, $repeat);
- - if (!defined $queue) {error "macro $arg not found or error in queue\n"}
- + $macroPlugin->{queue} = new Macro::Script($arg, $repeat);
- + if (!defined $macroPlugin->{queue}) {error "macro $arg not found or error in queue\n"}
- else {
- - $onHold = 0;
- - if ($oAI) {$queue->overrideAI(1)}
- - if ($exclusive) {$queue->interruptible(0)}
- - if (defined $mdelay) {$queue->setMacro_delay($mdelay)}
- - if (defined $orphan) {$queue->orphan($orphan)}
- + if ($oAI) {$macroPlugin->{queue}->overrideAI(1)}
- + if ($exclusive) {$macroPlugin->{queue}->interruptible(0)}
- + if (defined $mdelay) {$macroPlugin->{queue}->setMacro_delay($mdelay)}
- + if (defined $orphan) {$macroPlugin->{queue}->orphan($orphan)}
- }
- }
- }
- Index: Macro/Automacro.pm
- ===================================================================
- --- Macro/Automacro.pm (revision 8992)
- +++ Macro/Automacro.pm (working copy)
- @@ -1,827 +1,83 @@
- -# $Id: Automacro.pm r6760 2009-07-06 02:23:00Z ezza $
- package Macro::Automacro;
- use strict;
- -require Exporter;
- -our @ISA = qw(Exporter);
- -our @EXPORT_OK = qw(releaseAM lockAM automacroCheck consoleCheckWrapper);
- -our @EXPORT = qw(checkLocalTime checkVar checkVarVar checkLoc checkPersonGuild checkLevel checkLevel checkClass
- - checkPercent checkStatus checkItem checkPerson checkCond checkCast checkGround checkSpellsID
- - checkEquip checkMsg checkMonster checkAggressives checkConsole checkMapChange);
- -
- -use Misc qw(whenGroundStatus getSpellName getActorName);
- -use Utils;
- -use Globals;
- -use Skill;
- -use AI;
- -use Log qw(message error warning);
- -use Macro::Data;
- -use Macro::Utilities qw(between cmpr match getArgs refreshGlobal
- - getPlayerID getSoldOut getInventoryAmount getCartAmount getShopAmount
- - getStorageAmount callMacro sameParty);
- -
- -our ($rev) = q$Revision: 6760 $ =~ /(\d+)/;
- -
- -# check for variable #######################################
- -sub checkVar {
- - my ($var, $cond, $val) = getArgs($_[0]);
- -
- - $var = "#$var" if $_[1] eq 'varvar';
- -
- - if ($cond eq "unset") {return exists $varStack{$var}?0:1}
- -
- - # TODO: seems like this is not needed, because automacroCheck does it
- - # and refreshGlobal ignores args
- - refreshGlobal($var);
- -
- - if (exists $varStack{$var}) {return cmpr($varStack{$var}, $cond, $val)}
- - else {return $cond eq "!="}
- +sub new {
- + my ($class, $name, $conditions, $parameters) = @_;
- + my $self = {
- + name => $name,
- + listIndex => -1
- + };
- + bless $self, $class;
- + $self->setParameters($parameters);
- + $self->createConditionList($conditions);
- + return $self;
- }
- -# check for ground statuses
- -sub checkGround {
- - my $arg = $_[0];
- - my $not = ($arg =~ s/^not +//)?1:0;
- -
- - if (whenGroundStatus(calcPosition($char), $arg)) {return $not?0:1}
- - return $not?1:0
- -}
- -
- -# checks for location ######################################
- -# parameter: map [x1 y1 [x2 y2]]
- -# note: when looking in the default direction (north)
- -# x1 < x2 and y1 > y2 where (x1|y1)=(upper left) and
- -# (x2|y2)=(lower right)
- -# uses: calcPosition (Utils?)
- -sub checkLoc {
- - my $arg = $_[0];
- - if ($arg =~ /,/) {
- - my @locs = split(/\s*,\s*/, $arg);
- - foreach my $l (@locs) {return 1 if checkLoc($l)}
- - return 0
- +sub isActive {
- + my ($self) = @_;
- + if (exists $self->{disabled}) {
- + return 0 if ($self->{disabled});
- }
- - my $not = ($arg =~ s/^not +//)?1:0;
- - my ($map, $x1, $y1, $x2, $y2) = split(/ /, $arg);
- - if ($map =~ /^\s*\$/) {
- - my ($var) = $map =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- - return 0 unless defined $var;
- - return 0 unless exists $varStack{$var};
- - $map = $varStack{$var}
- - }
- - if ($map eq $field->baseName || $map eq $field->name) {
- - if ($x1 && $y1) {
- - my $pos = calcPosition($char);
- - return 0 unless defined $pos->{x} && defined $pos->{y};
- - if ($x2 && $y2) {
- - if (between($x1, $pos->{x}, $x2) && between($y2, $pos->{y}, $y1)) {
- - return $not?0:1
- - }
- - return $not?1:0
- - }
- - if ($x1 == $pos->{x} && $y1 == $pos->{y}) {
- - return $not?0:1
- - }
- - return $not?1:0
- - }
- - return $not?0:1
- - }
- - return $not?1:0
- + return 1;
- }
- -# check for pc local time
- -sub checkLocalTime {
- - my ($cond, $val) = $_[0] =~ /^\s*([<>=!]+)\s+(\$[a-zA-Z][a-zA-Z\d]*|\d{2}:\d{2}(?::\d{2})?)\s*$/;
- - return 0 if !defined $cond || !defined $val;
- - my ($time, $hr, $min, $sec);
- - if ($val =~ /^\$/) {
- - my ($var) = $val =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- - if (exists $varStack{$var}) {$val = $varStack{$var}}
- - else {return 0}
- - }
- - if ($val =~ /^\d{2}:\d{2}(?::\d{2})?\s*$/) {
- - ($hr, $min, $sec) = split(/:/, $val, 3);
- - $sec = 0 if !defined $sec;
- - }
- - else {message "Wrong time format: hh:mm:ss\n", "menu"; return 0}
- - $time = $hr * 3600 + $min * 60 + $sec;
- - my ($lc_sec, $lc_min, $lc_hr) = localtime;
- - my $lc_time = $lc_hr * 3600 + $lc_min * 60 + $lc_sec;
- -
- - return cmpr($lc_time, $cond, $time)?1:0;
- +sub getParameter {
- + my ($self, $parameter) = @_;
- + return $self->{parameters}{$parameter} if (exists $self->{parameters}{$parameter});
- + return undef;
- }
- -# check for ($playersList guild) vs (guild.txt or guild list)
- -sub checkPersonGuild {
- - my ($guild, $trigger, $arg) = @_;
- - return 0 if !defined $guild || !defined $trigger || !defined $arg;
- -
- - my $actor = $arg->{player};
- -
- - return 0 unless defined $actor->{guild};
- - my $guildName = $actor->{guild}{name};
- - my $dist = $config{clientSight};
- -
- - my $not = 0;
- - if ($guild =~ /^not\s+/) {$not = 1; $guild =~ s/^not +//g}
- - if ($guild =~ /(^.*),\s*(\d+)\s*$/) {$guild = $1; $dist = $2}
- -
- - return 0 unless (distance(calcPosition($char), calcPosition($actor)) <= $dist);
- -
- - $varStack{".lastPlayerID"} = undef;
- - $varStack{".lastGuildName"} = undef;
- - $varStack{".lastGuildNameBinID"} = undef;
- - $varStack{".lastGuildNameBinIDDist"} = undef;
- - $varStack{".lastGuildNameBinIDName"} = undef;
- - $varStack{".lastGuildNameBinIDJobName"} = undef;
- -
- - if ($guild eq 'guild.txt') {
- - my @gld;
- - if (open(FILE, "<", Settings::getControlFilename("guild.txt"))) {
- - while (<FILE>) {
- - $_ =~ s/\x{FEFF}//g;
- - chomp($_);
- - next if ($_ =~ /^[\n\r#]/);
- - $_ =~ s/ +$/ /; $_ =~ s/^ +/ /;
- - push @gld, $_;
- - }
- - close FILE;
- - }
- - if (@gld) {$guild = join(' , ', @gld)}
- - else {$guild = ''}
- - }
- -
- - if (defined $guild && existsInList($guild, $guildName)) {
- - return 0 if $not;
- - $varStack{".lastPlayerID"} = unpack("V1", $actor->{ID});
- - $varStack{".lastGuildName"} = $guildName;
- - $varStack{".lastGuildNameBinID"} = $actor->{binID};
- - $varStack{".lastGuildNameBinIDDist"} = sprintf("%.1f", distance(calcPosition($char), calcPosition($actor)));
- - $varStack{".lastGuildNameBinIDName"} = $actor->{name};
- - $varStack{".lastGuildNameBinIDJobName"} = $jobs_lut{$actor->{jobID}};
- - return 1
- +sub setParameters {
- + my ($self, $parameters) = @_;
- + my ($key,$value);
- + foreach (keys %{$parameters}) {
- + $key = $_;
- + $value = $parameters->{$_};
- + $self->{parameters}{$key} = $value;
- + } continue {
- + undef $key;
- + undef $value;
- }
- - elsif (defined $guild && $not) {
- - $varStack{".lastPlayerID"} = unpack("V1", $actor->{ID});
- - $varStack{".lastGuildName"} = $guildName;
- - $varStack{".lastGuildNameBinID"} = $actor->{binID};
- - $varStack{".lastGuildNameBinIDDist"} = sprintf("%.1f", distance(calcPosition($char), calcPosition($actor)));
- - $varStack{".lastGuildNameBinIDName"} = $actor->{name};
- - $varStack{".lastGuildNameBinIDJobName"} = $jobs_lut{$actor->{jobID}};
- - return 1;
- + if (!defined $self->{parameters}{priority}) {
- + $self->{parameters}{priority} = 0;
- }
- -
- - return 0
- }
- -# checks for base/job level ################################
- -# uses cmpr (Macro::Utils)
- -sub checkLevel {
- - my ($cond, $level) = $_[0] =~ /([<>=!]+)\s+(\$[a-zA-Z][a-zA-Z\d]*|\d+|\d+\s*\.{2}\s*\d+)\s*$/;
- - if ($level =~ /^\s*\$/) {
- - my ($var) = $level =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- - return 0 unless defined $var;
- - if (exists $varStack{$var}) {$level = $varStack{$var}}
- - else {return 0}
- - }
- - return cmpr($char->{$_[1]}, $cond, $level)
- -}
- -
- -# checks for player's jobclass #############################
- -sub checkClass {
- - return 0 unless defined $char;
- - my $class = $_[0];
- - if ($class =~ /^\s*\$/) {
- - my ($var) = $class =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- - return 0 unless defined $var;
- - if (exists $varStack{$var}) {$class = $varStack{$var}}
- - else {return 0}
- - }
- - return lc($class) eq lc($::jobs_lut{$char->{jobID}})?1:0
- -}
- -
- -# checks for HP/SP/Weight ##################################
- -# uses cmpr (Macro::Utils)
- -sub checkPercent {
- - my ($arg, $what) = @_;
- - my ($cond, $amount) = $arg =~ /([<>=!]+)\s+(\$[a-zA-Z][a-zA-Z\d]*%?|\d+%?|\d+\s*\.{2}\s*\d+%?)\s*$/;
- - if ($what =~ /^(?:hp|sp|weight)$/) {
- - return 0 unless (defined $char && defined $char->{$what} && defined $char->{$what."_max"});
- - if ($amount =~ /^\s*(?:\d+|\d+\s*\.{2}\s*\d+)%$/ && $char->{$what."_max"}) {
- - $amount =~ s/%$//;
- - return cmpr(($char->{$what} / $char->{$what."_max"} * 100), $cond, $amount)
- - }
- - elsif ($amount =~ /^\s*\$/) {
- - my ($var, $percent) = $amount =~ /^\$([a-zA-Z][a-zA-Z\d]*)(%)?\s*/;
- - return 0 unless defined $var;
- - if ((defined $percent || $percent eq "%") && defined $char->{$what."_max"}) {
- - if (exists $varStack{$var}) {
- - $amount = $varStack{$var};
- - return cmpr(($char->{$what} / $char->{$what."_max"} * 100), $cond, $amount)
- - }
- - } else {
- - if (exists $varStack{$var}) {
- - $amount = $varStack{$var};
- - return cmpr($char->{$what}, $cond, $amount)
- - }
- +sub createConditionList {
- + my ($self, $conditions) = @_;
- + $self->{conditionList} = new Macro::Lists::Condition();
- + my $cond;
- + my ($module,@conditionsText);
- + foreach (keys %{$conditions}) {
- + $module = $_;
- + @conditionsText = @{$conditions->{$_}};
- + eval "use $module";
- + foreach my $newConditionText (@conditionsText) {
- + $cond = $module->new($newConditionText);
- + $self->{conditionList}->add($cond);
- + foreach my $hook (@{$cond->{hooks}}) {
- + push (@{$self->{hooks}{$hook}}, $cond->{listIndex});
- }
- - }
- - else {return cmpr($char->{$what}, $cond, $amount)}
- - }
- - elsif ($what eq 'cweight') {
- - return 0 unless (defined $cart{weight} && defined $cart{weight_max});
- - if ($amount =~ /^\s*(?:\d+|\d+\s*\.{2}\s*\d+)%$/ && $cart{weight_max}) {
- - $amount =~ s/%$//;
- - return cmpr(($cart{weight} / $cart{weight_max} * 100), $cond, $amount)
- - }
- - elsif ($amount =~ /^\s*\$/) {
- - my ($var, $percent) = $amount =~ /^\$([a-zA-Z][a-zA-Z\d]*)(%)?\s*/;
- - return 0 unless defined $var;
- - if ((defined $percent || $percent eq "%") && defined $cart{weight_max}) {
- - if (exists $varStack{$var}) {
- - $amount = $varStack{$var};
- - return cmpr(($cart{weight} / $cart{weight_max} * 100), $cond, $amount)
- - }
- - } else {
- - if (exists $varStack{$var}) {
- - $amount = $varStack{$var};
- - return cmpr($cart{weight}, $cond, $amount)
- - }
- + foreach my $variable (@{$cond->{variables}}) {
- + push (@{$self->{variables}{$variable}}, $cond->{listIndex});
- }
- + } continue {
- + undef $cond;
- }
- - else {return cmpr($cart{weight}, $cond, $amount)}
- + } continue {
- + undef $module;
- + undef @conditionsText;
- }
- - return 0
- }
- -# checks for status #######################################
- -sub checkStatus {
- - if ($_[0] =~ /,/) {
- - my @statuses = split(/\s*,\s*/, $_[0]);
- - foreach my $s (@statuses) {return 1 if checkStatus($s)}
- - return 0
- +sub check {
- + my ($self) = @_;
- + return 0 if (defined $self->{disabled} && !$self->{disabled});
- + foreach my $condition (@{$self->{conditionList}->getItems()}) {
- + return 0 if (!$condition->isTrue());
- }
- -
- - my $status = $_[0];
- - return ($status =~ s/^not +//i xor $char->statusActive($status)) if defined $char;
- + return 1;
- }
- -# checks for item conditions ##############################
- -# uses: getInventoryAmount, getCartAmount, getShopAmount,
- -# getStorageAmount (Macro::Utils?)
- -sub checkItem {
- - my ($where, $check) = @_;
- - if ($check =~ /,/) {
- - my @checks = split(/\s*,\s*/, $check);
- - foreach my $c (@checks) {return 1 if checkItem($where, $c)}
- - return 0
- - }
- - my ($item, $cond, $amount) = getArgs($check);
- - if ($item =~ /^\$/) {
- - my ($var) = $item =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*/;
- - return 0 unless defined $var;
- - if (exists $varStack{$var}) {$item = $varStack{$var}}
- - else {return 0}
- - }
- - if ($amount =~ /^\$/) {
- - my ($var1) = $amount =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*/;
- - return 0 unless defined $var1;
- - if (exists $varStack{$var1}) {$amount = $varStack{$var1}}
- - else {return 0}
- - }
- - my $what;
- - if ($where eq 'inv') {$what = getInventoryAmount($item)}
- - if ($where eq 'cart') {$what = getCartAmount($item)}
- - if ($where eq 'inv') {return 0 unless (time > $ai_v{'inventory_time'}); $what = getInventoryAmount($item);};
- - if ($where eq 'cart') {return 0 unless (time > $ai_v{'cart_time'}); $what = getCartAmount($item)};
- - if ($where eq 'shop') {return 0 unless $shopstarted; $what = getShopAmount($item)}
- - if ($where eq 'stor') {return 0 unless $::storage{opened}; $what = getStorageAmount($item)}
- -
- - return cmpr($what, $cond, $amount)?1:0
- -}
- -
- -# checks for near person ##################################
- -sub checkPerson {
- - my ($who, $dist) = $_[0] =~ /^(["\/].*?["\/]\w*)\s*,?\s*(.*)/;
- -
- - foreach my $player (@{$playersList->getItems()}) {
- - next unless match($player->name, $who);
- - if ($dist > 0 && distance($char->{pos_to}, $player->{pos_to}) >= $dist) {
- - return 0;
- - }
- - my $val = sprintf("%d %d %s", $player->{pos_to}{x}, $player->{pos_to}{y}, $field->baseName);
- - $varStack{".lastPlayerName"} = $player->name;
- - $varStack{".lastPlayerPos"} = $val;
- - $varStack{".lastPlayerLevel"} = $player->{lv};
- - $varStack{".lastPlayerJob"} = $player->job;
- - $varStack{".lastPlayerAccountId"} = $player->{nameID};
- - $varStack{".lastPlayerBinId"} = $player->{binID};
- - return 1
- - }
- - return 0
- -}
- -
- -# checks arg1 for condition in arg3 #######################
- -# uses: cmpr (Macro::Utils)
- -sub checkCond {
- - my ($cond, $amount) = $_[1] =~ /([<>=!]+)\s+(\$[a-zA-Z][a-zA-Z\d]*|\d+|\d+\s*\.{2}\s*\d+)\s*$/;
- - if ($amount =~ /^\s*\$/) {
- - my ($var) = $amount =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- - return 0 unless defined $var;
- - if (exists $varStack{$var}) {$amount = $varStack{$var}}
- - else {return 0}
- - }
- - return cmpr($_[0], $cond, $amount)?1:0
- -}
- -
- -# checks for equipment ####################################
- -# equipped <item>, <item2>, ... # equipped item or item2 or ..
- -# equipped rightHand <item>, rightAccessory <item2>, ... # equipped <item> on righthand etc.
- -# equipped leftHand none, .. # equipped nothing on lefthand etc.
- -# see @Item::slots
- -sub checkEquip {
- - if ($_[0] =~ /,/) {
- - my @equip = split(/\s*,\s*/, $_[0]);
- - foreach my $e (@equip) {return 1 if checkEquip($e)}
- - return 0
- - }
- -
- - my $arg = $_[0];
- -
- - if ($arg =~ m/^((?:top|mid|low)Head|(?:left|right)Hand|robe|armor|shoes|(?:left|right)Accessory|arrow)\s+(.*)/i) {
- - if (my $item = $char->{equipment}{$1}) {
- - return lc($2) eq lc($item->name)?1:0
- - }
- - return lc($2) eq 'none'?1:0
- - }
- -
- - $arg = lc($arg);
- - foreach my $s (keys %{$char->{equipment}}) {
- - next unless lc($char->{equipment}{$s}->name) eq $arg;
- - return 1
- - }
- - return 0
- -}
- -
- -# checks for a spell casted on us/party members #########################
- -# uses: distance, judgeSkillArea (Utils?)
- -sub checkCast {
- - my ($cast, $args) = @_;
- - return 0 if $args->{sourceID} eq $accountID;
- -
- - $cast = lc($cast);
- - my $party = ($cast =~ s/^party +//)?1:0;
- - my $pos = calcPosition($char);
- - my $target = (defined $args->{targetID})?$args->{targetID}:0;
- - my $source = $args->{sourceID};
- - return 0 if $target eq $source;
- -
- - if (($target eq $accountID || ($pos->{x} == $args->{x} && $pos->{y} == $args->{y}) || distance($pos, $args) <= judgeSkillArea($args->{skillID})) && existsInList($cast, lc(Skill->new(idn => $args->{skillID})->getName()))) {
- - if (my $actor = $monstersList->getByID($source)) {
- - $varStack{".caster"} = "monster";
- - $varStack{".casterName"} = $actor->{name};
- - $varStack{".casterID"} = $actor->{binID};
- - $varStack{".casterPos"} = $actor->{pos_to}{x} ." ". $actor->{pos_to}{y};
- - $varStack{".casterDist"} = sprintf("%.1f", distance($pos, calcPosition($actor)))
- -
- - }
- - elsif (my $actor = $playersList->getByID($source)) {
- - $varStack{".caster"} = "player";
- - $varStack{".casterName"} = (defined $actor->{name})?$actor->{name}:"Unknown";
- - $varStack{".casterID"} = $actor->{binID};
- - $varStack{".casterPos"} = $actor->{pos_to}{x} ." ". $actor->{pos_to}{y};
- - $varStack{".casterDist"} = sprintf("%.1f", distance($pos, calcPosition($actor)));
- -
- - }
- - else {return 0}
- - $varStack{".casterSkill"} = Skill->new(idn => $args->{skillID})->getName();
- - $varStack{".casterTarget"} = $args->{x} ." ". $args->{y};
- - $varStack{".casterTargetName"} = $char->{name};
- - return 1
- - }
- - elsif ($party && existsInList($cast, lc(Skill->new(idn => $args->{skillID})->getName()))) {
- - return 0 if !$char->{'party'} || !%{$char->{'party'}};
- - if (my $actor = $monstersList->getByID($source)) {
- - foreach my Actor::Player $player (@{$playersList->getItems()}) {
- - next unless sameParty($player->{name});
- - if ($target eq $player->{ID} || ($player->{pos_to}{x} == $args->{x} && $player->{pos_to}{y} == $args->{y}) || distance($player->{pos}, $args) <= judgeSkillArea($args->{skillID})) {
- - $varStack{".caster"} = "monster";
- - $varStack{".casterName"} = $actor->{name};
- - $varStack{".casterID"} = $actor->{binID};
- - $varStack{".casterPos"} = $actor->{pos_to}{x} ." ". $actor->{pos_to}{y};
- - $varStack{".casterSkill"} = Skill->new(idn => $args->{skillID})->getName();
- - $varStack{".casterTarget"} = $args->{x} ." ". $args->{y};
- - $varStack{".casterTargetName"} = $player->{name};
- - $varStack{".casterDist"} = sprintf("%.1f", distance($pos, calcPosition($actor)));
- - return 1
- - }
- - }
- -
- - }
- - elsif (my $actor = $playersList->getByID($source)) {
- - return 0 if sameParty($actor->{name});
- - foreach my Actor::Player $player (@{$playersList->getItems()}) {
- - next unless sameParty($player->{name});
- - if ($target eq $player->{ID} || ($player->{pos_to}{x} == $args->{x} && $player->{pos_to}{y} == $args->{y}) || distance($player->{pos}, $args) <= judgeSkillArea($args->{skillID})) {
- - $varStack{".caster"} = "player";
- - $varStack{".casterName"} = (defined $actor->{name})?$actor->{name}:"Unknown";
- - $varStack{".casterID"} = $actor->{binID};
- - $varStack{".casterPos"} = $actor->{pos_to}{x} ." ". $actor->{pos_to}{y};
- - $varStack{".casterSkill"} = Skill->new(idn => $args->{skillID})->getName();
- - $varStack{".casterTarget"} = $args->{x} ." ". $args->{y};
- - $varStack{".casterTargetName"} = $player->{name};
- - $varStack{".casterDist"} = sprintf("%.1f", distance($pos, calcPosition($actor)));
- - return 1
- - }
- - }
- - }
- - else {return 0}
- - }
- - else {return 0}
- -}
- -
- -# checks for public, private, party or guild message ######
- -# uses calcPosition, distance (Utils?)
- -sub checkMsg {
- - my ($var, $tmp, $arg) = @_;
- - my $msg;
- - if ($var eq '.lastpub') {
- - ($msg, my $distance) = $tmp =~ /^([\/"].*?[\/"]\w*)\s*,?\s*(\d*)/;
- - if ($distance ne '') {
- - my $mypos = calcPosition($char);
- - my $pos = calcPosition($::players{$arg->{pubID}});
- - return 0 unless distance($mypos, $pos) <= $distance
- - }
- - } elsif ($var eq '.lastpm') {
- - ($msg, my $allowed) = $tmp =~ /^([\/"].*?[\/"]\w*)\s*,?\s*(.*)/;
- - my $auth;
- - if (!$allowed) {
- - $auth = 1
- - } else {
- - my @tfld = split(/,/, $allowed);
- - for (my $i = 0; $i < @tfld; $i++) {
- - next unless defined $tfld[$i];
- - $tfld[$i] =~ s/(?:^ +| +$)//g;
- - if ($arg->{privMsgUser} eq $tfld[$i]) {$auth = 1; last}
- - }
- - }
- - return 0 unless $auth
- - } elsif ($var eq '.lastsys') {
- - ($msg) = $tmp =~ /^([\/"].*?[\/"]\w*)\s*,?\s*(.*)/;
- - chomp($msg);
- - } else {
- - $msg = $tmp
- - }
- - $arg->{Msg} =~ s/[\r\n]*$//g;
- - if (match($arg->{Msg},$msg)){
- - $varStack{$var} = $arg->{MsgUser};
- - $varStack{$var."Msg"} = $arg->{Msg};
- - return 1
- - }
- - return 0
- -}
- -
- -# checks for area spell
- -sub checkSpellsID {
- - my ($line, $args) = @_;
- - my $dist = $config{clientSight} || 20;
- - my ($list, $cond);
- - if ($line =~ /^\s*(.*),?\s+([<>=!~]+)\s+(\d+|\d+\s*.{2}\s*\d+)\s*$/) {
- - ($list, $cond, $dist) = ($1, $2, $3)
- - }
- - else {$list = $line; $cond = "<="}
- -
- - foreach (@spellsID) {
- - my $spell = $spells{$_};
- - my $type = getSpellName($spell->{type});
- - my $dist1 = sprintf("%.1f",distance(calcPosition($char), calcPosition($spell)));
- - my ($actor, $owner, $ID) = getActorName($spell->{sourceID}) =~ /^(\w+?)\s(.*?)\s\((\d+)\)\s*$/;
- - if (existsInList($list, $type) &&
- - $args->{x} eq $spell->{'pos'}{'x'} &&
- - $args->{y} eq $spell->{'pos'}{'y'} &&
- - $args->{sourceID} eq $spell->{sourceID}
- - ) {
- - $varStack{".areaName"} = $type;
- - $varStack{".areaActor"} = $actor;
- - $varStack{".areaSourceName"} = $owner;
- - $varStack{".areaSourceID"} = $ID;
- - $varStack{".areaPos"} = sprintf("%d %d %s", $spell->{'pos'}{'x'}, $spell->{'pos'}{'y'}, $field->baseName);
- - $varStack{".areaDist"} = $dist1;
- - return cmpr($dist1, $cond, $dist)
- - }
- - }
- - return 0
- -}
- -
- -# checks for monster ...
- -sub checkMonster {
- - my $line = $_[0];
- - my $not = $_[1];
- - my ($mercenary, $use, $monsterList, $cond);
- - my $mondist = $config{clientSight} || 20;
- -
- - if ($line =~ /^\s*(.*),?\s+([<>=!~]+)\s+(\d+|\d+\s*.{2}\s*\d+)\s*$/) {
- - ($monsterList, $cond, $mondist) = ($1, $2, $3)
- - } else {
- - $monsterList = $line;
- - $cond = "<="
- - }
- -
- - if (!$not && $monsterList =~ /^(not|mercenary)\s+(.*)\s*$/) {
- - if ($1 eq "not") {$not = 1; $monsterList = $2}
- - else {$mercenary = 1; $use = 1; $monsterList = $2}
- - }
- -
- - foreach (@monstersID) {
- - next unless defined $_;
- - if ($mercenary) {
- - #Whose the mercenary's master,
- - #update later ;p
- - my $mypos = calcPosition($char);
- - my $pos = calcPosition($monsters{$_});
- - my $dist = sprintf("%.1f",distance($pos, $mypos));
- - if (existsInList($monsterList, $monsters{$_}->{name}) && $dist < 3) {$use = 0; last}
- - }
- - elsif ($not) {
- - next if existsInList($monsterList, $monsters{$_}->{name});
- - my $mypos = calcPosition($char);
- - my $pos = calcPosition($monsters{$_});
- - my $dist = sprintf("%.1f",distance($pos, $mypos));
- - my $val = sprintf("%d %d %s", $pos->{x}, $pos->{y}, $field->baseName);
- - $varStack{".lastMonster"} = $monsters{$_}->{name};
- - $varStack{".lastMonsterPos"} = $val;
- - $varStack{".lastMonsterDist"} = $dist;
- - $varStack{".lastMonsterID"} = $monsters{$_}->{binID};
- - $varStack{".lastMonsterBinID"} = $monsters{$_}->{binType};
- - return cmpr($dist, $cond, $mondist)
- - } else {
- - if (existsInList($monsterList, $monsters{$_}->{name})) {
- - my $counter;
- - my $mypos = calcPosition($char);
- - my $pos = calcPosition($monsters{$_});
- - my $dist = sprintf("%.1f", distance($mypos, $pos));
- - my $val = sprintf("%d %d %s", $pos->{x}, $pos->{y}, $field->baseName);
- - $varStack{".lastMonster"} = $monsters{$_}->{name};
- - $varStack{".lastMonsterPos"} = $val;
- - $varStack{".lastMonsterDist"} = $dist;
- - $varStack{".lastMonsterID"} = $monsters{$_}->{binID};
- - $varStack{".lastMonsterBinID"} = $monsters{$_}->{binType};
- - for (my $i = 0; $i < @::monstersID; $i++) {
- - next if $::monstersID[$i] eq "";
- - my $monster = Actor::get($::monstersID[$i]);
- - if ($monster->name eq $monsters{$_}->{name}) {
- - if ($monster->{binID} eq $monsters{$_}->{binID}) {
- - $counter++;
- - next
- - } else {
- - my $monsToMonDist = sprintf("%.1f",distance($pos, $monster->{pos_to}));
- - $counter++ if $monsToMonDist < 12;
- - next
- - }
- - }
- - next
- - }
- - $varStack{".lastMonsterCount"} = $counter;
- - return cmpr($dist, $cond, $mondist)
- - }
- - }
- - }
- - return 1 if ($use);
- - return 0
- -}
- -
- -# checks for aggressives
- -sub checkAggressives {
- - my ($cond, $amount) = $_[0] =~ /([<>=!]+)\s+(\$[a-zA-Z][a-zA-Z\d]*|\d+|\d+\s*\.{2}\s*\d+)\s*$/;
- - if ($amount =~ /^\s*\$/) {
- - my ($var) = $amount =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- - return 0 unless defined $var;
- - if (exists $varStack{$var}) {$amount = $varStack{$var}}
- - else {return 0}
- - }
- - return cmpr(scalar ai_getAggressives, $cond, $amount)
- -}
- -# checks for console message
- -sub checkConsole {
- - my ($msg, $arg) = @_;
- - $$arg[4] =~ s/[\r\n]*$//;
- - if (match($$arg[4],$msg)){
- - $varStack{".lastLogMsg"} = $$arg[4];
- - return 1
- - }
- - return 0
- -}
- -
- -sub consoleCheckWrapper {
- - return unless defined $conState;
- - # skip "macro" and "cvsdebug" domains to avoid loops
- - return if $_[1] =~ /^(?:macro|cvsdebug)$/;
- - # skip debug messages unless macro_allowDebug is set
- - return if ($_[0] eq 'debug' && !$::config{macro_allowDebug});
- - my @args = @_;
- - automacroCheck("log", \@args)
- -}
- -
- -# checks for map change
- -sub checkMapChange {
- - return ($_[0] eq 'any' || $_[0] eq '*' || existsInList($_[0], $field->baseName))?1:0
- -}
- -
- -# checks for eval
- -sub checkEval {
- - return if $Settings::lockdown;
- -
- - #if ($_[0] =~ /;/) {
- - # my @eval = split(/\s*;\s*/, $_[0]);
- - # foreach my $e (@eval) {return 1 if checkEval($e)}
- - # return 0
- - #}
- - return eval $_[0];
- -}
- -
- -
- -# releases a locked automacro ##################
- -sub releaseAM {
- - if ($_[0] eq 'all') {
- - foreach (keys %automacro) {
- - undef $automacro{$_}->{disabled}
- - }
- - return 1
- - }
- - if (defined $automacro{$_[0]}) {
- - undef $automacro{$_[0]}->{disabled};
- - return 1
- - }
- - return 0
- -}
- -
- -# locks an automacro ##################
- -sub lockAM {
- - if ($_[0] eq 'all') {
- - foreach (keys %automacro) {
- - $automacro{$_}->{disabled} = 1
- - }
- - return 1
- - }
- - if (defined $automacro{$_[0]}) {
- - $automacro{$_[0]}->{disabled} = 1;
- - return 1
- - }
- - return 0
- -}
- -
- -# parses automacros and checks conditions #################
- -sub automacroCheck {
- - my ($trigger, $args) = @_;
- - return unless ($conState == 5 && $char) || $trigger =~ /^(?:charSelectScreen|Network|packet)/;
- -
- - # do not run an automacro if there's already a macro running and the running
- - # macro is non-interruptible
- - return if (defined $queue && !$queue->interruptible);
- -
- - refreshGlobal();
- -
- - CHKAM:
- - foreach my $am (sort {
- - ($automacro{$a}->{priority} or 0) <=> ($automacro{$b}->{priority} or 0)
- - } keys %automacro) {
- - next CHKAM if $automacro{$am}->{disabled};
- -
- - if (defined $automacro{$am}->{call} && !defined $macro{$automacro{$am}->{call}}) {
- - error "automacro $am: macro ".$automacro{$am}->{call}." not found.\n";
- - $automacro{$am}->{disabled} = 1; return
- - }
- -
- - if (defined $automacro{$am}->{timeout}) {
- - $automacro{$am}->{time} = 0 unless $automacro{$am}->{time};
- - my %tmptimer = (timeout => $automacro{$am}->{timeout}, time => $automacro{$am}->{time});
- - next CHKAM unless timeOut(\%tmptimer)
- - }
- -
- - if (defined $automacro{$am}->{hook}) {
- - next CHKAM unless $trigger eq $automacro{$am}->{hook};
- - # save arguments
- - my $s = 0;
- - foreach my $save (@{$automacro{$am}->{save}}) {
- - if (defined $args->{$save}) {
- - if (ref($args->{$save}) eq 'SCALAR') {
- - $varStack{".hooksave$s"} = ${$args->{$save}}
- - } else {
- - if (!$::config{macro_nowarn} && ref($args->{$save}) ne '') {
- - warning "[macro] \$.hooksave$s is of type ".ref($args->{$save}).". Take care!\n"
- - }
- - $varStack{".hooksave$s"} = $args->{$save}
- - }
- - } else {
- - error "[macro] \$args->{$save} does not exist\n"
- - }
- - $s++
- - }
- - } elsif (defined $automacro{$am}->{console}) {
- - if ($trigger eq 'log') {
- - next CHKAM unless checkConsole($automacro{$am}->{console}, $args)
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{spell}) {
- - if ($trigger =~ /^(?:is_casting|packet_skilluse)$/) {
- - next CHKAM unless checkCast($automacro{$am}->{spell}, $args)
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{pm}) {
- - if ($trigger eq 'packet_privMsg') {
- - next CHKAM unless checkMsg(".lastpm", $automacro{$am}->{pm}, $args)
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{pubm}) {
- - if ($trigger eq 'packet_pubMsg') {
- - next CHKAM unless checkMsg(".lastpub", $automacro{$am}->{pubm}, $args)
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{system}) {
- - if ($trigger eq 'packet_sysMsg') {
- - next CHKAM unless checkMsg(".lastsys", $automacro{$am}->{system}, $args)
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{party}) {
- - if ($trigger eq 'packet_partyMsg') {
- - next CHKAM unless checkMsg(".lastparty", $automacro{$am}->{party}, $args)
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{guild}) {
- - if ($trigger eq 'packet_guildMsg') {
- - next CHKAM unless checkMsg(".lastguild", $automacro{$am}->{guild}, $args)
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{mapchange}) {
- - if ($trigger eq 'packet_mapChange') {
- - next CHKAM unless checkMapChange($automacro{$am}->{mapchange})
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{playerguild}) {
- - if (($trigger eq 'player') || ($trigger eq 'charNameUpdate')) {
- - next CHKAM unless checkPersonGuild($automacro{$am}->{playerguild},$trigger,$args)
- - } else {next CHKAM}
- - } elsif (defined $automacro{$am}->{areaSpell}) {
- - if ($trigger eq 'packet_areaSpell') {
- - next CHKAM unless checkSpellsID($automacro{$am}->{areaSpell}, $args)
- - } else {next CHKAM}
- - }
- -
- - next CHKAM if (defined $automacro{$am}->{map} && $automacro{$am}->{map} ne $field->baseName);
- - next CHKAM if (defined $automacro{$am}->{class} && !checkClass($automacro{$am}->{class}));
- - next CHKAM if (defined $automacro{$am}->{eval} && !checkEval($automacro{$am}->{eval}));
- - next CHKAM if (defined $automacro{$am}->{whenGround} && !checkGround($automacro{$am}->{whenGround}));
- - next CHKAM if (defined $automacro{$am}->{notMonster} && !checkMonster($automacro{$am}->{notMonster}, 1));
- -
- - foreach my $i (@{$automacro{$am}->{monster}}) {next CHKAM unless checkMonster($i)}
- - foreach my $i (@{$automacro{$am}->{aggressives}}){next CHKAM unless checkAggressives($i)}
- - foreach my $i (@{$automacro{$am}->{location}}) {next CHKAM unless checkLoc($i)}
- - foreach my $i (@{$automacro{$am}->{localtime}}) {next CHKAM unless checkLocalTime($i, "")}
- - foreach my $i (@{$automacro{$am}->{var}}) {next CHKAM unless checkVar($i, "")}
- - foreach my $i (@{$automacro{$am}->{varvar}}) {next CHKAM unless checkVar($i, "varvar")}
- - foreach my $i (@{$automacro{$am}->{base}}) {next CHKAM unless checkLevel($i, "lv")}
- - foreach my $i (@{$automacro{$am}->{job}}) {next CHKAM unless checkLevel($i, "lv_job")}
- - foreach my $i (@{$automacro{$am}->{hp}}) {next CHKAM unless checkPercent($i, "hp")}
- - foreach my $i (@{$automacro{$am}->{sp}}) {next CHKAM unless checkPercent($i, "sp")}
- - foreach my $i (@{$automacro{$am}->{spirit}}) {next CHKAM unless checkCond($char->{spirits} || 0, $i)}
- - foreach my $i (@{$automacro{$am}->{weight}}) {next CHKAM unless checkPercent($i, "weight")}
- - foreach my $i (@{$automacro{$am}->{cartweight}}) {next CHKAM unless checkPercent($i, "cweight")}
- - foreach my $i (@{$automacro{$am}->{soldout}}) {next CHKAM unless checkCond(getSoldOut(), $i)}
- - foreach my $i (@{$automacro{$am}->{zeny}}) {next CHKAM unless checkCond($char->{zeny}, $i)}
- - foreach my $i (@{$automacro{$am}->{cash}}) {next CHKAM unless checkCond($cashShop{points}->{cash}?$cashShop{points}->{cash}:0, $i)}
- - foreach my $i (@{$automacro{$am}->{player}}) {next CHKAM unless checkPerson($i)}
- - foreach my $i (@{$automacro{$am}->{equipped}}) {next CHKAM unless checkEquip($i)}
- - foreach my $i (@{$automacro{$am}->{status}}) {next CHKAM unless checkStatus($i)}
- - foreach my $i (@{$automacro{$am}->{inventory}}) {next CHKAM unless checkItem("inv", $i)}
- - foreach my $i (@{$automacro{$am}->{storage}}) {next CHKAM unless checkItem("stor", $i)}
- - foreach my $i (@{$automacro{$am}->{shop}}) {next CHKAM unless checkItem("shop", $i)}
- - foreach my $i (@{$automacro{$am}->{cart}}) {next CHKAM unless checkItem("cart", $i)}
- -
- - message "[macro] automacro $am triggered.\n", "macro";
- -
- - unless (defined $automacro{$am}->{call} || $::config{macro_nowarn}) {
- - warning "[macro] automacro $am: call not defined.\n", "macro"
- - }
- -
- - $automacro{$am}->{time} = time if $automacro{$am}->{timeout};
- - $automacro{$am}->{disabled} = 1 if $automacro{$am}->{'run-once'};
- -
- - foreach my $i (@{$automacro{$am}->{set}}) {
- - my ($var, $val) = $i =~ /^(.*?)\s+(.*)/;
- - $varStack{$var} = $val
- - }
- -
- - if (defined $automacro{$am}->{call}) {
- - undef $queue if defined $queue;
- - $queue = new Macro::Script($automacro{$am}->{call});
- - if (defined $queue) {
- - $queue->overrideAI(1) if $automacro{$am}->{overrideAI};
- - $queue->interruptible(0) if $automacro{$am}->{exclusive};
- - $queue->orphan($automacro{$am}->{orphan}) if defined $automacro{$am}->{orphan};
- - $queue->timeout($automacro{$am}->{delay}) if $automacro{$am}->{delay};
- - $queue->setMacro_delay($automacro{$am}->{macro_delay}) if $automacro{$am}->{macro_delay};
- - $varStack{".caller"} = $am;
- - $onHold = 0;
- - callMacro
- - } else {
- - error "unable to create macro queue.\n"
- - }
- - }
- -
- - return # don't execute multiple macros at once
- - }
- -}
- -
- -1;
- +1;
- \ No newline at end of file
- Index: Macro/Condition/base.pm
- ===================================================================
- --- Macro/Condition/base.pm (revision 0)
- +++ Macro/Condition/base.pm (working copy)
- @@ -0,0 +1,74 @@
- +package Macro::Condition::Base;
- +
- +use strict;
- +use Plugins;
- +use Settings;
- +use Globals;
- +use Macro::Data;
- +use Macro::Utilities qw(cmpr);
- +
- +sub new {
- + my ($class, $text) = @_;
- + my $self = {
- + text => $text,
- + listIndex => -1,
- + isSingle => 0,
- + isTrue => 0,
- + hooks => ['level_changed'],
- + variables => []
- + };
- + bless $self, $class;
- + return 0 unless ($self->isSintaxCorrect());
- + return $self;
- +}
- +
- +sub check {
- + my ($self, $event, $args) = @_;
- + if ($event ne "var") {
- + if ($self->{varType}) {
- + if ($macroPlugin->isVarDefined($self->{lvl})) {
- + $self->{isTrue} = cmpr($char->{lv}, $self->{cond}, $macroPlugin->getVar($self->{lvl}));
- + } else {
- + $self->{isTrue} = 0;
- + }
- + } else {
- + $self->{isTrue} = cmpr($char->{lv}, $self->{cond}, $self->{lvl});
- + }
- + } else {
- + $self->{isTrue} = cmpr($char->{lv}, $self->{cond}, $macroPlugin->getVar($self->{lvl}));
- + }
- + return 1 if ($self->{isTrue});
- + return 0;
- +}
- +
- +sub isTrue {
- + my ($self) = @_;
- + return $self->{isTrue};
- +}
- +
- +sub isSintaxCorrect {
- + my ($self) = @_;
- + if ($self->{text} =~ /([<>=!]+)\s+(\$[a-zA-Z][a-zA-Z\d]*|\d+|\d+\s*\.{2}\s*\d+)\s*$/) {
- + $self->{cond} = $1;
- + my $lvl = $2;
- + if ($lvl =~ /^\s*\$/) {
- + my ($var) = $lvl =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- + return 0 unless defined $var;
- + $self->{lvl} = $var;
- + push (@{$self->{variables}}, $var);
- + $self->{varType} = 1;
- + } else {
- + $self->{lvl} = $lvl;
- + $self->{varType} = 0;
- + }
- + return 1;
- + }
- + return 0;
- +}
- +
- +sub isSingleCondition {
- + my ($self) = @_;
- + return $self->{isSingle};
- +}
- +
- +1;
- \ No newline at end of file
- Index: Macro/Condition/base.pm
- ===================================================================
- --- Macro/Condition/base.pm (revision 0)
- +++ Macro/Condition/base.pm (working copy)
- @@ -0,0 +1,74 @@
- +package Macro::Condition::Base;
- +
- +use strict;
- +use Plugins;
- +use Settings;
- +use Globals;
- +use Macro::Data;
- +use Macro::Utilities qw(cmpr);
- +
- +sub new {
- + my ($class, $text) = @_;
- + my $self = {
- + text => $text,
- + listIndex => -1,
- + isSingle => 0,
- + isTrue => 0,
- + hooks => ['level_changed'],
- + variables => []
- + };
- + bless $self, $class;
- + return 0 unless ($self->isSintaxCorrect());
- + return $self;
- +}
- +
- +sub check {
- + my ($self, $event, $args) = @_;
- + if ($event ne "var") {
- + if ($self->{varType}) {
- + if ($macroPlugin->isVarDefined($self->{lvl})) {
- + $self->{isTrue} = cmpr($char->{lv}, $self->{cond}, $macroPlugin->getVar($self->{lvl}));
- + } else {
- + $self->{isTrue} = 0;
- + }
- + } else {
- + $self->{isTrue} = cmpr($char->{lv}, $self->{cond}, $self->{lvl});
- + }
- + } else {
- + $self->{isTrue} = cmpr($char->{lv}, $self->{cond}, $macroPlugin->getVar($self->{lvl}));
- + }
- + return 1 if ($self->{isTrue});
- + return 0;
- +}
- +
- +sub isTrue {
- + my ($self) = @_;
- + return $self->{isTrue};
- +}
- +
- +sub isSintaxCorrect {
- + my ($self) = @_;
- + if ($self->{text} =~ /([<>=!]+)\s+(\$[a-zA-Z][a-zA-Z\d]*|\d+|\d+\s*\.{2}\s*\d+)\s*$/) {
- + $self->{cond} = $1;
- + my $lvl = $2;
- + if ($lvl =~ /^\s*\$/) {
- + my ($var) = $lvl =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- + return 0 unless defined $var;
- + $self->{lvl} = $var;
- + push (@{$self->{variables}}, $var);
- + $self->{varType} = 1;
- + } else {
- + $self->{lvl} = $lvl;
- + $self->{varType} = 0;
- + }
- + return 1;
- + }
- + return 0;
- +}
- +
- +sub isSingleCondition {
- + my ($self) = @_;
- + return $self->{isSingle};
- +}
- +
- +1;
- \ No newline at end of file
- Index: Macro/Data.pm
- ===================================================================
- --- Macro/Data.pm (revision 8992)
- +++ Macro/Data.pm (working copy)
- @@ -6,73 +6,24 @@
- require Exporter;
- our ($rev) = q$Revision: 6753 $ =~ /(\d+)/;
- our @ISA = qw(Exporter);
- -our @EXPORT = qw(@perl_name %macro %automacro %varStack $queue $onHold %amSingle %amMulti $macroKeywords);
- +our @EXPORT = qw($macroPlugin @perl_name %parameters $macroKeywords);
- +our $macroPlugin;
- our @perl_name;
- -our %macro;
- -our %automacro;
- -our %varStack;
- -our $queue;
- -our $onHold;
- -our $inBlock;
- -our %amSingle = (
- - 'map' => 1, # map check
- - 'mapchange' => 1, # map change check
- - 'class' => 1, # job class check
- +our %parameters = (
- 'timeout' => 1, # setting: re-check timeout
- 'delay' => 1, # option: delay before the macro starts
- 'run-once' => 1, # option: run automacro only once
- 'disabled' => 1, # option: automacro disabled
- 'call' => 1, # setting: macro to be called
- - 'spell' => 1, # check: cast sensor
- - 'notMonster' => 1, # check: disallow monsters other than ~
- - 'pm' => 1, # check: private message
- - 'pubm' => 1, # check: public chat
- - 'system' => 1, # check: system chat
- - 'guild' => 1, # check: guild chat
- - 'party' => 1, # check: party chat
- - 'console' => 1, # check: console message
- 'overrideAI' => 1, # option: override AI
- 'orphan' => 1, # option: orphan handling
- 'macro_delay' => 1, # option: default macro delay
- - 'hook' => 1, # check: openkore hook
- 'priority' => 1, # option: automacro priority
- 'exclusive' => 1, # option: is macro interruptible
- - 'playerguild' => 1, # check: player guilds
- - 'eval' => 1, # check : eval
- - 'whenGround' => 1, # check : when ground statuses
- - 'areaSpell' => 1 # check : area spell
- );
- -our %amMulti = (
- - 'set' => 1, # set: variable
- - 'save' => 1, # setting: save hook arguments
- - 'monster' => 1, # check: monster on screen
- - 'aggressives' => 1, # check: aggressives
- - 'location' => 1, # check: player's location
- - 'var' => 1, # check: variable / value
- - 'varvar' => 1, # check: nested variable / value
- - 'base' => 1, # check: base level
- - 'job' => 1, # check: job level
- - 'hp' => 1, # check: player's hp
- - 'sp' => 1, # check: player's sp
- - 'spirit' => 1, # check: spirit spheres
- - 'weight' => 1, # check: player's weight
- - 'cartweight' => 1, # check: cart weight
- - 'soldout' => 1, # check: sold out shop slots
- - 'zeny' => 1, # check: player's zeny
- - 'cash' => 1, # check: player's cash
- - 'player' => 1, # check: player name near
- - 'equipped' => 1, # check: equipment
- - 'status' => 1, # check: player's status
- - 'inventory' => 1, # check: item amount in inventory
- - 'storage' => 1, # check: item amount in storage
- - 'shop' => 1, # check: item amount in shop
- - 'cart' => 1, # check: item amount in cart
- - 'localtime' => 1 # check: localtime
- -);
- -
- our $macroKeywords =
- "npc" . "|" .
- "store" . "|" .
- Index: Macro/FileParser.pm
- ===================================================================
- --- Macro/FileParser.pm (revision 0)
- +++ Macro/FileParser.pm (working copy)
- @@ -0,0 +1,382 @@
- +# $Id: Parser.pm r6759 2009-07-05 04:00:00Z ezza $
- +package Macro::FileParser;
- +
- +use strict;
- +use encoding 'utf8';
- +
- +require Exporter;
- +our @ISA = qw(Exporter);
- +our @EXPORT = qw(parseMacroFile isNewCommandBlock);
- +our @EKSPORT_OK = qw(isNewCommandBlock);
- +
- +use Globals;
- +use Utils;
- +use Utils::Exceptions;
- +use List::Util qw(max min sum);
- +use Log qw(message warning error);
- +use Text::Balanced qw/extract_bracketed/;
- +use Macro::Data;
- +use Macro::Plugin;
- +use Macro::Lists;
- +use Macro::Lists::Automacro;
- +use Macro::Lists::Condition;
- +use Macro::Lists::Macro;
- +our ($rev) = q$Revision: 6759 $ =~ /(\d+)/;
- +
- +# adapted config file parser
- +my $tempmacro = 0;
- +my %macro;
- +my %automacro;
- +
- +sub parseMacroFile {
- + my ($file, $recursive) = @_;
- +
- + unless ($recursive) {
- + undef %macro;
- + undef %automacro;
- + undef @perl_name
- + }
- +
- + my %block;
- + my $inBlock = 0;
- + my $macroCountOpenBlock = 0;
- + my ($macro_subs, @perl_lines);
- + open my $fp, "<:utf8", $file or return 0;
- + while (<$fp>) {
- + $. == 1 &&
- + s/^\x{FEFF}//; # utf bom
- + s/(.*)[\s\t]+#.*$/$1/; # remove last comments
- + s/^\s*#.*$//; # remove comments
- + s/^\s*//; # remove leading whitespaces
- + s/\s*[\r\n]?$//g; # remove trailing whitespaces and eol
- + s/ +/ /g; # trim down spaces - very cool for user's string data?
- + next unless ($_);
- +
- + if (!%block && /{$/) {
- + my ($key, $value) = $_ =~ /^(.*?)\s+(.*?)\s*{$/;
- + if ($key eq 'macro') {
- + %block = (name => $value, type => "macro");
- + $macro{$value} = [];
- + } elsif ($key eq 'automacro') {
- + %block = (name => $value, type => "automacro");
- + } elsif ($key eq 'sub') {
- + %block = (name => $value, type => "sub");
- + } else {
- + %block = (type => "bogus");
- + warning "$file: ignoring line '$_' in line $. (munch, munch, strange block)\n";
- + }
- + next;
- +
- +
- +
- +
- + } elsif (%block && $block{type} eq "bogus") {
- + if ($_ eq "}") {undef %block}
- + next;
- +
- +
- +
- +
- + } elsif (%block && $block{type} eq "macro") {
- + if ($_ eq "}") {
- + if ($macroCountOpenBlock) {
- + push(@{$macro{$block{name}}}, '}');
- + $macroCountOpenBlock--;
- + } else {
- + undef %block;
- + }
- + } else {
- + if (isNewCommandBlock($_)) {
- + $macroCountOpenBlock++
- + } elsif (!$macroCountOpenBlock && isNewWrongCommandBlock($_)) {
- + warning "$file: ignoring '$_' in line $. (munch, munch, not found the open block command)\n";
- + next;
- + }
- + push(@{$macro{$block{name}}}, $_);
- + }
- +
- + next;
- +
- +
- +
- +
- + } elsif (%block && $block{type} eq "automacro") {
- + if ($_ eq "}") {
- + if ($block{loadmacro}) {
- + if ($macroCountOpenBlock) {
- + push(@{$macro{$block{loadmacro_name}}}, '}');
- +
- + if ($macroCountOpenBlock) {
- + $macroCountOpenBlock--;
- + }
- + } else {
- + undef $block{loadmacro}
- + }
- + } else {
- + undef %block
- + }
- + } elsif ($_ eq "call {") {
- + $block{loadmacro} = 1;
- + $block{loadmacro_name} = "tempMacro".$tempmacro++;
- + push(@{$automacro{$block{name}}{parameters}}, {key => 'call', value => $block{loadmacro_name}});
- + $macro{$block{loadmacro_name}} = []
- + } elsif ($block{loadmacro}) {
- + if (isNewCommandBlock($_)) {
- + $macroCountOpenBlock++
- + } elsif (!$macroCountOpenBlock && isNewWrongCommandBlock($_)) {
- + warning "$file: ignoring '$_' in line $. (munch, munch, not found the open block command)\n";
- + next
- + }
- +
- + push(@{$macro{$block{loadmacro_name}}}, $_);
- + } else {
- + my ($key, $value) = $_ =~ /^(.*?)\s+(.*)/;
- + if (!defined $key || !defined $value) {
- + warning "$file: ignoring '$_' in line $. (munch, munch, not a pair)\n";
- + next;
- + }
- + if (exists $parameters{$key}) {
- + push(@{$automacro{$block{name}}{parameters}}, {key => $key, value => $value});
- + } else {
- + push(@{$automacro{$block{name}}{conditions}}, {key => $key, value => $value});
- + }
- + }
- +
- + next;
- +
- +
- +
- +
- + } elsif (%block && $block{type} eq "sub") {
- + if ($_ eq "}") {
- + if ($inBlock > 0) {
- + push(@perl_lines, $_);
- + $inBlock--;
- + next
- + }
- + $macro_subs = join('', @perl_lines);
- + sub_execute($block{name}, $macro_subs);
- + push(@perl_name, $block{name}) unless existsInList(join(',', @perl_name), $block{name});
- + undef %block; undef @perl_lines; undef $macro_subs;
- + $inBlock = 0
- + }
- + elsif ($_ =~ /^}.*?{$/ && $inBlock > 0) {push(@perl_lines, $_)}
- + elsif ($_ =~ /{$/) {$inBlock++; push(@perl_lines, $_)}
- + else {push(@perl_lines, $_)}
- + next;
- +
- +
- +
- +
- + }
- +
- + my ($key, $value) = $_ =~ /(?:^(.*?)\s|})+(.*)/;
- + unless (defined $key) {
- + warning "$file: ignoring '$_' in line $. (munch, munch, strange food)\n";
- + next
- + }
- +
- + if ($key eq "!include") {
- + my $f = $value;
- + if (!File::Spec->file_name_is_absolute($value) && $value !~ /^\//) {
- + if ($file =~ /[\/\\]/) {
- + $f = $file;
- + $f =~ s/(.*)[\/\\].*/$1/;
- + $f = File::Spec->catfile($f, $value)
- + } else {
- + $f = $value
- + }
- + }
- + if (-f $f) {
- + my $ret = parseMacroFile($f, 1);
- + return $ret unless $ret
- + } else {
- + error "$file: Include file not found: $f\n";
- + return 0
- + }
- + }
- + }
- +
- + &createMacroObjects(\%macro);
- + &createAutomacroObjects(\%automacro);
- +
- + close $fp;
- + return 0 if %block;
- + return 1
- +}
- +
- +sub createMacroObjects {
- + my ($macro) = @_;
- + my $currentMacro;
- + while (my ($name,$lines) = each %{$macro}) {
- + $currentMacro = new Macro::Macro($name, $lines);
- + $macroPlugin->{macro}->add($currentMacro);
- + } continue {
- + undef $currentMacro;
- + }
- +}
- +
- +sub createAutomacroObjects {
- + my ($automacro) = @_;
- + my $currentAutomacro;
- + my %modulesLoaded;
- + my $autoModule;
- + my %currentConditions;
- + my %currentParameters;
- + my $conditionObject;
- + AUTOMACRO: while (my ($name,$value) = each %{$automacro}) {
- +
- + ####################################
- + #####No Conditions Check
- + ####################################
- + if (!exists $value->{'conditions'} || !@{$value->{'conditions'}}) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, no condition set)\n";
- + next AUTOMACRO;
- + }
- +
- + ####################################
- + #####No Parameters Check
- + ####################################
- + if (!exists $value->{'parameters'} || !@{$value->{'parameters'}}) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, no parameter set)\n";
- + next AUTOMACRO;
- + }
- +
- + PARAMETER: foreach my $parameter (@{$value->{'parameters'}}) {
- +
- + ###Check Duplicate Parameter
- + if (exists $currentParameters{$parameter->{'key'}}) {
- + warning "Ignoring automacro '$name' (munch, munch, parameter ".$parameter->{'key'}." duplicate)\n";
- + next AUTOMACRO;
- + }
- + ###Parameter: call
- + if ($parameter->{'key'} eq "call" && !$macroPlugin->{macro}->getByName($parameter->{'value'})) {
- + warning "Ignoring automacro '$name' (munch, munch, call not a valid macro name)\n";
- + next AUTOMACRO;
- +
- + ###Parameter: delay
- + } elsif ($parameter->{'key'} eq "delay" && $parameter->{'value'} !~ /\d+/) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, delay parameter set wrong)\n";
- + next AUTOMACRO;
- +
- + ###Parameter: run-once
- + } elsif ($parameter->{'key'} eq "run-once" && $parameter->{'value'} !~ /[01]/) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, run-once parameter set wrong)\n";
- + next AUTOMACRO;
- +
- + ###Parameter: disabled
- + } elsif ($parameter->{'key'} eq "disabled" && $parameter->{'value'} !~ /[01]/) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, disabled parameter set wrong)\n";
- + next AUTOMACRO;
- +
- + ###Parameter: overrideAI
- + } elsif ($parameter->{'key'} eq "overrideAI" && $parameter->{'value'} !~ /[01]/) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, overrideAI parameter set wrong)\n";
- + next AUTOMACRO;
- +
- + ###Parameter: exclusive
- + } elsif ($parameter->{'key'} eq "exclusive" && $parameter->{'value'} !~ /[01]/) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, exclusive parameter set wrong)\n";
- + next AUTOMACRO;
- +
- + ###Parameter: priority
- + } elsif ($parameter->{'key'} eq "priority" && $parameter->{'value'} !~ /\d+/) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, priority parameter set wrong)\n";
- + next AUTOMACRO;
- +
- + ###Parameter: macro_delay
- + } elsif ($parameter->{'key'} eq "macro_delay" && $parameter->{'value'} !~ /(\d+|\d+\.\d+)/) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, macro_delay parameter set wrong)\n";
- + next AUTOMACRO;
- +
- + ###Parameter: orphan
- + } elsif ($parameter->{'key'} eq "orphan" && $parameter->{'value'} !~ /(terminate|reregister|reregister_safe)/) {
- + print AUTO "Ignoring automacro '$name' (munch, munch, orphan parameter set wrong)\n";
- + next AUTOMACRO;
- + } else {
- + $currentParameters{$parameter->{'key'}} = $parameter->{'value'};
- + }
- + }
- +
- + ###Recheck Parameter call
- + if (!exists $currentParameters{'call'}) {
- + warning "Ignoring automacro '$name' (munch, munch, no macro call set)\n";
- + next AUTOMACRO;
- + }
- +
- + ####################################
- + #####Conditions Check
- + ####################################
- + CONDITION: foreach my $condition (@{$value->{'conditions'}}) {
- + $autoModule = "Macro::Condition::".ucfirst($condition->{'key'});
- + if (!exists $modulesLoaded{$autoModule}) {
- + undef $@;
- + message "[Macro] Loading module $autoModule\n";
- + eval "use $autoModule";
- + if ($@ =~ /^Can't locate /s) {
- + FileNotFoundException->throw("Cannot load automacro module ".$autoModule." for condition ".$condition->{'key'}.". Ignoring automacro ".$name.".");
- + next AUTOMACRO;
- + } elsif ($@) {
- + ModuleLoadException->throw("An error occured while loading the automacro condition ".$condition->{'key'}.":".$@.". Ignoring automacro ".$name.".");
- + next AUTOMACRO;
- + }
- + $modulesLoaded{$autoModule} = 1;
- + }
- + $conditionObject = $autoModule->new($condition->{'value'});
- + next AUTOMACRO if (!$conditionObject);
- + next AUTOMACRO if (exists $currentConditions{$autoModule} && $conditionObject->isSingleCondition());
- + push(@{$currentConditions{$autoModule}}, $condition->{'value'});
- + } continue {
- + undef $conditionObject;
- + undef $autoModule;
- + }
- +
- + ####################################
- + #####Automacro Object Creation
- + ####################################
- + $currentAutomacro = new Macro::Automacro($name, \%currentConditions, \%currentParameters);
- + $macroPlugin->{automacro}->add($currentAutomacro);
- + } continue {
- + undef $conditionObject;
- + undef $autoModule;
- + undef $currentAutomacro;
- + undef %currentConditions;
- + undef %currentParameters;
- + }
- +}
- +
- +sub sub_execute {
- + return if $Settings::lockdown;
- +
- + my ($name, $arg) = @_;
- + my $run = "sub ".$name." {".$arg."}";
- + eval($run); # cycle the macro sub between macros only
- + $run = "eval ".$run;
- + Commands::run($run); # exporting sub to the &main::sub, becarefull on your sub name
- + # dont name your new sub equal to any &main::sub, you should take
- + # the risk yourself.
- + message "[macro] registering sub $name ...\n", "menu";
- +}
- +
- +# check if on the line there commands that open new command blocks
- +sub isNewCommandBlock {
- + my ($line) = @_;
- +
- + if ($line =~ /^if.*{$/ || $line =~ /^case.*{$/ || $line =~ /^switch.*{$/ || $line =~ /^else.*{$/) {
- + return 1;
- + } else {
- + return 0;
- + }
- +}
- +
- +sub isNewWrongCommandBlock {
- + my ($line) = @_;
- +
- + if ($_ =~ /^}\s*else\s*{$/ || $_ =~ /}\s*elsif.*{$/ || $_ =~ /^case.*{$/ || $_ =~ /^else*{$/) {
- + return 1;
- + } else {
- + return 0;
- + }
- +}
- +
- +1;
- \ No newline at end of file
- Index: Macro/Lists/Automacro.pm
- ===================================================================
- --- Macro/Lists/Automacro.pm (revision 0)
- +++ Macro/Lists/Automacro.pm (working copy)
- @@ -0,0 +1,32 @@
- +#########################################################################
- +# OpenKore - Player actor object
- +# Copyright (c) 2005 OpenKore Team
- +#
- +# TEST BY HENRYBK
- +#
- +#########################################################################
- +package Macro::Lists::Automacro;
- +
- +use strict;
- +use Globals;
- +use Macro::Lists;
- +use base qw(Macro::Lists);
- +
- +sub new {
- + my ($class) = @_;
- + my $self = $class->SUPER::new('Automacro');
- + #$self->{hooks} = Plugins::addHooks (['packet/stat_info2', sub { $self->{state} = RECV_STAT_INFO2; }]);
- + return $self;
- +}
- +
- +sub getByMacroCalled {
- + my ($self, $macroName) = @_;
- + foreach my $automacro (@{$self->getItems()}) {
- + if ($automacro->{parameters}{call} eq $macroName) {
- + return $automacro;
- + }
- + }
- + return undef;
- +}
- +
- +1;
- \ No newline at end of file
- Index: Macro/Lists/Condition.pm
- ===================================================================
- --- Macro/Lists/Condition.pm (revision 0)
- +++ Macro/Lists/Condition.pm (working copy)
- @@ -0,0 +1,32 @@
- +package Macro::Lists::Condition;
- +
- +use strict;
- +use Carp::Assert;
- +use Utils::ObjectList;
- +use base qw(ObjectList);
- +
- +sub new {
- + my ($class) = @_;
- + my $self = $class->SUPER::new();
- +
- + return $self;
- +}
- +
- +sub DESTROY {
- + my ($self) = @_;
- + Plugins::delHook($self->{hook}) if $self->{hook};
- + $self->clear();
- + $self->SUPER::DESTROY();
- +}
- +
- +sub add {
- + my ($self, $member) = @_;
- +
- + my $listIndex = $self->SUPER::add($member);
- + $member->{listIndex} = $listIndex;
- +
- + return $listIndex;
- +}
- +
- +
- +1;
- Index: Macro/Lists/Macro.pm
- ===================================================================
- --- Macro/Lists/Macro.pm (revision 0)
- +++ Macro/Lists/Macro.pm (working copy)
- @@ -0,0 +1,21 @@
- +#########################################################################
- +# OpenKore - Player actor object
- +# Copyright (c) 2005 OpenKore Team
- +#
- +# TEST BY HENRYBK
- +#
- +#########################################################################
- +package Macro::Lists::Macro;
- +
- +use strict;
- +use Globals;
- +use Macro::Lists;
- +use base qw(Macro::Lists);
- +
- +sub new {
- + my ($class) = @_;
- + my $self = $class->SUPER::new('Macro');
- + return $self;
- +}
- +
- +1;
- \ No newline at end of file
- Index: Macro/Lists.pm
- ===================================================================
- --- Macro/Lists.pm (revision 0)
- +++ Macro/Lists.pm (working copy)
- @@ -0,0 +1,104 @@
- +package Macro::Lists;
- +
- +use strict;
- +use Carp::Assert;
- +use Utils::ObjectList;
- +use base qw(ObjectList);
- +
- +### CATEGORY: Class Lists
- +
- +##
- +# Lists Macro::Lists->new()
- +# Ensures: $self->size() == 0
- +#
- +# Creates a new Lists object.
- +sub new {
- + my ($class) = @_;
- + my $self = $class->SUPER::new();
- +
- + $self->{nameIndex} = {};
- +
- + return $self;
- +}
- +
- +sub DESTROY {
- + my ($self) = @_;
- + Plugins::delHook($self->{hook}) if $self->{hook};
- + $self->clear();
- + $self->SUPER::DESTROY();
- +}
- +
- +sub add {
- + my ($self, $member) = @_;
- +
- + my $listIndex = $self->SUPER::add($member);
- + $member->{listIndex} = $listIndex;
- +
- + my $indexSlot = $self->getNameIndexSlot($member->{name});
- + push @{$indexSlot}, $listIndex;
- +
- + return $listIndex;
- +}
- +
- +sub getByName {
- + my ($self, $name) = @_;
- + my $indexSlot = $self->{nameIndex}{lc($name)};
- + if ($indexSlot) {
- + return $self->get($indexSlot->[0]);
- + } else {
- + return undef;
- + }
- +}
- +
- +sub remove {
- + my ($self, $member) = @_;
- +
- + my $result = $self->SUPER::remove($member);
- + if ($result) {
- + my $indexSlot = $self->getNameIndexSlot($member->{name});
- + for (my $i = 0; $i < @{$indexSlot}; $i++) {
- + if ($indexSlot->[$i] == $member->{listIndex}) {
- + splice(@{$indexSlot}, $i, 1);
- + last;
- + }
- + }
- + if (@{$indexSlot} == 0) {
- + delete $self->{nameIndex}{lc($member->{name})};
- + }
- + }
- + return $result;
- +}
- +
- +sub removeByName {
- + my ($self, $name) = @_;
- + my $member = $self->getByName($name);
- + if (defined $member) {
- + return $self->remove($member);
- + } else {
- + return 0;
- + }
- +}
- +
- +# overloaded
- +sub doClear {
- + my ($self) = @_;
- + $self->SUPER::doClear();
- + $self->{nameIndex} = {};
- +}
- +
- +# overloaded
- +sub checkValidity {
- + my ($self) = @_;
- + $self->SUPER::checkValidity();
- + foreach my $k (keys %{$self->{nameIndex}}) {
- + should(lc($self->getByName($k)->{name}), $k);
- + should(lc $k, $k);
- + }
- +}
- +
- +sub getNameIndexSlot {
- + my ($self, $name) = @_;
- + return $self->{nameIndex}{lc($name)} ||= [];
- +}
- +
- +1;
- Index: Macro/Lists/Automacro.pm
- ===================================================================
- --- Macro/Lists/Automacro.pm (revision 0)
- +++ Macro/Lists/Automacro.pm (working copy)
- @@ -0,0 +1,32 @@
- +#########################################################################
- +# OpenKore - Player actor object
- +# Copyright (c) 2005 OpenKore Team
- +#
- +# TEST BY HENRYBK
- +#
- +#########################################################################
- +package Macro::Lists::Automacro;
- +
- +use strict;
- +use Globals;
- +use Macro::Lists;
- +use base qw(Macro::Lists);
- +
- +sub new {
- + my ($class) = @_;
- + my $self = $class->SUPER::new('Automacro');
- + #$self->{hooks} = Plugins::addHooks (['packet/stat_info2', sub { $self->{state} = RECV_STAT_INFO2; }]);
- + return $self;
- +}
- +
- +sub getByMacroCalled {
- + my ($self, $macroName) = @_;
- + foreach my $automacro (@{$self->getItems()}) {
- + if ($automacro->{parameters}{call} eq $macroName) {
- + return $automacro;
- + }
- + }
- + return undef;
- +}
- +
- +1;
- \ No newline at end of file
- Index: Macro/Lists/Condition.pm
- ===================================================================
- --- Macro/Lists/Condition.pm (revision 0)
- +++ Macro/Lists/Condition.pm (working copy)
- @@ -0,0 +1,32 @@
- +package Macro::Lists::Condition;
- +
- +use strict;
- +use Carp::Assert;
- +use Utils::ObjectList;
- +use base qw(ObjectList);
- +
- +sub new {
- + my ($class) = @_;
- + my $self = $class->SUPER::new();
- +
- + return $self;
- +}
- +
- +sub DESTROY {
- + my ($self) = @_;
- + Plugins::delHook($self->{hook}) if $self->{hook};
- + $self->clear();
- + $self->SUPER::DESTROY();
- +}
- +
- +sub add {
- + my ($self, $member) = @_;
- +
- + my $listIndex = $self->SUPER::add($member);
- + $member->{listIndex} = $listIndex;
- +
- + return $listIndex;
- +}
- +
- +
- +1;
- Index: Macro/Lists/Macro.pm
- ===================================================================
- --- Macro/Lists/Macro.pm (revision 0)
- +++ Macro/Lists/Macro.pm (working copy)
- @@ -0,0 +1,21 @@
- +#########################################################################
- +# OpenKore - Player actor object
- +# Copyright (c) 2005 OpenKore Team
- +#
- +# TEST BY HENRYBK
- +#
- +#########################################################################
- +package Macro::Lists::Macro;
- +
- +use strict;
- +use Globals;
- +use Macro::Lists;
- +use base qw(Macro::Lists);
- +
- +sub new {
- + my ($class) = @_;
- + my $self = $class->SUPER::new('Macro');
- + return $self;
- +}
- +
- +1;
- \ No newline at end of file
- Index: Macro/Macro.pm
- ===================================================================
- --- Macro/Macro.pm (revision 0)
- +++ Macro/Macro.pm (working copy)
- @@ -0,0 +1,16 @@
- +package Macro::Macro;
- +
- +use strict;
- +
- +sub new {
- + my ($class, $name, $lines) = @_;
- + my $self = {
- + name => $name,
- + lines => $lines,
- + listIndex => -1
- + };
- + bless $self, $class;
- + return $self;
- +}
- +
- +1;
- \ No newline at end of file
- Index: Macro/Parser.pm
- ===================================================================
- --- Macro/Parser.pm (revision 8992)
- +++ Macro/Parser.pm (working copy)
- @@ -6,8 +6,8 @@
- require Exporter;
- our @ISA = qw(Exporter);
- -our @EXPORT = qw(parseMacroFile parseCmd isNewCommandBlock);
- -our @EKSPORT_OK = qw(parseCmd isNewCommandBlock);
- +our @EXPORT = qw(parseCmd);
- +our @EKSPORT_OK = qw(parseCmd);
- use Globals;
- use Utils qw/existsInList/;
- @@ -21,187 +21,6 @@
- our ($rev) = q$Revision: 6759 $ =~ /(\d+)/;
- -my $tempmacro = 0;
- -
- -# adapted config file parser
- -sub parseMacroFile {
- - my ($file, $no_undef) = @_;
- - unless ($no_undef) {
- - undef %macro;
- - undef %automacro;
- - undef @perl_name
- - }
- -
- - my %block;
- - my $inBlock = 0;
- - my $macroCountOpenBlock = 0;
- - my ($macro_subs, @perl_lines);
- - open my $fp, "<:utf8", $file or return 0;
- - while (<$fp>) {
- - $. == 1 && s/^\x{FEFF}//; # utf bom
- - s/(.*)[\s\t]+#.*$/$1/; # remove last comments
- - s/^\s*#.*$//; # remove comments
- - s/^\s*//; # remove leading whitespaces
- - s/\s*[\r\n]?$//g; # remove trailing whitespaces and eol
- - s/ +/ /g; # trim down spaces - very cool for user's string data?
- - next unless ($_);
- -
- - if (!%block && /{$/) {
- - my ($key, $value) = $_ =~ /^(.*?)\s+(.*?)\s*{$/;
- - if ($key eq 'macro') {
- - %block = (name => $value, type => "macro");
- - $macro{$value} = []
- - } elsif ($key eq 'automacro') {
- - %block = (name => $value, type => "auto")
- - } elsif ($key eq 'sub') {
- - %block = (name => $value, type => "sub")
- - } else {
- - %block = (type => "bogus");
- - warning "$file: ignoring line '$_' in line $. (munch, munch, strange block)\n"
- - }
- - next
- - }
- -
- - if (%block && $block{type} eq "macro") {
- - if ($_ eq "}") {
- - if ($macroCountOpenBlock) { # If the '}' is being used to terminate a block of commands from 'if'
- - push(@{$macro{$block{name}}}, '}');
- -
- - if ($macroCountOpenBlock) {
- - $macroCountOpenBlock--;
- - }
- - } else {
- - undef %block
- - }
- - } else {
- - if (isNewCommandBlock($_)) {
- - $macroCountOpenBlock++
- - } elsif (!$macroCountOpenBlock && ($_ =~ /^}\s*else\s*{$/ || $_ =~ /}\s*elsif.*{$/ || $_ =~ /^case.*{$/ || $_ =~ /^else*{$/)) {
- - warning "$file: ignoring '$_' in line $. (munch, munch, not found the open block command)\n";
- - next
- - }
- -
- - push(@{$macro{$block{name}}}, $_);
- - }
- -
- - next
- - }
- -
- - if (%block && $block{type} eq "auto") {
- - if ($_ eq "}") {
- - if ($block{loadmacro}) {
- - if ($macroCountOpenBlock) {
- - push(@{$macro{$block{loadmacro_name}}}, '}');
- -
- - if ($macroCountOpenBlock) {
- - $macroCountOpenBlock--;
- - }
- - } else {
- - undef $block{loadmacro}
- - }
- - } else {
- - undef %block
- - }
- - } elsif ($_ eq "call {") {
- - $block{loadmacro} = 1;
- - $block{loadmacro_name} = "tempMacro".$tempmacro++;
- - $automacro{$block{name}}->{call} = $block{loadmacro_name};
- - $macro{$block{loadmacro_name}} = []
- - } elsif ($block{loadmacro}) {
- - if (isNewCommandBlock($_)) {
- - $macroCountOpenBlock++
- - } elsif (!$macroCountOpenBlock && ($_ =~ /^}\s*else\s*{$/ || $_ =~ /}\s*elsif.*{$/ || $_ =~ /^case.*{$/ || $_ =~ /^else*{$/)) {
- - warning "$file: ignoring '$_' in line $. (munch, munch, not found the open block command)\n";
- - next
- - }
- -
- - push(@{$macro{$block{loadmacro_name}}}, $_);
- - } else {
- - my ($key, $value) = $_ =~ /^(.*?)\s+(.*)/;
- - unless (defined $key) {
- - warning "$file: ignoring '$_' in line $. (munch, munch, not a pair)\n";
- - next
- - }
- - if ($amSingle{$key}) {
- - $automacro{$block{name}}->{$key} = $value
- - } elsif ($amMulti{$key}) {
- - push(@{$automacro{$block{name}}->{$key}}, $value)
- - } else {
- - warning "$file: ignoring '$_' in line $. (munch, munch, unknown automacro keyword)\n"
- - }
- - }
- -
- - next
- - }
- -
- - if (%block && $block{type} eq "sub") {
- - if ($_ eq "}") {
- - if ($inBlock > 0) {
- - push(@perl_lines, $_);
- - $inBlock--;
- - next
- - }
- - $macro_subs = join('', @perl_lines);
- - sub_execute($block{name}, $macro_subs);
- - push(@perl_name, $block{name}) unless existsInList(join(',', @perl_name), $block{name});
- - undef %block; undef @perl_lines; undef $macro_subs;
- - $inBlock = 0
- - }
- - elsif ($_ =~ /^}.*?{$/ && $inBlock > 0) {push(@perl_lines, $_)}
- - elsif ($_ =~ /{$/) {$inBlock++; push(@perl_lines, $_)}
- - else {push(@perl_lines, $_)}
- - next
- - }
- -
- - if (%block && $block{type} eq "bogus") {
- - if ($_ eq "}") {undef %block}
- - next
- - }
- -
- - my ($key, $value) = $_ =~ /(?:^(.*?)\s|})+(.*)/;
- - unless (defined $key) {
- - warning "$file: ignoring '$_' in line $. (munch, munch, strange food)\n";
- - next
- - }
- -
- - if ($key eq "!include") {
- - my $f = $value;
- - if (!File::Spec->file_name_is_absolute($value) && $value !~ /^\//) {
- - if ($file =~ /[\/\\]/) {
- - $f = $file;
- - $f =~ s/(.*)[\/\\].*/$1/;
- - $f = File::Spec->catfile($f, $value)
- - } else {
- - $f = $value
- - }
- - }
- - if (-f $f) {
- - my $ret = parseMacroFile($f, 1);
- - return $ret unless $ret
- - } else {
- - error "$file: Include file not found: $f\n";
- - return 0
- - }
- - }
- - }
- - #close $fp;
- - return 0 if %block;
- - return 1
- -}
- -
- -sub sub_execute {
- - return if $Settings::lockdown;
- -
- - my ($name, $arg) = @_;
- - my $run = "sub ".$name." {".$arg."}";
- - eval($run); # cycle the macro sub between macros only
- - $run = "eval ".$run;
- - Commands::run($run); # exporting sub to the &main::sub, becarefull on your sub name
- - # dont name your new sub equal to any &main::sub, you should take
- - # the risk yourself.
- - message "[macro] registering sub $name ...\n", "menu";
- -}
- -
- # parses a text for keywords and returns keyword + argument as array
- # should be an adequate workaround for the parser bug
- #sub parseKw {
- @@ -262,10 +81,10 @@
- my ($var, $tmp);
- # variables
- - $pre =~ s/(?:^|(?<=[^\\]))\$(\.?[a-z][a-z\d]*)/defined $varStack{$1} ? $varStack{$1} : ''/gei;
- + $pre =~ s/(?:^|(?<=[^\\]))\$(\.?[a-z][a-z\d]*)/$macroPlugin->isVarDefined($1) ? $macroPlugin->getVar($1) : ''/gei;
- =pod
- while (($var) = $pre =~ /(?:^|[^\\])\$(\.?[a-z][a-z\d]*)/i) {
- - $tmp = (defined $varStack{$var})?$varStack{$var}:"";
- + $tmp = $macroPlugin->isVarDefined($var) ? $macroPlugin->getVar($var):"";
- $var = q4rx $var;
- $pre =~ s/(^|[^\\])\$$var([^a-zA-Z\d]|$)/$1$tmp$2/g;
- last if defined $nick
- @@ -273,10 +92,10 @@
- =cut
- # doublevars
- - $pre =~ s/\$\{(.*?)\}/defined $varStack{"#$1"} ? $varStack{"#$1"} : ''/gei;
- + $pre =~ s/\$\{(.*?)\}/$macroPlugin->isVarDefined("#$1") ? $macroPlugin->getVar("#$1") : ''/gei;
- =pod
- while (($var) = $pre =~ /\$\{(.*?)\}/i) {
- - $tmp = (defined $varStack{"#$var"})?$varStack{"#$var"}:"";
- + $tmp = ($macroPlugin->isVarDefined("#$var"))?$macroPlugin->getVar("#$var"):"";
- $var = q4rx $var;
- $pre =~ s/\$\{$var\}/$tmp/g
- }
- @@ -362,15 +181,4 @@
- return $cmd
- }
- -# check if on the line there commands that open new command blocks
- -sub isNewCommandBlock {
- - my ($line) = @_;
- -
- - if ($line =~ /^if.*{$/ || $line =~ /^case.*{$/ || $line =~ /^switch.*{$/ || $line =~ /^else.*{$/) {
- - return 1;
- - } else {
- - return 0;
- - }
- -}
- -
- 1;
- Index: Macro/Plugin.pm
- ===================================================================
- --- Macro/Plugin.pm (revision 0)
- +++ Macro/Plugin.pm (working copy)
- @@ -0,0 +1,246 @@
- +package Macro::Plugin;
- +
- +use strict;
- +use Globals;
- +use Log qw(message error warning);
- +use base qw(Actor);
- +use Macro::Data;
- +use Macro::Lists;
- +use Macro::Lists::Macro;
- +use Macro::Lists::Automacro;
- +use Macro::Utilities qw(callMacro);
- +use Macro::Script;
- +use Utils;
- +
- +sub new {
- + my ($class) = @_;
- + my $self = bless {}, $class;
- + $self->{macro} = new Macro::Lists::Macro();
- + $self->{automacro} = new Macro::Lists::Automacro();
- + $self->{macroVars} = {};
- + $self->{queue} = undef;
- + $self->{paused} = 0;
- + $self->{eventHooks} = {};
- + $self->{eventVariables} = {};
- + $self->{hooks} = [];
- + return $self;
- +}
- +
- +sub cleanHooks {
- + my ($self) = @_;
- + foreach (@{$self->{hooks}}) {Plugins::delHook($_)}
- +}
- +
- +sub reload {
- + my ($self) = @_;
- + $self->cleanHooks();
- + $self->{macro} = new Macro::Lists::Macro();
- + $self->{automacro} = new Macro::Lists::Automacro();
- + $self->{eventHooks} = undef;
- + $self->{eventVariables} = undef;
- + $self->{hooks} = undef;
- +}
- +
- +sub isOnQueue {
- + my ($self) = @_;
- + return (defined $self->{queue})?1:0;
- +}
- +
- +sub clearQueue {
- + my ($self) = @_;
- + undef $self->{queue} if defined $self->{queue};
- + message "macro queue cleared.\n";
- + return;
- +}
- +
- +sub isPaused {
- + my ($self) = @_;
- + if (!defined $self->{queue}) {
- + warning "There's no macro currently running.\n";
- + } else {
- + return $self->{paused}?1:0;
- + }
- + return undef;
- +}
- +
- +sub pauseMacro {
- + my ($self) = @_;
- + if (!defined $self->{queue}) {
- + warning "There's no macro currently running.\n";
- + } elsif ($self->{paused} == 1) {
- + warning "macro ".$self->{queue}->name." is already paused.\n";
- + } else {
- + $self->{paused} = 1;
- + message "macro ".$self->{queue}->name." paused.\n";
- + }
- + return;
- +}
- +
- +sub resumeMacro {
- + my ($self) = @_;
- + if (!defined $self->{queue}) {
- + warning "There's no macro currently running.\n";
- + } elsif ($self->{paused} == 0) {
- + warning "macro ".$self->{queue}->name." is not paused.\n";
- + } else {
- + $self->{paused} = 0;
- + message "macro ".$self->{queue}->name." resumed.\n";
- + }
- + return;
- +}
- +
- +# only adds hooks that are needed
- +sub hookOnDemand {
- + my ($self) = @_;
- + my %firstHookHash;
- + my %firstVarHash;
- + my ($autoIndex, $autoPriority, $condIndex, %autoHooks, %autoVars);
- + foreach my $automacro (@{$self->{automacro}->getItems()}) {
- + $autoIndex = $automacro->{listIndex};
- + $autoPriority = $automacro->getParameter('priority');
- + if (exists $automacro->{hooks}) {
- + %autoHooks = %{$automacro->{hooks}};
- + while (my ($hook,$condIndexes) = each %autoHooks) {
- + $firstHookHash{$hook}{$autoIndex}{'autoIndex'} = $autoIndex;
- + $firstHookHash{$hook}{$autoIndex}{'priority'} = $autoPriority;
- + foreach my $condIndex (@{$condIndexes}) {
- + push (@{$firstHookHash{$hook}{$autoIndex}{indexes}}, $condIndex);
- + }
- + }
- + }
- + if (exists $automacro->{variables}) {
- + %autoVars = %{$automacro->{variables}};
- + while (my ($varName,$condIndexes) = each %autoVars) {
- + $firstVarHash{$varName}{$autoIndex}{'autoIndex'} = $autoIndex;
- + $firstVarHash{$varName}{$autoIndex}{'priority'} = $autoPriority;
- + foreach my $condIndex (@{$condIndexes}) {
- + push (@{$firstVarHash{$varName}{$autoIndex}{indexes}}, $condIndex);
- + }
- + }
- + }
- + } continue {
- + undef $autoIndex;
- + undef $condIndex;
- + undef $autoPriority;
- + undef %autoHooks;
- + undef %autoVars;
- + }
- +
- + my @hookArray;
- + while (my ($hook,$autoIndexes) = each %firstHookHash) {
- + @hookArray = sort {$autoIndexes->{$a}->{'priority'} <=> $autoIndexes->{$b}->{'priority'}} keys %{$autoIndexes};
- + foreach (@hookArray) {
- + push (@{$self->{eventHooks}{$hook}}, $autoIndexes->{$_});
- + }
- + push(@{$self->{hooks}}, Plugins::addHook($hook, \&automacroCheck, $self));
- + }
- +
- + my @varArray;
- + while (my ($varName,$autoIndexes) = each %firstVarHash) {
- + @varArray = sort {$autoIndexes->{$a}->{'priority'} <=> $autoIndexes->{$b}->{'priority'}} keys %{$autoIndexes};
- + foreach (@varArray) {
- + push (@{$self->{eventVariables}{$varName}}, $autoIndexes->{$_});
- + }
- + }
- +}
- +
- +sub isVarDefined {
- + my ($self, $varName) = @_;
- + return (exists $self->{macroVars}{$varName} && defined $self->{macroVars}{$varName});
- +}
- +
- +sub existsVar {
- + my ($self, $varName) = @_;
- + return exists $self->{macroVars}{$varName};
- +}
- +
- +sub getVar {
- + my ($self, $varName) = @_;
- + if (exists $self->{macroVars}{$varName}) {
- + return $self->{macroVars}{$varName};
- + } else {
- + return undef;
- + }
- +}
- +
- +sub setVarValue {
- + my ($self, $varName, $varValue) = @_;
- + $self->{macroVars}{$varName} = $varValue;
- + if (exists $self->{eventVariables}{$varName}) {
- + &automacroCheck("var", {name => $varName, value => $varValue}, $self);
- + }
- +}
- +
- +sub undefVar {
- + my ($self, $varName) = @_;
- + $self->{macroVars}{$varName} = undef;
- +}
- +
- +sub deleteVar {
- + my ($self, $varName) = @_;
- + if (exists $self->{macroVars}{$varName}) {
- + delete $self->{macroVars}{$varName};
- + } else {
- + warning "[Macro] Variable $varName cannot be deleted because it doesn't exist";
- + }
- +}
- +
- +sub automacroCheck {
- + my ($event, $args, $self) = @_;
- + my @returnedTrue;
- + my $returnTry;
- +
- +
- + use Data::Dumper;
- + open DUMP, ">:utf8", "dump.txt" or die $!;
- + print DUMP Dumper($self);
- + close(DUMP);
- +
- + if ($event ne "var") {
- + foreach my $automacro (@{$self->{eventHooks}{$event}}) {
- + $returnTry = 1;
- + foreach my $conditionIndex (@{$automacro->{indexes}}) {
- + unless ($self->{automacro}->get($automacro->{autoIndex})->{conditionList}->get($conditionIndex)->check($event,$args)) {
- + $returnTry = 0;
- + }
- + }
- + if ($returnTry && $self->{automacro}->get($automacro->{autoIndex})->isActive()) {
- + push (@returnedTrue, $automacro->{autoIndex});
- + }
- + }
- + } else {
- + foreach my $automacro (@{$self->{eventVariables}{$args->{name}}}) {
- + $returnTry = 1;
- + foreach my $conditionIndex (@{$automacro->{indexes}}) {
- + unless ($self->{automacro}->get($automacro->{autoIndex})->{conditionList}->get($conditionIndex)->check($event,$args)) {
- + $returnTry = 0;
- + }
- + }
- + if ($returnTry && $self->{automacro}->get($automacro->{autoIndex})->isActive()) {
- + push (@returnedTrue, $automacro->{autoIndex});
- + }
- + }
- + }
- +
- + return if (defined $self->{queue} && !$self->{queue}->interruptible);
- + foreach my $index (@returnedTrue) {
- + next unless ($self->{automacro}->get($index)->check());
- + undef $self->{queue} if defined $self->{queue};
- + $self->{queue} = new Macro::Script($self->{automacro}->get($index)->getParameter('call'));
- + if (defined $self->{queue}) {
- + $self->{queue}->overrideAI(1) if $self->{automacro}->get($index)->getParameter('overrideAI');
- + $self->{queue}->interruptible(0) if $self->{automacro}->get($index)->getParameter('exclusive');
- + $self->{queue}->orphan($self->{automacro}->get($index)->getParameter('orphan')) if $self->{automacro}->get($index)->getParameter('orphan');
- + $self->{queue}->timeout($self->{automacro}->get($index)->getParameter('delay')) if $self->{automacro}->get($index)->getParameter('delay');
- + $self->{queue}->setMacro_delay($self->{automacro}->get($index)->getParameter('macro_delay')) if $self->{automacro}->get($index)->getParameter('macro_delay');
- + $self->setVarValue(".caller", $self->{automacro}->get($index)->{name});
- + $self->{paused} = 0;
- + &callMacro;
- + } else {
- + error "unable to create macro queue.\n"
- + }
- + return;
- + }
- +}
- +
- +1;
- Index: Macro/Script.pm
- ===================================================================
- --- Macro/Script.pm (revision 8992)
- +++ Macro/Script.pm (working copy)
- @@ -10,7 +10,9 @@
- use Globals;
- use AI;
- use Macro::Data;
- -use Macro::Parser qw(parseCmd isNewCommandBlock);
- +use Macro::Plugin;
- +use Macro::Parser qw(parseCmd);
- +use Macro::FileParser qw(isNewCommandBlock);
- use Macro::Utilities qw(cmpr);
- use Macro::Automacro qw(releaseAM lockAM);
- use Log qw(message warning);
- @@ -17,12 +19,14 @@
- our ($rev) = q$Revision: 6782 $ =~ /(\d+)/;
- +my %macro;
- +
- # constructor
- sub new {
- my ($class, $name, $repeat, $lastname, $lastline, $interruptible) = @_;
- $repeat = 0 unless ($repeat && $repeat =~ /^\d+$/);
- - return unless defined $macro{$name};
- + $macro{$name} = $macroPlugin->{macro}->getByName($name)->{'lines'};
- my $self = {
- name => $name,
- lastname => undef,
- @@ -380,79 +384,38 @@
- $self->{line}++;
- $self->{timeout} = 0
- ##########################################
- - # pop value from variable: $var = [$list]
- - } elsif ($line =~ /^\$[a-z][a-z\d]*\s+=\s+\[\s*\$[a-z][a-z\d]*\s*\]$/i) {
- - if ($line =~ /;/) {run_sublines($line, $self); if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}}
- - else {
- - my ($var, $list) = $line =~ /^\$([a-z][a-z\d]*?)\s+=\s+\[\s*\$([a-z][a-z\d]*?)\s*\]$/i;
- - my $listitems = ($varStack{$list} or "");
- - my $val;
- - if (($val) = $listitems =~ /^(.*?)(?:,|$)/) {
- - $listitems =~ s/^(?:.*?)(?:,|$)//;
- - $varStack{$list} = $listitems
- - }
- - else {$val = $listitems}
- - $varStack{$var} = $val;
- - }
- - $self->{line}++;
- - $self->{timeout} = 0 unless defined $self->{mainline_delay} && defined $self->{subline_delay};
- - return $self->{result} if $self->{result}
- - ##########################################
- # set variable: $variable = value
- } elsif ($line =~ /^\$[a-z]/i) {
- my ($var, $val);
- - if ($line =~ /;/) {run_sublines($line, $self); if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}}
- - else {
- + if ($line =~ /;/) {run_sublines($line, $self); if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
- + } else {
- if (($var, $val) = $line =~ /^\$([a-z][a-z\d]*?)\s+=\s+(.*)/i) {
- my $pval = parseCmd($val, $self);
- if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
- if (defined $pval) {
- - if ($pval =~ /^\s*(?:undef|unset)\s*$/i && exists $varStack{$var}) {undef $varStack{$var}}
- - else {$varStack{$var} = $pval}
- + if ($pval =~ /^\s*(?:undef|unset)\s*$/i && $macroPlugin->existsVar($var)) {$macroPlugin->undefVar($var)}
- + else {$macroPlugin->setVarValue($var, $pval);}
- }
- else {$self->{error} = "$errtpl: $val failed"}
- - }
- - elsif (($var, $val) = $line =~ /^\$([a-z][a-z\d]*?)([+-]{2})$/i) {
- - if ($val eq '++') {$varStack{$var} = ($varStack{$var} or 0)+1}
- - else {$varStack{$var} = ($varStack{$var} or 0)-1}
- - }
- - else {$self->{error} = "$errtpl: unrecognized assignment"}
- - }
- - $self->{line}++;
- - $self->{timeout} = 0 unless defined $self->{mainline_delay} && defined $self->{subline_delay};
- - return $self->{result} if $self->{result}
- - ##########################################
- - # set doublevar: ${$variable} = value
- - } elsif ($line =~ /^\$\{\$[.a-z]/i) {
- - my ($dvar, $val);
- - if ($line =~ /;/) {run_sublines($line, $self); if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}}
- - else {
- - if (($dvar, $val) = $line =~ /^\$\{\$([.a-z][a-z\d]*?)\}\s+=\s+(.*)/i) {
- - my $var = $varStack{$dvar};
- - unless (defined $var) {$self->{error} = "$errtpl: $dvar not defined"}
- - else {
- - my $pval = parseCmd($val, $self);
- - if (defined $self->{error}) {$self->{error} = "$errtpl: $self->{error}"; return}
- - unless (defined $pval) {$self->{error} = "$errtpl: $val failed"}
- - else {
- - if ($pval =~ /^\s*(?:undef|unset)\s*$/i) {undef $varStack{"#$var"}}
- - else {$varStack{"#$var"} = $pval}
- + } elsif (($var, $val) = $line =~ /^\$([a-z][a-z\d]*?)([+-]{2})$/i) {
- + if ($val eq '++') {
- + if ($macroPlugin->isVarDefined($var)) {
- + $macroPlugin->setVarValue($var, ($macroPlugin->getVar($var)+1));
- + } else {
- + $macroPlugin->setVarValue($var, 1);
- }
- + } else {
- + if ($macroPlugin->isVarDefined($var)) {
- + $macroPlugin->setVarValue($var, ($macroPlugin->getVar($var)-1));
- + } else {
- + $macroPlugin->setVarValue($var, -1);
- + }
- }
- - }
- - elsif (($dvar, $val) = $line =~ /^\$\{\$([.a-z][a-z\d]*?)\}([+-]{2})$/i) {
- - my $var = $varStack{$dvar};
- - unless (defined $var) {$self->{error} = "$errtpl: $dvar undefined"}
- - else {
- - if ($val eq '++') {$varStack{"#$var"} = ($varStack{"#$var"} or 0)+1}
- - else {$varStack{"#$var"} = ($varStack{"#$var"} or 0)-1}
- - }
- - }
- - else {$self->{error} = "$errtpl: unrecognized assignment."}
- - }
- + } else {$self->{error} = "$errtpl: unrecognized assignment"}
- $self->{line}++;
- $self->{timeout} = 0 unless defined $self->{mainline_delay} && defined $self->{subline_delay};
- return $self->{result} if $self->{result}
- + }
- ##########################################
- # label definition: :label
- } elsif ($line =~ /^:/) {
- @@ -585,8 +548,8 @@
- } else {
- my @new_params = substr($cparms, 2) =~ /"[^"]+"|\S+/g;
- foreach my $p (1..@new_params) {
- - $varStack{".param".$p} = $new_params[$p-1];
- - $varStack{".param".$p} = substr($varStack{".param".$p}, 1, -1) if ($varStack{".param".$p} =~ /^".*"$/); # remove quotes
- + $macroPlugin->setVarValue(".param".$p,$new_params[$p-1]);
- + $macroPlugin->setVarValue(".param".$p,substr($macroPlugin->getVar(".param".$p), 1, -1)) if ($macroPlugin->getVar(".param".$p) =~ /^".*"$/);
- }
- $self->{subcall}->regSubmacro;
- @@ -652,60 +615,35 @@
- $i++; next
- }
- - ##########################################
- - # pop value from variable: $var = [$list]
- - if ($e =~ /^\$[a-z][a-z\d]*\s+=\s+\[\s*\$[a-z][a-z\d]*\s*\]$/i) {
- - ($var, $list) = $e =~ /^\$([a-z][a-z\d]*?)\s+=\s+\[\s*\$([a-z][a-z\d]*?)\s*\]$/i;
- - my $listitems = ($varStack{$list} or "");
- - if (($val) = $listitems =~ /^(.*?)(?:,|$)/) {
- - $listitems =~ s/^(?:.*?)(?:,|$)//;
- - $varStack{$list} = $listitems
- - }
- - else {$val = $listitems}
- - $varStack{$var} = $val;
- - $i++; next
- -
- +
- # set variable: $variable = value
- - } elsif ($e =~ /^\$[a-z]/i) {
- + if ($e =~ /^\$[a-z]/i) {
- if (($var, $val) = $e =~ /^\$([a-z][a-z\d]*?)\s+=\s+(.*)/i) {
- my $pval = parseCmd($val, $self);
- if (defined $self->{error}) {$self->{error} = "Error in line $real_num: $real_line\n[macro] $self->{name} error in sub-line $i: $self->{error}"; last}
- if (defined $pval) {
- - if ($pval =~ /^\s*(?:undef|unset)\s*$/i && exists $varStack{$var}) {undef $varStack{$var}}
- - else {$varStack{$var} = $pval}
- + if ($pval =~ /^\s*(?:undef|unset)\s*$/i && $macroPlugin->existsVar($var)) {$macroPlugin->undefVar($var)}
- + else {$macroPlugin->setVarValue($var,$pval)}
- }
- else {$self->{error} = "Error in line $real_num: $real_line\n[macro] $self->{name} error in sub-line $i: $e failed"; last}
- }
- elsif (($var, $val) = $e =~ /^\$([a-z][a-z\d]*?)([+-]{2})$/i) {
- - if ($val eq '++') {$varStack{$var} = ($varStack{$var} or 0)+1} else {$varStack{$var} = ($varStack{$var} or 0)-1}
- - }
- - else {$self->{error} = "Error in line $real_num: $real_line\n[macro] $self->{name} error in sub-line $i: unrecognized assignment in ($e)"; last}
- - $i++; next
- -
- - # set doublevar: ${$variable} = value
- - } elsif ($e =~ /^\$\{\$[.a-z]/i) {
- - if (($dvar, $val) = $e =~ /^\$\{\$([.a-z][a-z\d]*?)\}\s+=\s+(.*)/i) {
- - $var = $varStack{$dvar};
- - unless (defined $var) {$self->{error} = "Error in line $real_num: $real_line\n[macro] $self->{name} error in sub-line $i: $dvar not defined in ($e)"; last}
- - else {
- - my $pval = parseCmd($val, $self);
- - if (defined $self->{error}) {$self->{error} = "Error in line $real_num: $real_line\n[macro] $self->{name} error in sub-line $i: $self->{error}"; last}
- - unless (defined $pval) {$self->{error} = "Error in line $real_num: $real_line\n[macro] $self->{name} error in sub-line $i: $e failed"; last}
- - else {
- - if ($pval =~ /^\s*(?:undef|unset)\s*$/i) {undef $varStack{"#$var"}}
- - else {$varStack{"#$var"} = $pval}
- + if ($val eq '++') {
- + if ($macroPlugin->isVarDefined($var)) {
- + $macroPlugin->setVarValue($var, ($macroPlugin->getVar($var)+1));
- + } else {
- + $macroPlugin->setVarValue($var, 1);
- }
- + } else {
- + if ($macroPlugin->isVarDefined($var)) {
- + $macroPlugin->setVarValue($var, ($macroPlugin->getVar($var)-1));
- + } else {
- + $macroPlugin->setVarValue($var, -1);
- + }
- }
- }
- - elsif (($dvar, $val) = $e =~ /^\$\{\$([.a-z][a-z\d]*?)\}([+-]{2})$/i) {
- - $var = $varStack{$dvar};
- - unless (defined $var) {$self->{error} = "Error in line $real_num: $real_line\n[macro] $self->{name} error in sub-line $i: undefined $dvar in ($e)"; last}
- - else {if ($val eq '++') {$varStack{"#$var"} = ($varStack{"#$var"} or 0)+1} else {$varStack{"#$var"} = ($varStack{"#$var"} or 0)-1}}
- - $i++; next
- - }
- else {$self->{error} = "Error in line $real_num: $real_line\n[macro] $self->{name} error in sub-line $i: unrecognized assignment in ($e)"; last}
- $i++; next
- -
- # stop command
- } elsif ($e eq "stop") {
- $self->{finished} = 1; last
- Index: Macro/Utilities.pm
- ===================================================================
- --- Macro/Utilities.pm (revision 8992)
- +++ Macro/Utilities.pm (working copy)
- @@ -20,31 +20,31 @@
- # own ai_Isidle check that excludes deal
- sub ai_isIdle {
- - return 1 if $queue->overrideAI;
- + return 1 if $macroPlugin->{queue}->overrideAI;
- # now check for orphaned script object
- # may happen when messing around with "ai clear" and stuff.
- - if (defined $queue && !AI::inQueue('macro')) {
- - my $method = $queue->orphan;
- + if (defined $macroPlugin->{queue} && !AI::inQueue('macro')) {
- + my $method = $macroPlugin->{queue}->orphan;
- # 'terminate' undefs the macro object and returns "ai is not idle"
- if ($method eq 'terminate') {
- - undef $queue;
- + undef $macroPlugin->{queue};
- return 0
- # 'reregister' re-inserts "macro" in ai_queue at the first position
- } elsif ($method eq 'reregister') {
- - $queue->register;
- + $macroPlugin->{queue}->register;
- return 1
- # 'reregister_safe' waits until AI is idle then re-inserts "macro"
- } elsif ($method eq 'reregister_safe') {
- if (AI::isIdle || AI::is('deal')) {
- - $queue->register;
- + $macroPlugin->{queue}->register;
- return 1
- }
- return 0
- } else {
- error "unknown 'orphan' method. terminating macro\n", "macro";
- - undef $queue;
- + undef $macroPlugin->{queue};
- return 0
- }
- }
- @@ -142,7 +142,7 @@
- if ($text =~ /$1/ || ($2 eq 'i' && $text =~ /$1/i)) {
- if (!defined $cmpr) {
- no strict;
- - foreach my $idx (1..$#-) {$varStack{".lastMatch$idx"} = ${$idx}}
- + foreach my $idx (1..$#-) {$macroPlugin->setVarValue(".lastMatch$idx",${$idx})}
- use strict;
- }
- return 1
- @@ -171,7 +171,7 @@
- if ($wordno =~ /^\$/) {
- my ($val) = $wordno =~ /^\$([a-zA-Z][a-zA-Z\d]*)\s*$/;
- return "" unless defined $val;
- - if (exists $varStack{$val} && $varStack{$val} =~ /^[1-9][0-9]*$/) {$wordno = $varStack{$val}}
- + if ($macroPlugin->existsVar($val) && $macroPlugin->getVar($val) =~ /^[1-9][0-9]*$/) {$wordno = $macroPlugin->getVar($val)}
- else {return ""}
- }
- @@ -212,28 +212,32 @@
- sub refreshGlobal {
- my $var = $_[0];
- - $varStack{".time"} = time;
- - $varStack{".datetime"} = scalar localtime;
- - ($varStack{".second"}, $varStack{".minute"}, $varStack{".hour"}) = localtime;
- + $macroPlugin->setVarValue(".time", time);
- + $macroPlugin->setVarValue(".datetime", scalar localtime);
- + my ($sec, $min, $hour) = localtime;
- + $macroPlugin->setVarValue(".second", $sec);
- + $macroPlugin->setVarValue(".minute", $min);
- + $macroPlugin->setVarValue(".hour", $hour);
- return unless $net && $net->getState == Network::IN_GAME;
- - $varStack{".map"} = (defined $field)?$field->baseName:"undef";
- - my $pos = calcPosition($char); $varStack{".pos"} = sprintf("%d %d", $pos->{x}, $pos->{y});
- + $macroPlugin->setVarValue(".map", (defined $field)?$field->baseName:"undef");
- + my $pos = calcPosition($char);
- + $macroPlugin->setVarValue(".pos", sprintf("%d %d", $pos->{x}, $pos->{y}));
- - $varStack{".hp"} = $char->{hp};
- - $varStack{".sp"} = $char->{sp};
- - $varStack{".lvl"} = $char->{lv};
- - $varStack{".joblvl"} = $char->{lv_job};
- - $varStack{".spirits"} = ($char->{spirits} or 0);
- - $varStack{".zeny"} = $char->{zeny};
- - $varStack{".weight"} = $char->{weight};
- - $varStack{".maxweight"} = $char->{weight_max};
- - $varStack{'.status'} = (join ',',
- + $macroPlugin->setVarValue(".hp", $char->{hp});
- + $macroPlugin->setVarValue(".sp", $char->{sp});
- + $macroPlugin->setVarValue(".lvl", $char->{lv});
- + $macroPlugin->setVarValue(".joblvl", $char->{lv_job});
- + $macroPlugin->setVarValue(".spirits", ($char->{spirits} or 0));
- + $macroPlugin->setVarValue(".zeny", $char->{zeny});
- + $macroPlugin->setVarValue(".weight", $char->{weight});
- + $macroPlugin->setVarValue(".maxweight", $char->{weight_max});
- + $macroPlugin->setVarValue('.status', (join ',',
- ('muted')x!!$char->{muted},
- ('dead')x!!$char->{dead},
- map { $statusName{$_} || $_ } keys %{$char->{statuses}}
- - ) || 'none';
- + ) || 'none');
- }
- # get NPC array index
- @@ -461,11 +465,11 @@
- if (defined $_[0]) {
- if ($_[0] ne '') {
- unless (Commands::run($command)) {
- - my $errorMsg = sprintf("[macro] %s failed with %s\n", $queue->name, $command);
- + my $errorMsg = sprintf("[macro] %s failed with %s\n", $macroPlugin->{queue}->name, $command);
- my $hookArgs = {
- 'message' => $errorMsg,
- - 'name' => $queue->name,
- + 'name' => $macroPlugin->{queue}->name,
- 'error' => 'Commands::run failed',
- };
- Plugins::callHook ('macro/error', $hookArgs);
- @@ -472,18 +476,18 @@
- return $hookArgs->{continue} if $hookArgs->{return};
- error $errorMsg, "macro";
- - undef $queue;
- + undef $macroPlugin->{queue};
- return
- }
- }
- - $queue->ok;
- - if (defined $queue && $queue->finished) {undef $queue}
- + $macroPlugin->{queue}->ok;
- + if (defined $macroPlugin->{queue} && $macroPlugin->{queue}->finished) {undef $macroPlugin->{queue}}
- } else {
- - my $name = (defined $queue->{subcall}) ? $queue->{subcall}->name : $queue->name;
- - my $error = $queue->error;
- + my $name = (defined $macroPlugin->{queue}->{subcall}) ? $macroPlugin->{queue}->{subcall}->name : $macroPlugin->{queue}->name;
- + my $error = $macroPlugin->{queue}->error;
- my $errorMsg = sprintf(
- "[macro] %s error: %s\n",
- - $name =~ /^tempMacro\d+$/ && $varStack{'.caller'} ? $varStack{'.caller'}.'.call' : $name,
- + $name =~ /^tempMacro\d+$/ && $macroPlugin->isVarDefined('.caller') ? $macroPlugin->getVar('.caller').'.call' : $name,
- $error
- );
- @@ -496,7 +500,7 @@
- return $hookArgs->{continue} if $hookArgs->{return};
- error $errorMsg, "macro";
- - undef $queue;
- + undef $macroPlugin->{queue};
- return
- }
- @@ -505,25 +509,25 @@
- # macro/script
- sub callMacro {
- - return unless defined $queue;
- - return if $onHold;
- - my %tmptime = $queue->timeout;
- - unless ($queue->registered || $queue->overrideAI) {
- - if (timeOut(\%tmptime)) {$queue->register}
- + return unless defined $macroPlugin->{queue};
- + return if $macroPlugin->isPaused();
- + my %tmptime = $macroPlugin->{queue}->timeout;
- + unless ($macroPlugin->{queue}->registered || $macroPlugin->{queue}->overrideAI) {
- + if (timeOut(\%tmptime)) {$macroPlugin->{queue}->register}
- else {return}
- }
- if (timeOut(\%tmptime) && ai_isIdle()) {
- do {
- - last unless processCmd $queue->next;
- + last unless processCmd $macroPlugin->{queue}->next;
- Plugins::callHook ('macro/callMacro/process');
- - } while !$onHold && $queue && $queue->macro_block;
- + } while $macroPlugin->{queue} && !$macroPlugin->isPaused() && $macroPlugin->{queue}->macro_block;
- =pod
- - # crashes when error inside macro_block encountered and $queue becomes undefined
- - my $command = $queue->next;
- - if ($queue->macro_block) {
- - while ($queue->macro_block) {
- - $command = $queue->next;
- + # crashes when error inside macro_block encountered and $macroPlugin->{queue} becomes undefined
- + my $command = $macroPlugin->{queue}->next;
- + if ($macroPlugin->{queue}->macro_block) {
- + while ($macroPlugin->{queue}->macro_block) {
- + $command = $macroPlugin->{queue}->next;
- processCmd($command)
- }
- } else {
- Index: Macro/Wx/Debugger.pm
- ===================================================================
- --- Macro/Wx/Debugger.pm (revision 8992)
- +++ Macro/Wx/Debugger.pm (working copy)
- @@ -102,19 +102,19 @@
- sub updateTool {
- my ($self) = @_;
- - $self->{toolbar}->EnableTool ($self->{tool}{go}, $onHold && defined $queue);
- - $self->{toolbar}->EnableTool ($self->{tool}{break}, !$onHold && defined $queue);
- - $self->{toolbar}->EnableTool ($self->{tool}{stop}, defined $queue);
- - $self->{toolbar}->EnableTool ($self->{tool}{stepInto}, $onHold && defined $queue);
- - $self->{toolbar}->EnableTool ($self->{tool}{stepOver}, $onHold && defined $queue);
- - $self->{toolbar}->EnableTool ($self->{tool}{stepOut}, $onHold && defined $queue);
- + $self->{toolbar}->EnableTool ($self->{tool}{go}, $macroPlugin->isPaused() && defined $macroPlugin->{queue});
- + $self->{toolbar}->EnableTool ($self->{tool}{break}, !$macroPlugin->isPaused() && defined $macroPlugin->{queue});
- + $self->{toolbar}->EnableTool ($self->{tool}{stop}, defined $macroPlugin->{queue});
- + $self->{toolbar}->EnableTool ($self->{tool}{stepInto}, $macroPlugin->isPaused() && defined $macroPlugin->{queue});
- + $self->{toolbar}->EnableTool ($self->{tool}{stepOver}, $macroPlugin->isPaused() && defined $macroPlugin->{queue});
- + $self->{toolbar}->EnableTool ($self->{tool}{stepOut}, $macroPlugin->isPaused() && defined $macroPlugin->{queue});
- }
- sub updateStatus {
- my ($self) = @_;
- - if (defined $queue) {
- - $self->{status}->SetStatusText ($onHold ? T('PAUSE') : T('RUN'), 1);
- + if (defined $macroPlugin->{queue}) {
- + $self->{status}->SetStatusText ($macroPlugin->isPaused() ? T('PAUSE') : T('RUN'), 1);
- } else {
- $self->{status}->SetStatusText (T('STOP'), 1);
- }
- @@ -123,7 +123,7 @@
- sub updateSource {
- my ($self) = @_;
- - my $script = $queue or return;
- + my $script = $macroPlugin->{queue} or return;
- my @callStack;
- do {
- unshift @callStack, $script->name . ':' . $script->line;
- @@ -176,8 +176,8 @@
- $self->{watch}->SetItemText ($i, $_);
- }
- - if ($varStack{$_} ne $self->{watch}->GetItem ($i, 1)->GetText) {
- - $self->{watch}->SetItem ($i, 1, $varStack{$_});
- + if ($macroPlugin->getVar($_) ne $self->{watch}->GetItem ($i, 1)->GetText) {
- + $self->{watch}->SetItem ($i, 1, $macroPlugin->getVar($_));
- }
- delete $self->{watchStack}{$_};
- @@ -204,19 +204,19 @@
- undef $self->{step};
- undef $self->{stepLevel};
- - $onHold = 0;
- + $macroPlugin->isPaused() = 0;
- }
- sub macroError {
- my ($self, undef, $args) = @_;
- - $onHold = 1;
- + $macroPlugin->isPaused() = 1;
- $self->updateTool;
- $self->updateStatus;
- $self->{status}->SetStatusText ($args->{error}, 0);
- - my $script = $queue;
- + my $script = $macroPlugin->{queue};
- do {
- undef $script->{error};
- $script->{macro_block} = 0;
- @@ -239,7 +239,7 @@
- $self->{status}->SetStatusText ('', 0);
- - unless (defined $queue) {
- + unless (defined $macroPlugin->{queue}) {
- $self->cleanup;
- } elsif ($self->{step}) {
- my $level = $self->subCallNesting;
- @@ -250,7 +250,7 @@
- ) {
- undef $self->{step};
- undef $self->{stepLevel};
- - $onHold = 1;
- + $macroPlugin->isPaused() = 1;
- }
- }
- @@ -273,8 +273,8 @@
- sub _onGo {
- my ($self) = @_;
- - if (defined $queue) {
- - $onHold = 0;
- + if (defined $macroPlugin->{queue}) {
- + $macroPlugin->isPaused() = 0;
- $self->updateTool;
- $self->updateStatus;
- @@ -284,8 +284,8 @@
- sub _onBreak {
- my ($self) = @_;
- - if (defined $queue) {
- - $onHold = 1;
- + if (defined $macroPlugin->{queue}) {
- + $macroPlugin->isPaused() = 1;
- $self->updateTool;
- $self->updateStatus;
- @@ -295,8 +295,8 @@
- sub _onStop {
- my ($self) = @_;
- - if (defined $queue) {
- - undef $queue;
- + if (defined $macroPlugin->{queue}) {
- + undef $macroPlugin->{queue};
- $self->cleanup;
- $self->updateTool;
- @@ -307,9 +307,9 @@
- sub _onStepInto {
- my ($self) = @_;
- - if (defined $queue) {
- + if (defined $macroPlugin->{queue}) {
- $self->{step} = 'into';
- - $onHold = 0;
- + $macroPlugin->isPaused() = 0;
- $self->updateTool;
- $self->updateStatus;
- @@ -319,10 +319,10 @@
- sub _onStepOver {
- my ($self) = @_;
- - if (defined $queue) {
- + if (defined $macroPlugin->{queue}) {
- $self->{step} = 'over';
- $self->{stepLevel} = $self->subCallNesting;
- - $onHold = 0;
- + $macroPlugin->isPaused() = 0;
- $self->updateTool;
- $self->updateStatus;
- @@ -332,10 +332,10 @@
- sub _onStepOut {
- my ($self) = @_;
- - if (defined $queue) {
- + if (defined $macroPlugin->{queue}) {
- $self->{step} = 'out';
- $self->{stepLevel} = $self->subCallNesting;
- - $onHold = 0;
- + $macroPlugin->isPaused() = 0;
- $self->updateTool;
- $self->updateStatus;
- @@ -362,8 +362,7 @@
- );
- return unless defined $value;
- -
- - $varStack{$key} = $value;
- + $macroPlugin->setVarValue($key, $value);
- $self->updateWatch;
- }
- @@ -370,7 +369,7 @@
- sub changeLine {
- my ($self, $value) = @_;
- - if (defined $queue) {
- + if (defined $macroPlugin->{queue}) {
- $self->subCalledScript->{line} = $value;
- $self->updateSource;
- @@ -378,13 +377,13 @@
- }
- sub subCalledScript {
- - my $script = $queue or return;
- + my $script = $macroPlugin->{queue} or return;
- $script = $script->{subcall} while $script->{subcall};
- return $script;
- }
- sub subCallNesting {
- - my $script = $queue or return 0;
- + my $script = $macroPlugin->{queue} or return 0;
- my $i = 1;
- while ($script->{subcall}) {
- $script = $script->{subcall};
Add Comment
Please, Sign In to add comment