1 (изменено: Dworkin, 2013-04-07 04:19:21)

Тема: AHK: if, else, then при зажатой клавише

Здравствуйте снова Возникла необходимость написать один макрос с которым я не могу справится сам к сожалению поэтому прошу вашей помощи.

Суть скрипта:
Я зажимаю клавишу F2. Когда я зажал ее, она должна через память все время считывать данные про оружие в руках, зажимать правую кнопку мыши(прицел), зажимать левую кнопку мыши(стрельба) и когда патронов в этом обойме остается 2 , оно отжимает левую кнопку мыши, отжимает правую кнопку мыши и посылает скролл. И так по кругу пока зажата клавиша.

То есть:
Я зажал клавишу F2
Все время(loop) считывается данные об оружие и когда в руках, оказывается именно это оружие, тогда

зажимается левая и правая кнопка мыши и все время(loop) считывается количество патронов в обойме, и когда в обойме оказывается 2 патрона то

отпускается левая и правая кнопка мыши и посылается скрол. И так по кругу пока зажат F2



Вот скрипт:

processName := "gta_sa.exe"
baseAddressPointer := 0xB7CD98
deaglestateoffset := 0x5D8
deagleammooffset := 0x5E0

InitAddresses() {
    global
baseAddress := ProcessReadMemory(baseAddressPointer, processName)

deagleAddress := baseAddress + deaglestateoffset ; считывает какое оружие
deagleammoAddress := baseAddress + deagleammooffset ; количество патронов в обойме 
}

F2::
if !baseAddress
        InitAddresses()

loop
{
deagle := ProcessReadMemory(deagleAddress, processName, "UInt") ; считывает оружие в   руках
if deagle = 24 ; если равно 24 что значит в руках дигл
}

then 

send {RBUTTON down}
send {LBUTTON down}

Loop
{
ammo := ProcessReadMemory(deagleammoAddress, processName, "UInt") ; считывает патроны в обойме
     if ammo = 2 ; если в обойме 2 патрона то
}

then 

send {RBUTTON up}
send {LBUTTON up}
sleep, 50
       send {vk51 down} 
       sleep, 50
       send {vk51 up}
       sleep 50
       send {vk45 down}
       sleep, 50
       send {vk45 up}
return

Знаю что код не правильный просто я попытался точно передать суть скрипта.

2 (изменено: creature.ws, 2013-04-07 09:30:29)

Re: AHK: if, else, then при зажатой клавише

processName := "gta_sa.exe"
baseAddressPointer := 0xB7CD98
pistolWeaponTypeOffset := 0x5D8 ; тип оружия, не deaglestate
pistolAmmoInClipOffset := 0x5E0

F2::
    if !baseAddress
        InitAddresses()

    SetTimer CheckWeapon, 100 ; проверять нужно не более чем в два раза чаще периодичности убывания боеприпаса. пример: 1 выстрел в сек - проверяем значение не чаще раз в 500 мс.
    KeyWait F2
    SetTimer CheckWeapon, Off
    return

CheckWeapon:
    if (!mouseButtonsIsPressed && ProcessReadMemory(pistolWeaponTypeAddress, processName, "UInt") = 24) { ; если кнопки еще не зажаты и тип оружия = 24
        Send {RBUTTON down}{LBUTTON down}
        mouseButtonsIsPressed := true
    }

    if (mouseButtonsIsPressed && ProcessReadMemory(pistolAmmoInClipAddress, processName, "UInt") <= 2) { ; если кнопки уже зажаты и количество б.п. <= 2
        SetKeyDelay, 20, 50 ; для SendEvent лучше, чем использовать кучку Sleep
        Send {RBUTTON up}{LBUTTON up}{vk51}{vk45}
        mouseButtonsIsPressed := false
    }
    return

InitAddresses() {
    global
    baseAddress := ProcessReadMemory(baseAddressPointer, processName)
    pistolWeaponTypeAddress := baseAddress + pistolWeaponTypeOffset ; подсчитывает указатель по которому можно прочитать значение текущего типа оружия
    pistolAmmoInClipAddress := baseAddress + pistolAmmoInClipOffset ; указатель на значение количества патронов в обойме
}

3

Re: AHK: if, else, then при зажатой клавише

Спасибо

4

Re: AHK: if, else, then при зажатой клавише

Решил переделать под другое оружие.

processName := "gta_sa.exe"
baseAddressPointer := 0xB7CD98
SniperWeaponTypeoffset := 0x648

InitAddresses() {
    global
    baseAddress := ProcessReadMemory(baseAddressPointer, processName)
    SniperWeaponTypeAddress := baseAddress + SniperWeaponTypeoffset ; тип оружия для снайперки
}

F2::

    if !baseAddress
        InitAddresses()

    SetTimer CheckWeapon, 100
    KeyWait F2
    SetTimer CheckWeapon, Off
    return

CheckWeapon:
    if (processReadMemory(SniperWeaponTypeAddress, processName, "UInt") != 34) ;  если не равно 34 значит в руках не снайперка и послать сообщение
       {
       msgbox, в руках нету снайперки
       }
    else if (processReadMemory(SniperWeaponTypeAddress, processName, "UInt") = 34) ; иначе если в руках снайперка то выполнить след действия
       {
        send {vk01 down}
        KeyWait, vk02, D
        sleep 350
        send {vk43 down}
        sleep 50
        send {vk43 up}
        sleep 150
        send {vk01 up}
       }
    return

Но почему не работает:( Зажимаю F2. Если в руках что либо другое то сообщение не присылает так же выполняет действия с любым видом(

5

Re: AHK: if, else, then при зажатой клавише

Все решил. Спасибо)

6

Re: AHK: if, else, then при зажатой клавише

+ Сообщение не имееющее отношения к заданным вопросам
if 34 != 34
    действие
else if 34 = 34
   действие

Сперва выполняется проверка истинности неравенства значения возвращаемого ProcessReadMemory, после — проверка истинности равентва. Это лишнее.
Если (34 != 34) = false то 34 = 34, и повторно вызывать ProcessReadMemory нет необходимости.