Advanced runFromTarget (from old forums) recover
Posted: 23 Feb 2009, 07:40
I've been using this macro and it works quite well, so I though about writting it here so people can find it well. <.< Basically it gets the distance from monsters, then makes the character run from it if the monster distance is less or equal to the distance given.
Well, first you need to mod a little your macro plugin:
Note that this is old stuff, so if someone made it more actual it would be cool to know what was done on it. It works perfect for me with the last SVN downloaded OK and macro plugin.
I got this from old forums, here -> http://bibian.ath.cx/openkore/viewtopic ... et&start=0
I hope this helps, though I did nothing, all the credits to the people who worked on that post.
Well, first you need to mod a little your macro plugin:
- Go to Macro plugin file, and open the file Automacro.pm. you gotta search for this script:
Then change it to this:
Code: Select all
# checks for monster, credits to illusionist sub checkMonster { my $monsterList = $_[0]; foreach (@monstersID) { next unless defined $_; if (existsInList($monsterList, $monsters{$_}->{name})) { my $pos = calcPosition($monsters{$_}); my $val = sprintf("%d %d %s", $pos->{x}, $pos->{y}, $field->name); $varStack{".lastMonster"} = $monsters{$_}->{name}; $varStack{".lastMonsterPos"} = $val; return 1 } } return 0 }
Code: Select all
sub checkMonster { my ($monsterList, $mondist) = $_[0] =~ /^(.*),\s(\d+)\s*$/; return 0 if ($mondist < 1); foreach (@monstersID) { next unless defined $_; if (existsInList($monsterList, $monsters{$_}->{name})) { my $mypos = calcPosition($char); my $pos = calcPosition($monsters{$_}); my $dist = sprintf("%.0f", distance($mypos, $pos)); my $val = sprintf("%d %d %s", $pos->{x}, $pos->{y}, $field->name); $varStack{".lastMonster"} = $monsters{$_}->{name}; $varStack{".lastMonsterPos"} = $val; $varStack{".lastMonsterDist"} = $dist; $varStack{".lastMonsterID"} = $monsters{$_}->{binID}; return $dist <= $mondist ?1:0 } } return 0 }
- Now open the file Utilities.pm in the same folder and find this code (is at the top):
You gotta to add the word getmonsterID, like in here:
Code: Select all
our @EXPORT_OK = qw(ai_isIdle q4rx between cmpr match getArgs refreshGlobal getnpcID getPlayerID getVenderID getItemIDs getItemPrice getInventoryIDs getStorageIDs getSoldOut getInventoryAmount getCartAmount getShopAmount getStorageAmount getVendAmount getRandom getRandomRange getConfig getWord callMacro getArgFromList getListLenght);
In the same file, you gotta find this code too:Code: Select all
our @EXPORT_OK = qw(ai_isIdle q4rx between cmpr match getArgs refreshGlobal getnpcID getmonsterID getPlayerID
And ADD after it (look: add, not overwrite) the following one:Code: Select all
# get player array index sub getPlayerID { foreach my $pl (@{$playersList->getItems()}) { return $pl->{binID} if $pl->name eq $_[0] } return -1 }
Code: Select all
sub getmonsterID { my ($name, $pool) = @_; for (my $id = 0; $id < @{$pool}; $id++) { next unless $$pool[$id]; next unless $monsters{$$pool[$id]}->{name}; if ($monsters{$$pool[$id]}->{name} eq $name) {return $id} } return -1 }
- Next step is open the file Parser.pm and look for the following part (it's at the top too):
You gotta add again the word getmonsterID like here:
Code: Select all
use Macro::Utilities qw(refreshGlobal getnpcID getItemIDs getItemPrice getStorageIDs getInventoryIDs getPlayerID getVenderID getRandom getRandomRange getInventoryAmount getCartAmount getShopAmount getStorageAmount getVendAmount getConfig getWord q4rx getArgFromList getListLenght);
On the same file, look for this code:Code: Select all
use Macro::Utilities qw(refreshGlobal getnpcID getmonsterID getItemIDs getStorageIDs getInventoryIDs
Here you gotta add the following line after the part it's showed:Code: Select all
while (($kw, $targ) = parseKw($cmd)) { $ret = "_%_"; # first parse _then_ substitute. slower but more safe $arg = subvars($targ); if ($kw eq 'npc') {$ret = getnpcID($arg)}
So it should look like this:Code: Select all
elsif ($kw eq 'monster') {$ret = getmonsterID($arg, $::monstersID)}
Code: Select all
while (($kw, $targ) = parseKw($cmd)) { $ret = "_%_"; # first parse _then_ substitute. slower but more safe $arg = subvars($targ); if ($kw eq 'npc') {$ret = getnpcID($arg)} elsif ($kw eq 'monster') {$ret = getmonsterID($arg, $::monstersID)}
- And FINALLY go to Data.pm and look for this part:
And just add
Code: Select all
our $macroKeywords = "npc" . "|" . "cart" . "|" . "inventory" . "|" . "store" . "|" . "storage" . "|" . "player" . "|" .
So it will look like this:Code: Select all
"monster" . "|" .
Code: Select all
our $macroKeywords = "npc" . "|" . "cart" . "|" . "inventory" . "|" . "store" . "|" . "storage" . "|" . "player" . "|" . "monster" . "|" .
Code: Select all
automacro avoid {
map moc_fild12
monster Picky,Super Picky,PecoPeco's Egg,Drops, 12
#Notice the coma space and number 12 above? This avoid automacro only trigger if any of the monster list
#distance is equal or less than the number given.
timeout 5
exclusive 1
set Move 10
#set Move to how many distance per trigger you want it to move.
call check
}
macro check {
[
$mon = $.lastMonster
$monID = $.lastMonsterID
$dist = $.lastMonsterDist
$monPos = $.lastMonsterPos
$map = $.map
$myPos = $.pos
$myPosX = @arg ("$myPos", 1)
$myPosY = @arg ("$myPos", 2)
$monPosX = @arg ("$monPos", 1)
$monPosY = @arg ("$monPos", 2)
$map = $.map
do eval message T("Macro Avoid: $::Macro::Data::varStack{mon} \($::Macro::Data::varStack{monID}\)\n"), "teleport"; message T("Monster Dist\= $::Macro::Data::varStack{dist} \, Monster Loc\: \($::Macro::Data::varStack{monPosX},$::Macro::Data::varStack{monPosY}\) Map\= $::Macro::Data::varStack{map}\n"), "teleport";
]
do as
if ($myPosX > $monPosX) goto east
if ($myPosX < $monPosX) goto west
:X0
if ($myPosY < $monPosY) goto X0south
if ($myPosY > $monPosY) goto X0north
log We have the same co-ord to the Monster
do @random ("east", "west", "south", "north") $Move
log Move Random
stop
:X0south
log Monster Loc: North X-axis0
do south $Move
log Move South
stop
:X0north
log Monster Loc: South X-axis0
do north $Move
log Move North
stop
:east
if ($myPosY < $monPosY) goto eastSouth
if ($myPosY > $monPosY) goto eastNorth
:Y0east
log Monster Loc: West Y-axis0
do east $Move
log Move East
stop
:eastSouth
log Monster Loc: NorthWest
do southeast $Move
log Move South East
stop
:eastNorth
log Monster Loc: SouthWest
do northeast $Move
log Move North East
stop
:west
if ($myPosY < $monPosY) goto westSouth
if ($myPosY > $monPosY) goto westNorth
:Y0west
log Monster Loc: East Y-axis0
do west $Move
log Move West
stop
:westSouth
log Monster Loc: NorthEast
do southwest $Move
log Move South West
stop
:westNorth
log Monster Loc: SouthEast
do northwest $Move
log Move North West
stop
}
I got this from old forums, here -> http://bibian.ath.cx/openkore/viewtopic ... et&start=0
I hope this helps, though I did nothing, all the credits to the people who worked on that post.