Code: Select all
|----------------------------
| Forager with ini file support and
| statistic gathering and reporting
| version 2.1
| Set this define to the desired .ini file
| Requires a blank .ini file to start. The marco will
| populate the .ini file automatically for any zone
| and default to keeping the item. Then just change
| the values in the .ini file to 0 for an item to be
| automatically destroyed (requires FastItemDestroy
| be turned on in the options window)
#define IniFile "forage.ini"
#Event ZoneChange "Loading please wait"
#turbo
Sub Main
/declare ForageDelay global
/declare EnableShowStats global
/declare EnableWriteLog global
/declare EnableClear global
| ##### User set variables #####
/varset ForageDelay 1010 | The delay between forage attempts
/varset EnableShowStats 1 | Set to 1 to show foraging statistics
/varset EnableWriteLog 1 | Set to 1 to write statistics to MQLog
/varset EnableClear 0 | Set to 1 to clear before writing stats
| ##### User set variables #####
/declare ForageAttempts global
/declare ForageSuccess global
/declare ForageFailure global
/declare ForageKeeps global
/declare ForageDestroys global
/declare NumItem global
/declare Index global
/declare ItemArray array2
/varset ForageAttempts 0
/varset ForageSuccess 0
/varset ForageFailure 0
/varset ForageKeeps 0
/varset ForageDestroys 0
/varset NumItem 0
/call LoadFromIni
:Continue
/doevents
/varset Index 0
/if $char(state)==SIT {
/stand
/delay 3
}
/if n $char(ability,"Forage")>0 {
/doability Forage
/varadd ForageAttempts 1
/delay 15
/if "$cursor(name)"=="NULL" {
/varadd ForageFailure 1
} else {
/varadd ForageSuccess 1
/call CheckItem
/call HandleItem
| /beep
}
}
/if @EnableWriteLog==1 /call LogStats
/if @EnableShowStats==1 /call ShowStats
/delay @ForageDelay
/goto :Continue
/return
| ########## Subroutines ##########
Sub Event_ZOneChange
/delay 1m
/call LoadFromIni
/return
Sub LoadFromIni
/varset NumItem 0
/declare IniPosition local
/declare IniList local
/declare tmpItem local
/varset IniList $ini(IniFile,"Global")
/if "@IniList"!~"NOTFOUND" {
/varset IniPosition 0
:CheckGlobalForage
/varadd IniPosition 1
/varadd NumItem 1
/varset ItemArray(0,@NumItem) "$arg($int(@IniPosition),"@IniList",|)"
/varset ItemArray(1,@NumItem) $ini(IniFile,"Global","@ItemArray(0,@NumItem)")
| Setting the second column to 0 in the array at zoneout/in. Originally wasn't getting set and would cause stats to bail.
/varset ItemArray(2,@NumItem) 0
/if "$arg($int($calc(@IniPosition+1)),"@IniList",|)"!="" /goto :CheckGlobalForage
}
/varset IniList "$ini(IniFile,"$zone")"
/if "@IniList"!~"NOTFOUND" {
/varset IniPosition 0
:CheckZoneForage
/varadd IniPosition 1
/varadd NumItem 1
/varset ItemArray(0,@NumItem) "$arg($int(@IniPosition),"@IniList",|)"
/varset ItemArray(1,@NumItem) $ini(IniFile,"$zone","@ItemArray(0,@NumItem)")
/varset ItemArray(2,@NumItem) 0
/if "$arg($int($calc(@IniPosition+1)),"@IniList",|)"!="" /goto :CheckZoneForage
}
/return
Sub LogStats
/declare xy local
/if @EnableClear==1 /mqlog clear
/mqlog #############################################
/mqlog For Zone: $zone
/mqlog Attempts = $int(@ForageAttempts)
/mqlog Success = $int(@ForageSuccess) [$int($calc(@ForageSuccess/@ForageAttempts*100))%]
/mqlog Failures = $int(@ForageFailure) [$int($calc(@ForageFailure/@ForageAttempts*100))%]
/mqlog Keeps = $int(@ForageKeeps) [$int($calc(@ForageKeeps/@ForageAttempts*100))%]
/mqlog Destroys = $int(@ForageDestroys) [$int($calc(@ForageDestroys/@ForageAttempts*100))%]
/mqlog [Idx] [Item] [Keep] [Qty] [%]
/mqlog -------------------------------------------
/if n @NumItem>0 {
/for xy 1 to @NumItem
/mqlog [$int(@xy)] [@ItemArray(0,@xy)] [$int(@ItemArray(1,@xy))] [$int(@ItemArray(2,@xy))] [$int($calc(@ItemArray(2,@xy)/@ForageAttempts*100))%]
/next xy
}
/return
Sub ShowStats
/declare xy local
/if @EnableClear==1 /clear
/echo #############################################
/echo For Zone: $zone
/echo Attempts = $int(@ForageAttempts)
/echo Success = $int(@ForageSuccess) [$int($calc(@ForageSuccess/@ForageAttempts*100))%]
/echo Failures = $int(@ForageFailure) [$int($calc(@ForageFailure/@ForageAttempts*100))%]
/echo Keeps = $int(@ForageKeeps) [$int($calc(@ForageKeeps/@ForageAttempts*100))%]
/echo Destroys = $int(@ForageDestroys) [$int($calc(@ForageDestroys/@ForageAttempts*100))%]
/echo [Idx] [Item] [Keep] [Qty] [%]
/echo -------------------------------------------
/if n @NumItem>0 {
/for xy 1 to @NumItem
/echo [$int(@xy)] [@ItemArray(0,@xy)] [$int(@ItemArray(1,@xy))] [$int(@ItemArray(2,@xy))] [$int($calc(@ItemArray(2,@xy)/@ForageAttempts*100))%]
/next xy
}
/return
Sub CheckItem
/declare xy local
/if @NumItem==0 {
/varset NumItem 1
/call AddToArray
/varset Index 1
} else {
/for xy 1 to @NumItem
/if "@ItemArray(0,@xy)"=="$cursor(name)" /varset Index @xy
/next xy
/if @Index==0 {
/varadd NumItem 1
/call AddToArray
} else {
/varadd ItemArray(2,@Index) 1
}
}
/return
Sub AddToArray
/varset ItemArray(0,@NumItem) "$cursor(name)"
/varset ItemArray(1,@NumItem) $ini("IniFile","$zone","$cursor(name)")
/if "@ItemArray(1,@NumItem)"=="NOTFOUND" {
/varset ItemArray(1,@NumItem) 1
/ini "IniFile" "$zone" "$cursor(name)" 1
}
/varset ItemArray(2,@NumItem) 1
/return
Sub HandleItem
/if @ItemArray(1,@Index)==0 {
/varadd ForageDestroys 1
/click left destroy
/echo $cursor(name) should be destroyed.
} else {
/varadd ForageKeeps 1
/autoinv
}
/return 