Реализованный мной алгоритм определения самого подходящего Монстра ..
.. Сначала Бот заводите на место боя куда вы считаете нужным .
Включаете Сканирование,
после вывода информации об окружающей обстановке
запускаете Локатор. (уже не один раз как Сканер, а в цикле работы Бота для каждой атаки ..)
Далее хотябы MHS-совская процедура Боя .. (для пробы)
; МОНСТР ---------------------------------------------------------------------------
; [BA] + 8 + 36 + 24 + (i * 4) + 4 + (i = от 0 до 796)
Global $i = 0 ; для циклов сканирования ..
Global $mTP ; Тип (9 - питомец, 7 - NPS, 6 - моб)
Global $_mTP[2] ;
Global $OFS_mTP[7] ;
$OFS_mTP[1] = 8 ;
$OFS_mTP[2] = 36 ;
$OFS_mTP[3] = 24 ;
$OFS_mTP[4] = $i * 4 ;
$OFS_mTP[5] = 4 ;
$OFS_mTP[6] = 180 ;
Global $mID ; - ID номер
Global $_mID[2] ;
Global $OFS_mID[7] ;
$OFS_mID[1] = 8 ;
$OFS_mID[2] = 36 ;
$OFS_mID[3] = 24 ;
$OFS_mID[4] = $i * 4 ;
$OFS_mID[5] = 4 ;
$OFS_mID[6] = 284 ;
Global $mLEV ; - Уровень
Global $_mLEV[2] ;
Global $OFS_mLEV[7] ;
$OFS_mLEV[1] = 8 ;
$OFS_mLEV[2] = 36 ;
$OFS_mLEV[3] = 24 ;
$OFS_mLEV[4] = $i * 4 ;
$OFS_mLEV[5] = 4 ;
$OFS_mLEV[6] = 292 ;
Global $mF ; Занятость - если > 0 - Занят, если = 0 - Свободен
Global $_mF[2] ;
Global $OFS_mF[7] ;
$OFS_mF[1] = 8 ;
$OFS_mF[2] = 36 ;
$OFS_mF[3] = 24 ;
$OFS_mF[4] = $i * 4 ;
$OFS_mF[5] = 4 ;
$OFS_mF[6] = 708 ;
Global $mDIS ; Дисстанция до моба
Global $_mDIS[2] ;
Global $OFS_mDIS[7] ;
$OFS_mDIS[1] = 8 ;
$OFS_mDIS[2] = 36 ;
$OFS_mDIS[3] = 24 ;
$OFS_mDIS[4] = $i * 4 ;
$OFS_mDIS[5] = 4 ;
$OFS_mDIS[6] = 608 ;
Global $mZ ; - Z
Global $_mZ[2] ; DWORD
Global $OFS_mZ[7] ; OFFSET
$OFS_mZ[1] = 8 ;
$OFS_mZ[2] = 36 ;
$OFS_mZ[3] = 24 ;
$OFS_mZ[4] = $i * 4 ;
$OFS_mZ[5] = 4 ;
$OFS_mZ[6] = 64 ;
;-----------------------------------------------------------------------------------
Func Scaner()
$tp6=0 ; Монстров
$tp7=0 ; NPS
$tp9=0 ; Питомцев
For $I = 768 To 0 Step -1 ; цикл от 768 до 0 по одному
$OFS_mID[4] = $I * 4 ; читаем ID
$_mID = _MemoryPointerRead($BASE, $PROCESS, $OFS_mID)
$mID = Hex($_mID[1])
If $mID Then ; если кто-то найден в локации
$OFS_mTP[4] = $I * 4 ; читаем Тип
$_mTP = _MemoryPointerRead($BASE, $PROCESS, $OFS_mTP)
$mTP = $_mTP[1]
If $mTP == 6 Then
$tp6 = $tp6+1
EndIf
If $mTP == 7 Then
$tp7 = $tp7+1
EndIf
If $mTP == 9 Then
$tp9 = $tp9+1
EndIf
EndIf
Next
GUICtrlSetData($LAB_LOC1, "Вокруг: Монстров - "& $tp6 &" NPS - "& $tp7 &" Питомцев - "& $tp9)
SoundPlay("radar.wav", 0)
$dismin = 20 ; Наименьшее расстояние до цели ; на ск. единиц координат самый дальний монстр
For $I = $Imax To $Imin Step -1 ; цикл от 768 до 0
$OFS_mID[4] = $I * 4 ; читаем ID
$_mID = _MemoryPointerRead($BASE, $PROCESS, $OFS_mID)
$mID = Hex($_mID[1])
If $mID Then ; если кто-то найден в локации
$OFS_mTP[4] = $I * 4 ; читаем Тип
$_mTP = _MemoryPointerRead($BASE, $PROCESS, $OFS_mTP)
$mTP = $_mTP[1]
If $mTP == 6 Then ; если это Монстр
$OFS_mLEV[4] = $I * 4 ; читаем Уровень
$_mLEV = _MemoryPointerRead($BASE, $PROCESS, $OFS_mLEV)
$mLEV = $_mLEV[1]
IF $mLEV < $LEV And ($LEV - $mLEV) <= 14 Then ; если Монстр ниже по уровню Перса или подходит по настройкам Бота
$OFS_mZ[4] = $I * 4 ; читаем Z - координата
$_mZ = _MemoryPointerRead($BASE, $PROCESS, $OFS_mZ, "float")
$mZ = Int($_mZ[1] / 10.0)
IF Abs($mZ - $Z) < 4 Then ; если Монстр не выше или не ниже Перса на 4 пункта по оси Z (отселектирование воздушных мобов)
$OFS_mDIS[4] = $I * 4 ; читаем Дистанция
$_mDIS = _MemoryPointerRead($BASE, $PROCESS, $OFS_mDIS, "float") ; / 10
$mDIS = Int($_mDIS[1] / 10.0)
If $mDIS < $dismin Then ; если раст. до моба < запомненного и он на земле (для варианта без ПОЛЕТА !!!)
$Imin = $I - 20 ; устанавливаем диапазон списка целей в локации +/- 20 монстров
$Imax = $I + 20 ; .. можно всместо 20 поставить $dismin а ее указать в настройках как регион действий
if $Imin < 0 Then
$Imin = 1
EndIf
if $Imax > 768 Then
$Imax = 768
EndIf
ExitLoop
EndIf
EndIf
EndIf
EndIf
EndIf
Next
GUICtrlSetData($LAB_LOC2, "Диапазон целей : "& $Imin &" - "& $Imax)
EndFunc ;-------------------------------------------------------------------------------------------
Func Locator()
; Выбор монстра в локации
Do
$dismin = 20 ; Наименьшее расстояние до цели ; на ск. единиц координат самый дальний монстр можно указать в панели настроек Бота
$FI = 0
For $I = $Imax To $Imin Step -1 ; уже мгновенный цикл в диапазоне от $Imin - $Imax из функции Scaner()
$OFS_mID[4] = $I * 4 ; читаем ID
$_mID = _MemoryPointerRead($BASE, $PROCESS, $OFS_mID)
$mID = Hex($_mID[1])
If $mID Then ; если кто-то найден в локации
$OFS_mTP[4] = $I * 4 ; читаем Тип
$_mTP = _MemoryPointerRead($BASE, $PROCESS, $OFS_mTP)
$mTP = $_mTP[1]
If $mTP == 6 Then ; если это Монстр
$OFS_mLEV[4] = $I * 4 ; читаем Уровень
$_mLEV = _MemoryPointerRead($BASE, $PROCESS, $OFS_mLEV)
$mLEV = $_mLEV[1]
IF $mLEV < $LEV And ($LEV - $mLEV) <= 14 Then ; если Монстр ниже по уровню Перса или подходит по настройкам Бота
$OFS_mZ[4] = $I * 4 ; читаем Z - координату (для того чтоб не путать цели с воздушными)
$_mZ = _MemoryPointerRead($BASE, $PROCESS, $OFS_mZ, "float")
$mZ = Int($_mZ[1] / 10.0)
IF Abs($mZ - $Z) < 4 Then ; если Монстр не выше или не ниже Перса на 4 пункта по оси Z
$OFS_mDIS[4] = $I * 4 ; читаем Дистанцияю
$_mDIS = _MemoryPointerRead($BASE, $PROCESS, $OFS_mDIS, "float") ; / 10
$mDIS = Int($_mDIS[1] / 10.0)
If $mDIS < $dismin Then ; если раст. до моба < запомненного и он на земле (для варианта без ПОЛЕТА !!!)
$dismin = $mDIS ; перезапомнить меньшее растояние
$PRIORID = $mID ; перезапомнить ID моба
$FI = $I ; запомним номер моба в цикле или его место в памяти данных
;ConsoleWrite("mTP: " & $mTP & " mID: " & $mID & " mLEV: " & $mLEV & " mPOS: " & $mX & " " & $mY & " " & $mZ & " mDIS: " & $mDIS & @CRLF)
EndIf
EndIf
EndIf
EndIf
EndIf
Next
$OFS_mF[4] = $FI * 4 ; читаем Занятость моба
$_mF = _MemoryPointerRead($BASE, $PROCESS, $OFS_mF)
$mF = $_mF[1]
Until Not $mF ; выполнять цикл пока ближайший монстр будет никем не занят (если в настройках нет галочки - Помогать др. Игрокам)
_MemoryPointerWrite($BASE, $PROCESS, $OFS_AT, "0x" & $PRIORID) ; записать ID в адрес цели
$TARGET_STATE = _MemoryPointerRead($BASE, $PROCESS, $OFS_AT) ; прочитать состояние цели
; Цель найдена и она в Прицеле - далее подпрограмма атаки с применением умений
EndFunc