You'll probably want to incorporate this with some sort of autorunning script. I keep my modules seperate tho.
Enjoy
Code: Select all
| -----------------------------------------------------------------
| MineField.mac
| Version 1.0
| by Tuna
|
| PURPOSE
| Pick a safe direction to move toward your goal LOC.
| Safe means free of mobs.
|
| METHOD
| Break up all possible directions into 12 easy chunks. Visualize
| a pie or a pizza. Evaluate mobs in each slice. Pick the slice
| closest to the direction you want to go.
|
| NAMING
| I call it minefield because you are basically navigating terrain with
| the intent of avoiding all hotspots.
| -----------------------------------------------------------------
#turbo 50
| ------------------------------------
| VectorResolution cuts 360 degrees up into X number of pie slices.
| I set to 12 (30 degrees).
| ------------------------------------
#define VectorResolution 12
#define HighScoreBase 9999
#define DefaultRangeToScan 400
sub Main
| ----------------------------
| Set up globals
| ----------------------------
/declare vectorHeadingStarts array
/declare vectorHeadingEnds array
/declare vectorDanger array
/declare vectorScores array
| -----------------------------
| You will only need to call
| -----------------------------
/call DefineVectors
/call ResetTravelVectors
/call ScanForThreats DefaultRangeToScan
/call DebugDumpSafeVectors
| Fake parameters.. you would change this obviously but these
| are here to demonstrate what the macro does.
/call PickSafestVectorToTarget -795 -1451
/return
| --------------------------
| Returns:
| -1 on error (or no safe vectors found)
| 0 or higher on vector found
|
| You can use $return after calling this to index vectorHeadingStarts()
| or vectorHeadingEnds or whatever.
| --------------------------
sub PickSafestVectorToTarget
/declare tX local
/declare tY local
/declare goalVector local
/declare goalHeading local
/declare headingDiff local
/declare highestScore local
/declare c local
/declare highestScoringVectorIndex local
/varset highestScoringVectorIndex -1
/varset tX @Param0
/varset tY @Param1
/varset goalHeading $heading(@tY,@tX)
/echo Heading to @tX x, @tY y is @goalHeading
| 1) Calc vector which would be your goal
/call VectorForHeading @goalHeading
/varset goalVector $return
| 2) Find vector closest to it
/for c 1 to VectorResolution
/if n @vectorDanger(@c)<=0 {
/varcalc headingDiff $abs(@vectorHeadingStarts(@goalVector)-@vectorHeadingStarts(@c))
/echo Heading diff tween (@goalVector) and @c is @headingDiff
/varcalc vectorScores(@c) @vectorScores(@c)-@headingDiff
/echo New score for @c is @vectorScores(@c)
} else {
/echo Vector @c too dangerous to consider
}
/next c
/varset highestScore 0
/for c 1 to VectorResolution
/if n @vectorDanger(@c)<=0 {
/if n @vectorScores(@c)>=@highestScore {
/echo New high score: @vectorScores(@c): Vector @c heading @vectorHeadingStarts(@c) (@vectorDanger(@c) danger level)
/face heading @vectorHeadingStarts(@c)
/varset highestScore @vectorScores(@c)
/varset highestScoringVectorIndex @c
}
}
/next c
/return @highestScoringVectorIndex
sub VectorForHeading
/declare c local
/for c 1 to VectorResolution
/if n @vectorHeadingStarts(@c)<=@Param0 {
/if n @vectorHeadingEnds(@c)>@Param0 {
/return @c
}
}
/next c
/return 0
sub DebugDumpSafeVectors
/declare c local
/for c 1 to VectorResolution
/echo @c: (@vectorHeadingStarts(@c) to @vectorHeadingEnds(@c)) danger level @vectorDanger(@c)
/next c
/return
Sub DefineVectors
/declare c local
/declare DegreesPerVector local
/declare NextStartingVector local
/varcalc DegreesPerVector 360/VectorResolution
/varset NextStartingVector 0
/for c 1 to VectorResolution
/varset vectorHeadingStarts(@c) @NextStartingVector
/varcalc NextStartingVector @NextStartingVector+@DegreesPerVector
/varset vectorHeadingEnds(@c) @NextStartingVector
/echo Vec(@c) == @vectorHeadingStarts(@c) to @vectorHeadingEnds(@c)
/next c
/return
| ----------------------------------------------------------------
| Reset every vector to best choice, no danger.
| As mobs are found in each one, they are "tainted"
| and their score is lowered.
| You could always /target and /consider each mob
| to filter out non-aggro, or green cons. But
| allegedly SOE watches for mass targeting and targeting
| mobs you have no line-of-sight to. So I don't put
| that code in here. :D
| ----------------------------------------------------------------
Sub ResetTravelVectors
/declare c local
/for c 1 to VectorResolution
/varset vectorDanger(@c) 0
/varset vectorScores(@c) HighScoreBase
/next c
/return
sub NoteVectorForSpawn
/declare c local
/declare mobHeading local
/declare spawnID local
/varset spawnID @Param0
/varset mobHeading $spawn(@spawnID,headingto)
| /echo Disabling vector for $spawn(@spawnID,name,clean) at $spawn(@spawnID,x),$spawn(@spawnID,y) ... heading to is $spawn(@spawnID,headingto)
/call VectorForHeading @mobHeading
/varset c $return
/varcalc vectorDanger(@c) @vectorDanger(@c)+1
/echo Vector @c (@vectorHeadingStarts(@c) to @vectorHeadingEnds(@c)) more dangerous now... up to @vectorDanger(@c)
/return
Sub ScanForThreats
/declare npcid local
/declare firstnpcid local
/declare lastnpcid local
/declare radiusSearch local
/varset npcid 0
/varset firstnpcid 0
/varset lastnpcid 0
/varset radiusSearch @Param0
/varset npcid $searchspawn(npc,loc:@Param1:@Param2,radius:@radiusSearch)
:AddRadiusLoop
/delay 1
/if n @npcid==@firstnpcid {
/return
} else {
/varset lastnpcid @npcid
/varset npcid $searchspawn(npc,loc:@Param1:@Param2,id:@lastnpcid,radius:@radiusSearch,next)
/if n @lastnpcid!=0 {
| /echo Found $spawn(@lastnpcid,name) at $spawn(@lastnpcid,x),$spawn(@lastnpcid,y) ... heading to is $spawn(@lastnpcid,headingto)
/call NoteVectorForSpawn @lastnpcid
}
}
/goto :AddRadiusLoop
/return


