1

Тема: Авто-поты в Ragnarok online

Здравствуйте.
Игра Ragnarok online.
Адреса текущего и максимального хп\сп я находил через ArtMoney.

Суть идеи:
Скрипт сравнивает значение 2ух адресов в памяти процесса.
Если адрес 1 < адреса 2 = нажимает кнопку (пока значение адреса 1 не будет = значению адреса 2 (либо меньше на 5%,10% и тп.)


P.S. Просьба именно ПОМОЧЬ. А не кидать ссылки на команды в ахк для работы с памятью. Все команды смотрел и изучал. Ни к чему не пришел. Спасибо за понимание.

2 (изменено: Alectric, 2015-01-29 17:33:51)

Re: Авто-поты в Ragnarok online

#singleinstance,forse

adress1=0x004213BD
adress2=0x025DA59A
size=4
ReadType=Float

process,Exist,explorer.exe
if !errorlevel
  exitapp
PID:=errorlevel

loop
{
  sleep,1000

  var1:=GetAdressValue(PID,adress1,size,ReadType)
  var2:=GetAdressValue(PID,adress2,size,ReadType)

  var3:=var1*100/var2-100

  if abs(var3)>10
    tooltip,Check`n"%var1%"`n"%var2%"`n"%var3%"
  else
    tooltip,_____`n"%var1%"`n"%var2%"`n"%var3%"
;    sendinput,1
}

; Источник: http://forum.script-coding.com/viewtopic.php?pid=90869#p90869
GetAdressValue(PID, ReadAddress, ReadSize = 4, ReadType="UInt")
{
  VarSetCapacity(Buf, ReadSize, 0)
  PROCESS_VM_READ = 0x10
  hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                   , Int, False
                                   , UInt, PID)
  If(!hProcess)
    Return "Ошибка #1"
  Ret := DllCall("ReadProcessMemory", UInt, hProcess
                                    , UInt, ReadAddress
                                    , UInt, &Buf
                                    , UInt, ReadSize
                                    , UInt, 0)
  DllCall("CloseHandle", UInt, hProcess)
  If(!Ret)
    Return "Нельзя прочитать"
  Return NumGet(Buf, 0, ReadType)
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3

Re: Авто-поты в Ragnarok online

Пробовал разобраться с выше приведеным скриптом.
Результат:
Читает адреса которые я вставляю в скрипт и выдает значения 0.

К сожалению не хватает знаний, что бы корректо настроить его.

Автор скрипта, пожалуйста оставь контактные данные или напиши мне сам.
Буду рад пообщаться и набраться опыта от Вас.

Спасибо за быстрый ответ.
Мой skype: qwertyur505

4 (изменено: Alectric, 2015-02-01 07:39:26)

Re: Авто-поты в Ragnarok online

Size - это размер данных ( в артмане это указанно как - 4 байта, 2 байта и т.д.).
ReadType - тип читаемых данных (целое(int)/с точкой(float)).
Explorer.exe - процесс с которым работать.
... больше незнаю что еще добавить...

Спрашивай что еще объяснить.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5 (изменено: BombeR, 2015-02-01 15:46:41)

Re: Авто-поты в Ragnarok online


  var3:=var1*100/var2-100

  if abs(var3)>10
    tooltip,Check`n"%var1%"`n"%var2%"`n"%var3%"
  else
    tooltip,_____`n"%var1%"`n"%var2%"`n"%var3%"
;    sendinput,1

Пожалуйста поясни, как и что считает формула.
Желатаельно напиши что выполняет каждая строчка.
Понял, что что-то сравнивается или переводится... Но не могу понять что.

UPD:
Адреса считывает, выводит правильные значения.
попробовал на другом сервере. Вот что вышло

#singleinstance,forse

adress1=0x83E1B4
adress2=0x83E1B8
size=4
ReadType=int

process,Exist,woe-ro.bin
if !errorlevel
  exitapp
PID:=errorlevel

loop
{
  sleep,100

  var1:=GetAdressValue(PID,adress1,size,ReadType)
  var2:=GetAdressValue(PID,adress2,size,ReadType)

  var3:=var1*100/var2-100

  if abs(var3)>10
    tooltip,Check`n"%var1%"`n"%var2%"`n"%var3%"
  else
    tooltip,_____`n"%var1%"`n"%var2%"`n"%var3%"
    send {F1}
}

; Источник: http://forum.script-coding.com/viewtopic.php?pid=90869#p90869
GetAdressValue(PID, ReadAddress, ReadSize = 4, ReadType="UInt")
{
  VarSetCapacity(Buf, ReadSize, 0)
  PROCESS_VM_READ = 0x10
  hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                   , Int, False
                                   , UInt, PID)
  If(!hProcess)
    Return "Ошибка #1"
  Ret := DllCall("ReadProcessMemory", UInt, hProcess
                                    , UInt, ReadAddress
                                    , UInt, &Buf
                                    , UInt, ReadSize
                                    , UInt, 0)
  DllCall("CloseHandle", UInt, hProcess)
  If(!Ret)
    Return "345"
  Return NumGet(Buf, 0, ReadType)
}

Вот наглядно видно, что он правильно считывает 1(текущее ХП) и 2 значение(Максимальное ХП)
Кушает зельля, ХП восстанавливается
Но ! Не останавливается поедать зелья когда значения становятся равным друг другу 10870=10870(Все равно нажимает)
Как убрать эту всплывающую табличку со значениями ?

6 (изменено: BombeR, 2015-02-01 16:02:36)

Re: Авто-поты в Ragnarok online

Вот готовый скрипт для сервера Woe-ro
Теперь буду пробовать сделать тоже самое для своего сервера.

#singleinstance,forse

adress1=0x83E1B4
adress2=0x83E1B8
size=4
ReadType=int

process,Exist,woe-ro.bin
if !errorlevel
  exitapp
PID:=errorlevel

$home::
loop
{
  sleep,1

  var1:=GetAdressValue(PID,adress1,size,ReadType)
  var2:=GetAdressValue(PID,adress2,size,ReadType)

  var3:=var2-var1

  if abs(var3)>2000
    ;tooltip,Check`n"%var1%"`n"%var2%"`n"%var3%"
  ;else
    ;tooltip,_____`n"%var1%"`n"%var2%"`n"%var3%"
    send {F1}
}


GetAdressValue(PID, ReadAddress, ReadSize = 4, ReadType="UInt")
{
  VarSetCapacity(Buf, ReadSize, 0)
  PROCESS_VM_READ = 0x10
  hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
                                  , Int, False
                                   , UInt, PID)
  If(!hProcess)
    Return "Ошибка #1"
  Ret := DllCall("ReadProcessMemory", UInt, hProcess
                                    , UInt, ReadAddress
                                    , UInt, &Buf
                                   , UInt, ReadSize
                                    , UInt, 0)
  DllCall("CloseHandle", UInt, hProcess)
  If(!Ret)
    Return "345"
  Return NumGet(Buf, 0, ReadType)
}

$end::    
pause
return

7 (изменено: Alectric, 2015-02-01 19:57:40)

Re: Авто-поты в Ragnarok online

var3:=var1*100/var2-100

Эта формула считает процент отличия между двумя значениями var1 и var2 (обычная математика).

if abs(var3)>10
  tooltip,Check`n"%var1%"`n"%var2%"`n"%var3%"

Буквально: "Если абсолютное значение переменной var3 больше 10, то выполнить действие" (в данном случае отобразить tooltip).


  if abs(var3)>10
    tooltip,Check`n"%var1%"`n"%var2%"`n"%var3%"
  else
    tooltip,_____`n"%var1%"`n"%var2%"`n"%var3%"
    send {F1}

Tooltipы использовал для наглядности, в место них нужно подставить нужные действия.

  if abs(var3)>10
    send {F1}

Если под одним условием несколько строк, то нужно взять их в фигурные скобки.
Пример:

  if abs(var3)>10
  {
    tooltip,Check`n"%var1%"`n"%var2%"`n"%var3%"
    send {F1}
  }
  else
    tooltip,_____`n"%var1%"`n"%var2%"`n"%var3%"
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

8

Re: Авто-поты в Ragnarok online

Спасибо за разъяснения )
Очень помог )
Надеюсь этот скрипт будет полезен другим игрокам.

9

Re: Авто-поты в Ragnarok online

BombeR пишет:

Спасибо за разъяснения )
Очень помог )
Надеюсь этот скрипт будет полезен другим игрокам.

Он безусловно полезен! Я сам рошник. Писал для себя на ahk визуал ботов. Отжер хп и сп реализовывал через поиск пикселя в координатах, а вот додуматься залезать в адреса памяти -  для меня это совершенно новый, и наверное недостижимый уровень.
Уже кучу раз перечитал справку по вызову DllCall, но не понимаю как с ними работать, наверное тут все-таки надо быть программистом, а не самоучкой.