Moderator: MacroQuest Developers

Code: Select all
|Driftinsupra second usefull macro makeinir.mac
|Makes ini files for use in bazaar.mac
|Modified by Fishez 1-24-04
|Macro works after making changes to the mq2bzsrch.cpp and recompiling
|Also used the buyitem and sellitem routines from the Depot and massaged them a little
|for some targeting of the items that I waws having.
|Have only done minor testing at this point but it did buy item from trader, sell item to
|vendor, rinse and repeat several times before I end it.
#define DEBUG 1==1
#include routines2.inc
#include buyitems.inc
#include sellitem.inc
#turbo
sub main
/declare file global
/declare isle global
/declare counter local
/declare l1 local
/declare traderid local
/declare price local
/declare curmoney local
/declare newmoney local
/declare profit local
/declare item local
/declare theitem global
/declare Token global
/declare check local
/declare donecheck local
/varset file C:\mq2-latest\release\macros\newini.ini
/varset counter 1
/varset check 0
/varset donecheck 0
:mainloop
/echo searching for @Param0
/bzsrch race any class any price 0 @Param1 "@Param0"
| is request done?
:loop
/delay 1
/if "$bazaar()"=="FALSE" /goto :loop
/if n $bazaar(count)==0 {
/echo @Param0 not found, exiting
/return
}
} else {
/echo found $bazaar(count) items
}
/varset theitem "$bazaar(0,name)"
/echo The item found is $bazaar(0,name)
:checkloop
/if "@theitem"=="$ini(@file,names,val@counter)" /varset donecheck 1
/varadd counter 1
/echo @donecheck
/varset counter $int(@counter)
/echo "$ini(@file,names,val@counter)"
/if "$ini(@file,names,val@counter)"!="NOTFOUND" /goto :checkloop
/if n @donecheck==1 {
/varset donecheck 0
/varadd check 1
/varset counter 1
/varset check $int(@check)
/varset theitem "$bazaar(@check,name)"
/if "$left(6,"@theitem")=="$bazaar /endmacro
/goto :checkloop
}
/varset price $bazaar(@check,price)
/varset traderid $bazaar(@check,trader)
/echo @theitem
/echo targeting @traderid
/target id @traderid
/face
/call traderisle $target(x) $target(y)
/call movetoisle @isle
/face
/call movetotarg 10
/click right target
/delay 20
/echo Buying @theitem
/call buyitems "@theitem" 1
/call moveback @isle
/call walkpath merch 10
/varset curmoney $char(cash)
/target "Merchant Tekram"
/face
/click right target
/delay 20
/echo Entering SellItem to sell @theitem
/call sellitem "@theitem"
/delay 20
/click left merchant done
/varset newmoney $char(cash)
/call walkpath merchb 10
/varsub newmoney @curmoney
/ini "@file" "names" "val$int(@counter)" "@theitem"
/ini "@file" "prices" "val$int(@counter)" "$int(@newmoney)"
/varset counter 0
/varset check 0
/varset donecheck 0
/goto :mainloop
/return
Sub movetoisle(isle)
/if n @isle==61 /call walkpath 61 10
/if n @isle==62 /call walkpath 62 10
/if n @isle==81 /call walkpath 81 10
/if n @isle==82 /call walkpath 82 10
/if n @isle==91 /call walkpath 82 10
/if n @isle==92 /call walkpath 92 10
/if n @isle==51 /call walkpath 51 10
/if n @isle==52 /call walkpath 52 10
/if n @isle==21 /call walkpath 21 10
/if n @isle==22 /call walkpath 22 10
/if n @isle==31 /call walkpath 31 10
/if n @isle==32 /call walkpath 32 10
/return
Sub traderisle(xloc,yloc)
/if n @xloc>95 /if n @xloc<129 /if n @yloc>-770 /if n @yloc<-589 /varset isle 61
/if n @xloc<95 /if n @xloc>62 /if n @yloc>-770 /if n @yloc<-589 /varset isle 62
/if n @xloc>-104 /if n @xloc<-72 /if n @yloc>-772 /if n @yloc<-590 /varset isle 81
/if n @xloc<-104 /if n @xloc>-145 /if n @yloc>-772 /if n @yloc<-590 /varset isle 82
/if n @xloc>-203 /if n @xloc<-171 /if n @yloc>-713 /if n @yloc<-527 /varset isle 91
/if n @xloc<-203 /if n @xloc>-250 /if n @yloc>-713 /if n @yloc<-527 /varset isle 92
/if n @xloc>-118 /if n @xloc<107 /if n @yloc<-541 /if n @yloc>-571 /varset isle 51
/if n @xloc>-118 /if n @xloc<107 /if n @yloc>-541 /if n @yloc<-514 /varset isle 52
/if n @xloc>95 /if n @xloc<129 /if n @yloc>-495 /if n @yloc<-296 /varset isle 21
/if n @xloc<95 /if n @xloc>62 /if n @yloc>-495 /if n @yloc<-296 /varset isle 22
/if n @xloc>-104 /if n @xloc<-72 /if n @yloc>-495 /if n @yloc<-296 /varset isle 31
/if n @xloc<-104 /if n @xloc>-145 /if n @yloc>-495 /if n @yloc<-296 /varset isle 32
/return
Sub moveback(isle)
/if n @isle==61 /call walkpath 61b 10
/if n @isle==62 /call walkpath 62b 10
/if n @isle==81 /call walkpath 81b 10
/if n @isle==82 /call walkpath 82b 10
/if n @isle==91 /call walkpath 82b 10
/if n @isle==92 /call walkpath 92b 10
/if n @isle==51 /call walkpath 51b 10
/if n @isle==52 /call walkpath 52b 10
/if n @isle==21 /call walkpath 21b 10
/if n @isle==22 /call walkpath 22b 10
/if n @isle==31 /call walkpath 31b 10
/if n @isle==32 /call walkpath 32b 10
/return
Sub walkpath
|Initialization
|Note -- Edit the following line to represent the full path where you want your
Paths.ini file
| to be stored. Like: "c:\macroquest\macros\data\Paths.ini"
/declare gINIFile local
/declare gPathNumber local
/declare gStartPoint local
/declare gEndPoint local
/declare gStep local
/declare gThreshold local
/declare tEchoTimer timer
/declare l0 local
/declare l1 local
/declare l2 local
/declare l3 local
/declare pointface local
/declare MyXLOC local
/declare MyYLOC local
/declare ObstCount local
/varset gINIFile "C:\mq2-latest\release\macros\paths.ini"
/varset gPathNumber @Param0
/varset gThreshold @Param1
/varset gStartPoint @Param2
/varset gEndPoint @Param3
/varset pointface 0
/if @gThreshold=="" {
/echo No Threshold specified -- using 3.
/varset gThreshold 2
}
/if n @gStartPoint==0 {
/varset gStartPoint 1
/varset gEndPoint $int($ini("@gINIFile","@gPathNumber","numpoints"))
}
/if n @gStartPoint==-1 {
/varset gEndPoint 1
/varset gStartPoint $int($ini("@gINIFile","@gPathNumber","numpoints"))
}
/varset l0 @gStartPoint
/if @gStartPoint<@gEndPoint {
/varset gStep 1
} else /if @gStartPoint>@gEndPoint {
/varset gStep -1
}
/varset l1 $int($ini("@gINIFile","@gPathNumber","$int(@l0) Y"))
/varset l2 $int($ini("@gINIFile","@gPathNumber","$int(@l0) X"))
/face loc @l1, @l2
/call AutoRun 1
:MainLoop
/varset l1 $int($ini("@gINIFile","@gPathNumber","$int(@l0) Y"))
/varset l2 $int($ini("@gINIFile","@gPathNumber","$int(@l0) X"))
/varset tEchoTimer 5
/if @l0==@gStartPoint /echo $distance(@l1,@l2)
/varset MyXLOC $char(x)
/varset MyYLOC $char(y)
/varset ObstCount 0
:MainLoop2
/doevents
/if @tEchoTimer==0 {
/varset tEchoTimer 1s
/echo $distance(@l1,@l2)
}
|The 'fast' paramater of the /face function prevents the command
|from smoothing out the turn, and instead immediately turns your
|character to face the specified direction. It is commented out here
|in favor of the smoothed /face, because it looks more natural and
|realistic. However, you will see problems with high-resolution paths
|(ie, paths in which the distances in between snapshots is very low) where
|your character will run in circles around points. There are two things
|you can do about this. The first is to increase the DistanceThreshold
|number that you pass when you start the script. The second is to uncomment
|the "/face fast nopredict" line, and comment the "/face nopredict" line.
|This will look a little less natural, but if you're using a high-
|resolution path in the first place, it really shouldn't matter.
|Another time where you might want to use /face fast is in dungeons or
|other tight areas where precision is important.
/face fast nopredict loc @l1, @l2
|/if n pointface<=1 /face loc @l1, @l2
/varadd pointface 1
/varadd ObstCount 1
/if n @ObstCount>=10 {
/if n @MyXLOC==$char(x) /if n @MyYLOC==$char(y) {
/sendkey up up
/sendkey down down
/if n $rand(99)>50 {
/delay 1s
/sendkey up down
/sendkey down Right
/delay 5
/sendkey up Right
/sendkey down up
/delay 1s
/sendkey up up
} else {
/delay 1s
/sendkey up down
/sendkey down left
/delay 5
/sendkey up left
/sendkey down up
/delay 1s
/sendkey up up
}
/face loc @l1, @l2
/call autorun 1
/sendkey up Right
/sendkey up Left
}
/varset MyXLOC $char(x)
/varset MyYLOC $char(y)
/varset ObstCount 0
}
/if n $distance(@l1,@l2)>@gThreshold /goto :MainLoop2
/echo Point @l0 Reached.
/varset pointface 0
/varset l0 $int($calc(@l0+@gStep))
/if @l3==1 /goto :MainLoopExit
/if @l0==@gEndPoint /varset l3 1
/goto :MainLoop
:MainLoopExit
/call AutoRun 0
/echo Destination reached. Exiting.
/return
Sub AutoRun
/if @Param0==1 /sendkey down up
/if @Param0==0 /sendkey up up
/return
Code: Select all
| Routines2.inc from code in the Depot
Sub movetotarg(distance)
/declare MyXLOC local
/declare MyYLOC local
/declare ObstCount local
/varset MyXLOC $char(x)
/varset MyYLOC $char(y)
/varset ObstCount 0
/face
:mobloop
/if n $target(distance)>=@distance {
/call autorun 1
/face nolook
/varadd ObstCount 1
/if n @ObstCount>=3 {
/if n @MyXLOC==$char(x) /if n @MyYLOC==$char(y) {
/sendkey up up
/sendkey down down
/if n $rand(99)>50 {
/delay 1s
/sendkey up down
/sendkey down Right
/delay 5
/sendkey up Right
/sendkey down up
/delay 1s
/sendkey up up
} else {
/delay 1s
/sendkey up down
/sendkey down left
/delay 5
/sendkey up left
/sendkey down up
/delay 1s
/sendkey up up
}
/sendkey up down
/sendkey up Right
/sendkey up Left
}
/varset MyXLOC $char(x)
/varset MyYLOC $char(y)
/varset ObstCount 0
}
/goto :mobloop
}
/call autorun 0
/return
Sub gotoloc(xloc,yloc)
/declare MyXLOC local
/declare MyYLOC local
/declare ObstCount local
/varset MyXLOC $char(x)
/varset MyYLOC $char(y)
/varset ObstCount 0
:locloop
/face loc @xloc
/if "@yloc"=="u" /Press u
/call AutoRun 1
/varadd ObstCount 1
/if n @ObstCount>=3 {
/if n @MyXLOC==$char(x) /if n @MyYLOC==$char(y) {
/sendkey up up
/sendkey down down
/if n $rand(99)>50 {
/delay 1s
/sendkey up down
/sendkey down Right
/delay 5
/sendkey up Right
/sendkey down up
/delay 1s
/sendkey up up
} else {
/delay 1s
/sendkey up down
/sendkey down left
/delay 5
/sendkey up left
/sendkey down up
/delay 1s
/sendkey up up
}
/sendkey up down
/sendkey up Right
/sendkey up Left
}
/varset MyXLOC $char(x)
/varset MyYLOC $char(y)
/varset ObstCount 0
}
/if n $distance(@xloc)>10 /goto :locloop
}
/call autorun 0
/return
Sub AutoRun
/if @Param0==1 /sendkey down up
/if @Param0==0 /sendkey up up
/return
Code: Select all
Sub SellItem
/declare OldMoney local
/declare NewMoney local
/varset OldMoney $char(cash)
/windowstate inventory open
:Finding
/if n $count("@Param0")==0 /goto :Done
/finditem "@Param0"
/selectitem "@Param0" self
/echo @Param0 Found
/sendkey down shift
:WaitFind
/if "$cursor()"=="FALSE" /goto :WaitFind
:Selling
/delay 1s
/sellitem $selecteditem(count)
/echo Selling @Param0
/click left merchant sell
:WaitSell
/varset NewMoney $char(cash)
/if n @NewMoney==@OldMoney /goto :WaitSell
/goto :Finding
:Done
/sendkey up shift
/windowstate inventory close
/return
Code: Select all
|BuyItems.inc
|Usage: /call BuyItems <name of item> <number of items>
#define DEBUG 1==1
Sub BuyItems
/declare OldMoney local
/declare Stacks local
/declare Remainder local
/declare loop local
/declare count local
/if DEBUG /echo In BuyItems
| /windowstate inventory open
/if DEBUG /echo Buying amount @Param1
/if n @Param1<=0 /return
/if DEBUG /echo Buying Item @Param0
/if $merchant(has,"@Param0")==FALSE /return
/if DEBUG /echo Buying @param0
/selectitem "@Param0" merchant
/if "$selecteditem(count)"=="NOT_STACKABLE" {
/varset count 0
} else {
/varset count 1
}
/if n @count==1 {
/if n @Param1>$calc($calc($freeinv(space)*20)+$calc(20-$calc($count("@Param0")%20))) /return
} else /if n @count==0 {
/if n @Param1>$freeinv(space) /return
}
/if n @count==1 {
/if n @Param1>20 {
/varset Stacks $int($calc(@Param1/20))
/varset Remainder $calc(@Param1%20)
/buyitem @Remainder
/echo @Remainder @Stacks
/for loop 0 to @Stacks
/varset OldMoney $char(cash)
:buyloop
/buyitem 20
/if n $char(cash)==@OldMoney /goto :buyloop
/next loop
} else /if n @Param1<=20 {
/buyitem @Param1
}
} else /if n @count==0 {
/for loop 1 to @Param1
/varset OldMoney $char(cash)
:buyloop2
/buyitem 1
/if n $char(cash)==@OldMoney /goto :buyloop2
/next loop
}
/windowstate inventory close
/return