Что нового

[Grand Fantasia] Не работает функция, пить HP банку, если HP меньше...

scanfail

Знающий
Сообщения
244
Репутация
17
Уже пару дней как мучаюсь... Низкий уровень знаний AU и библиотеки NomadMemory, не дают довести до конца мою идею, хотелось бы узнать, где тут допущена ошибка? Почему персонаж не пьет HP, если она уже ниже, чем в Input-е?

Код:
Global $windowtitle = "Grand Fantasia"
Global $processid = ProcessExists("GrandFantasia.exe")
Global $pointer = 0x00A6486C
Global $hppointer = $pointer
Global $hpoffset1 = Dec("8")
Global $hpoffset2 = Dec("4")
Global $hpcappointer = $pointer
Global $hpcapoffset1 = Dec("8")
Global $hpcapoffset2 = Dec("48")

#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#Region ### START GUI section ###
$GFBoT = GUICreate("HP Test", 201, 71, 600, 300)
$CheckHP = GUICtrlCreateCheckbox("HP", 85, 5, 35, 17)
$Label1 = GUICtrlCreateLabel("If HP", 10, 35, 25, 17)
$InputHP = GUICtrlCreateInput("", 40, 33, 50, 21)
$Label2 = GUICtrlCreateLabel("then send", 95, 35, 51, 17)
$ComboHP = GUICtrlCreateCombo("{1}", 150, 33, 40, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
#EndRegion ### END GUI section ###
check()

Func check()
    If WinExists("Grand Fantasia") Then
        GUISetState(@SW_SHOW, $GFBoT)
    Else
        Global $ask = MsgBox(0, "Ошибка", "Сперва запустите Grand Fantasia!")
        Exit
    EndIf
 EndFunc
 
 Func HP()
    If GUICtrlRead($CheckHP) = $GUI_CHECKED Then
        HPPotion()
    EndIf
EndFunc
 
 Func HPPotion()
	mem()
	If $currenthp <= GUICtrlRead($InputHP) Then
	   $Send = GUICtrlRead($ComboHP)
	   Send($Send)
	   EndIf
	   EndFunc

Func mem()
	$memopen = _memoryopen($processid)
	Global $currenthp = _memoryread($hppointer, $memopen)
	Global $hpcur1 = "0x" & Hex($currenthp + $hpoffset1)
	Global $currenthp = _memoryread($hpcur1, $memopen)
	Global $hpcur2 = "0x" & Hex($currenthp + $hpoffset2)
	Global $currenthp = _memoryread($hpcur2, $memopen)
	_memoryclose($processid)
EndFunc

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
 Case $GUI_EVENT_CLOSE
	GUIDelete()
			Exit

	EndSwitch
WEnd
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Никак не пойму, где я допустил ошибку? HPPot Tester

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Никак не пойму, где я допустил ошибку? HPPot Tester" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.











Добавлено:
Сообщение автоматически объединено:

Название темы не является какой-либо из вариаций "чяяятиков", "никак не пойму" и прочие вариации не приветствуются.
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Re: Никак не пойму, где я допустил ошибку? HPPot Tester

былобы не плохо обращаться к функциям а не только их создавать
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Никак не пойму, где я допустил ошибку? HPPot Tester

И если в самих сообщениях темы упоминается название игры, оно должно быть выведено в название темы так, как регламентировано в правилах. Еще одно подобное название или какая-либо другая обнаруженная мной ошибка при создании темы, и я порекомендовав тебе сменить форум, просто буду удалять абсолютно все последующие твои темы и сообщения на подконтрольных мне территориях
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Ок... Учту
cray.png
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Вот так бы сразу оформлял названия и вопросов бы не возникало
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Во время создания темы, я не мог определится, как правильно назвать тему... :whistle::
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
scanfail,
если ответ winstan тебе помог, то отметь что проблема решена.

А если не помог, то вызови, наконец, функцию HP()
Ну хотя бы вот так
Код:
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE
			GUIDelete()
            Exit
		Case Else
			Hp()
    EndSwitch
WEnd
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Увы, теперь сия скрипт постоянно спамит, клавишей 1, вместо того, чтобы в нужное время эмулировать данную клавишу ....
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Значит ставь в контрольной точке вывод отладочной информации
Код:
Func HPPotion()
    mem()
    Msgbox(0,"отладка","текущее значение HP в памяти : " & $currenthp) ; <=========
    If $currenthp <= GUICtrlRead($InputHP) Then
       $Send = GUICtrlRead($ComboHP)
       Send($Send)
	EndIf
EndFunc

И разбирайся что же ты читаешь из памяти и почему оно всегда меньше чем GUICtrlRead($InputHP).

Кстати
[box title=http://autoit-script.ru/autoit3_docs/functions/GUICtrlRead.htm]
Элемент Возвращаемое значение
Input, Edit Текстовое содержимое элемента[/box]

Строку не хочешь в число преобразовать?
Код:
Number(GUICtrlRead($InputHP))
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Выложи скрин как через CE ты читаешь значение хп из памяти
в твоей mem() чёрт ногу сломит :stars:...
 

running-frag

why me?
Сообщения
441
Репутация
60
C2H5OH [?]
Строку не хочешь в число преобразовать?
Ммм а нужно? У меня работает без преобразования. Т.е. GUICtrlRead($InputHP) и можно значение подставлять как цифру. (Исключение это если в поле введено помимо цифры что то ещё)
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Прошу простить, отсутствовал некоторое время. Но вот я тут, снова :IL_AutoIt_1:. В игре было обновление, вот новенький поинтер: 0x00A6486C . Но данный код, увы по прежнему не работает :'(. Отладчик отображает 0 HP.
Дабы рассеять сомнения насчет того, что, правильный ли поинтер я нашел, вот скрин:
f920f5f9b234.jpg

Проблема по прежнему не решена :(
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А код сейчас какой используется?
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Эммм, не совсем понял, что подразумевается под кодом?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код: AutoIt
Покажи свой скрипт, кокой он сейчас?
 
Автор
S

scanfail

Знающий
Сообщения
244
Репутация
17
Сейчас заново проверю его, попробую переделать и выложу :beer:. Надеюсь на этот раз все получится.


Добавлено:
Сообщение автоматически объединено:

Возможно кривой код, но вот, отладчик опять показывает: HP 0...:
Код:
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
#Region ### START GUI section ###
$GFBoT = GUICreate("HP Test", 201, 71, 600, 300)
$CheckHP = GUICtrlCreateCheckbox("HP", 85, 5, 35, 17)
$Label1 = GUICtrlCreateLabel("If HP", 10, 35, 25, 17)
$InputHP = GUICtrlCreateInput("", 40, 33, 50, 21)
$Label2 = GUICtrlCreateLabel("then send", 95, 35, 51, 17)
$ComboHP = GUICtrlCreateCombo("{1}", 150, 33, 40, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
#EndRegion ### END GUI section ###
check()

Func check()
    If WinExists("Grand Fantasia") Then
        GUISetState(@SW_SHOW, $GFBoT)
    Else
        Global $ask = MsgBox(0, "Ошибка", "Сперва запустите Grand Fantasia!")
        Exit
    EndIf
 EndFunc
 Func HP()
    If GUICtrlRead($CheckHP) = $GUI_CHECKED Then
        HPPotion()
    EndIf
EndFunc
Func HPPotion()
    READMEM()
    Msgbox(0,"отладка","текущее значение HP в памяти : " & $CURRENTHP)
    If $CURRENTHP <= GUICtrlRead($InputHP) Then
       $Send = GUICtrlRead($ComboHP)
       Send($Send)
    EndIf
EndFunc
Func INITSTUFF()
	Global $WINDOWTITLE = "Grand Fantasia"
	Global $PROCESSID = ProcessExists("GrandFantasia.exe")
	Global $HPPOINTER = 0x00A6486C
	$MEMOPEN = _MEMORYOPEN($PROCESSID)
	Global $HPOFFSET1 = Dec("8")
	Global $HPOFFSET2 = Dec("4")
	Global $HPCAPPOINTER = 0x00A6486C
	Global $HPCAPOFFSET1 = Dec("8")
	Global $HPCAPOFFSET2 = Dec("48")
	_MEMORYCLOSE($PROCESSID)
EndFunc
Func READMEM()
   INITSTUFF()
	$MEMOPEN = _MEMORYOPEN($PROCESSID)
	Global $CURRENTHP = _MEMORYREAD($HPPOINTER, $MEMOPEN)
	Global $HPCUR1 = "0x" & Hex($CURRENTHP + $HPOFFSET1)
	Global $CURRENTHP = _MEMORYREAD($HPCUR1, $MEMOPEN)
	Global $HPCUR2 = "0x" & Hex($CURRENTHP + $HPOFFSET2)
	Global $CURRENTHP = _MEMORYREAD($HPCUR2, $MEMOPEN)
	Global $HPCAP = _MEMORYREAD($HPCAPPOINTER, $MEMOPEN)
	Global $HPCAP1 = "0x" & Hex($HPCAP + $HPCAPOFFSET1)
	Global $HPCAP = _MEMORYREAD($HPCAP1, $MEMOPEN)
	Global $HPCAP2 = "0x" & Hex($HPCAP + $HPCAPOFFSET2)
	Global $HPCAP = _MEMORYREAD($HPCAP2, $MEMOPEN)
	_MEMORYCLOSE($PROCESSID)
 EndFunc
 
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            Exit
        Case Else
            HP()
    EndSwitch
WEnd
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Вот эти непонятные действия в функции READMEM() сократи до
Код:
Func READMEM()
   INITSTUFF()
    $MEMOPEN = _MEMORYOPEN($PROCESSID)
    Global $CURRENTHP = _MEMORYREAD($HPPOINTER, $MEMOPEN)
    _MEMORYCLOSE($PROCESSID)
 EndFunc
 
Верх