#RequireAdmin ; Обязательно Иначе не работае
#include <NomadMemory.au3> ; Для чтения Памяти игры
#include <GUIConstants.au3>
SetPrivilege("SeDebugPrivilege", 1)
Global $ProcessName = "Lineage II "
Global $ProcessID = WinGetProcess($ProcessName,"")
Global $DllInformation = _MemoryOpen($ProcessID)
Global $hWnd = WinGetHandle("Lineage II ", "")
Func GetData($Param1, $Param2="no param", $Param3="no param")
Local $Base, $MemTemp, $DataType, $Offset[5] = ["nop", "nop", "nop", "nop", "nop"] ;Определяем массив в который можно записать до 4 массивов. Сразу же присваиваем всем ячейкам какое-нибудь значение отличное от офсета.
;$Base - сюда скрипт записывает необходимый базовый адрес для текущего запроса
;$MemTemp - тут скрипт обрабатывает данные получаемые из памяти необходимые для текущего запроса
;$DataType - сюда скрипт записывает тип данных необходимый для текущего запроса
;При обращении в эту функцию, она сперва переопределяет все значения на необходимые скрипту в данный момент и далее отправляет эти данные на обработку
Select
Case $Param1 = "Char" ;наша структура работы с персонажем
Select
Case $Param2 = "Cur HP" ;жизни персонажа. Обращение: GetData("Char", "Cur HP")
$Base = 0x2077EE00 ;база ХП
$Offset[1] = "37c" ;Оффсет на ХП
$Offset[2] = "1ea0" ;Оффсет на ХП
$Offset[3] = "984" ;Оффсет на ХП
$Offset[4] = "204" ;Оффсет на ХП
$DataType = "dword" ;тип данных
Case $Param2 = "Cur MP" ;мана персонажа. Обращение: GetData("Char", "Cur HP")
$Base = 0x00955890 ;база МП
$Offset[1] = "C9" ;Оффсет на МП
$DataType = "dword" ;тип данных
Case $Param2 = "SXP" ;SXP персонажа. Обращение: GetData("Char", "SXP")
$Base = 0x00955e8c ;база SXP
$Offset[1] = "28" ;1-й Оффсет на SXP
$Offset[2] = "140" ;2-й Оффсет на SXP
$Offset[3] = "A8" ;3-й Оффсет на SXP
$DataType = "float" ;тип данных
Case Else
SetError(1)
;Сообщение об ошибке может быть закомменчено или наоборот, в зависимости от того чего мы хотим от скрипта.
;ErrorMsg('GetData("'&$Param1&'", WTF?...', 'Ошибка вызова: команды GetData("'&$Param1&'", "'&$Param2&'") не существует.')
EndSelect
Case $Param1 = "Target"
Select
Case $Param2 = "Cur HP" ;жизни цели. Обращение: GetData("Target", "Cur HP")
$Base = 0x00955e8c ;база tHP
$Offset[1] = "20" ;1-й Оффсет на tHP
$Offset[2] = "100" ;2-й Оффсет на tHP
$Offset[3] = "A8" ;3-й Оффсет на tHP
$DataType = "float" ;тип данных
Case Else
;Сообщение об ошибке может быть закомменчено или наоборот, в зависимости от того чего мы хотим от скрипта.
;ErrorMsg('GetData("'&$Param1&'", WTF?...', 'Ошибка вызова: команды GetData("'&$Param1&'", "'&$Param2&'") не существует.')
EndSelect
Case Else
;Сообщение об ошибке может быть закомменчено или наоборот, в зависимости от того чего мы хотим от скрипта.
ErrorMsg('GetData(WTF?...', 'Ошибка вызова: команды GetData("'&$Param1&'") не существует.')
EndSelect
;Тут происходит обработка данных пришедших сверхку
$MemTemp = (_MemoryRead($Base, $DllInformation)) ;первый запрос в память, полученный результат уже будет обрабатываться в цикле
For $i = 2 To UBound($Offset, 1)-1 Step 1 ;i начинается с двух потому что было решено оставить [0] ячейку пустой, мб в будущем пригодится. В обращениях же к памяти обращения идут в ячейку [$i-1]
If String($Offset[$i]) = "nop" Then ;Смотрим значение текущей ячейки. Если оно не содержит в себе оффсет
$MemTemp = (_MemoryRead($MemTemp+Dec($Offset[$i-1]), $DllInformation, $DataType)) ;Значит нам пора формировать последний запрос используя данные хранящиеся в пред идущей ячейке [$i-1], в котором необходимо указать тип данных которые мы желаем получить.
ExitLoop ;Отправив последний запрос, выходим из цикла. Нам больше нечего искать.
Else ;Если значение в текущей ячейке содержит в себе оффсет, значит и пред идущая ячейка содержит в себе оффсет.
$MemTemp = (_MemoryRead($MemTemp+Dec($Offset[$i-1]), $DllInformation)) ;Формируем запрос используя оффсет хранящийся в пред идущей от текущей ячейке [$i-1]
EndIf
Next
Return $MemTemp ;Возвращаем полученные данные.
EndFunc