РЕШЕНО [AHK] Авто-Отключение радио в машине.

Тема в разделе "Помощь", создана пользователем Serega_Mokrov, 11 авг 2017.

?

Вам понравился скрипт?

  1. Да.

    0 голосов
    0,0%
  2. Я бы сделал лучше, но не хочу

    100,0%
Статус темы:
Закрыта.
  1. Serega_Mokrov

    Serega_Mokrov Новичок

    Сообщения:
    1
    Симпатии:
    1
    Баллы:
    1
    Сервер:
    01
    Надоело это радио, а если в настройках отключить звук радио, то не будет играть музыка из /fm
    Скрипт состоит из 5 функций для чтения памяти игры и одного цикла, всего 140 строк кода
    У каждой радиостанции в GTA есть свой ID, а вот когда радио отключено - её ID 13
    Так вот, этот скрипт листает радио пока не достигнет ID 13
    Думаю я доходчиво объяснил :)


    Самое главное, это кнопка переключения радио.
    У меня это R и 4. По этому как видно в коде ниже у меня Send, {R} (См. в конце кода)
    Если у вас не на R и 4, вы легко можете поменять сами. Ну или написать мне в Личные Сообщения.

    FAQ по AHK: https://forum.gtarp.ru/threads/faq-ahk-autohotkey.92608/
    Cкачать скрипт можно по ссылке: https://yadi.sk/d/UlCFtCth3Ltreb

    Выкладываю код скрипта в тему. Использую AutoHotKey 1.1.25.02
    Код:
    global newPID := getPID("grand_theft_auto_san_andreas.dll")
    
    global hGTA := openProcess(newPID)
    
    getPID(sProcess) {
    Process, Exist, %sProcess%
    dwPID = %ErrorLevel%
    if(dwPID == 0) {
    ErrorLevel := ERROR_PROCESS_NOT_FOUND
    return 0
    }
    ErrorLevel := ERROR_OK
    return dwPID
    }
    
    openProcess(dwPID, dwRights = 0x1F0FFF) {
    hProcess := DllCall("OpenProcess"
    , "UInt", dwRights
    , "int",  0
    , "UInt", dwPID
    , "Uint")
    if(hProcess == 0) {
    ErrorLevel := ERROR_OPEN_PROCESS
    return 0
    }
    ErrorLevel := ERROR_OK
    return hProcess
    }
    
    getModuleBaseAddress(sModule, hProcess) {
    if(!sModule) {
    ErrorLevel := ERROR_MODULE_NOT_FOUND
    return 0
    }
    if(!hProcess) {
    ErrorLevel := ERROR_INVALID_HANDLE
    return 0
    }
    dwSize = 1024*4
    VarSetCapacity(hMods, dwSize)
    VarSetCapacity(cbNeeded, 4)
    dwRet := DllCall(    "Psapi.dll\EnumProcessModules"
    , "UInt", hProcess
    , "UInt", &hMods
    , "UInt", dwSize
    , "UInt*", cbNeeded
    , "UInt")
    if(dwRet == 0) {
    ErrorLevel := ERROR_ENUM_PROCESS_MODULES
    return 0
    }
    dwMods := cbNeeded / 4
    i := 0
    VarSetCapacity(hModule, 4)
    VarSetCapacity(sCurModule, 260)
    while(i < dwMods) {
    hModule := NumGet(hMods, i*4)
    DllCall("Psapi.dll\GetModuleFileNameEx"
    , "UInt", hProcess
    , "UInt", hModule
    , "Str", sCurModule
    , "UInt", 260)
    SplitPath, sCurModule, sFilename
    if(sModule == sFilename) {
    ErrorLevel := ERROR_OK
    return hModule
    }
    i := i + 1
    }
    ErrorLevel := ERROR_MODULE_NOT_FOUND
    return 0
    }
    
    readMem(hProcess, dwAddress, dwLen=4, type="UInt") {
        if(!hProcess) {
            ErrorLevel := ERROR_INVALID_HANDLE
            return 0
        }
       
        VarSetCapacity(dwRead, dwLen)
        dwRet := DllCall(    "ReadProcessMemory"
                            , "UInt",  hProcess
                            , "UInt",  dwAddress
                            , "Str",   dwRead
                            , "UInt",  dwLen
                            , "UInt*", 0)
        if(dwRet == 0) {
            ErrorLevel := ERROR_READ_MEMORY
            return 0
        }
       
        ErrorLevel := ERROR_OK
        return NumGet(dwRead, 0, type)
    }
    
    readDWORD(hProcess, dwAddress) {
    if(!hProcess) {
    ErrorLevel := ERROR_INVALID_HANDLE
    return 0
    }
    VarSetCapacity(dwRead, 4)
    dwRet := DllCall(    "ReadProcessMemory"
    , "UInt",  hProcess
    , "UInt",  dwAddress
    , "Str",   dwRead
    , "UInt",  4
    , "UInt*", 0)
    if(dwRet == 0) {
    ErrorLevel := ERROR_READ_MEMORY
    return 0
    }
    ErrorLevel := ERROR_OK
    return NumGet(dwRead, 0, "UInt")
    }
    
    Loop
    {
    IfWinActive Criminal Russia Multiplayer Ревизия G
    {
        isPlayerInAnyVehicle := readDWORD(hGTA, 0xBA18FC)
        if (isPlayerInAnyVehicle != 0)
        {
            dwGTA := getModuleBaseAddress("grand_theft_auto_san_andreas.dll", hGTA)
            RadioStationID := readMem(hGTA, dwGTA + 0x4CB7E1, 1, "byte")
            IsInMenu := readMem(hGTA, 0xBA67A4, 4, "byte")
           
            if (IsInMenu == 1)
                continue
           
            if (RadioStationID == 13)
                continue
           
            if (RadioStationID != 13)
            {
                SetKeyDelay, 1, 1
                Send, {R}
                continue
            }   
        }
    }
    }
     
    Jim_Rose нравится это.
  2. Aleksandr Capone

    Aleksandr Capone Администратор [02]

    Сообщения:
    16.133
    Симпатии:
    7.939
    Баллы:
    113
    Ник:
    Aleksandr_Capone
    Сервер:
    01
    Закрыто.
     
    Alexandr Accardo нравится это.
Статус темы:
Закрыта.

Поделиться этой страницей

Присоединяйтесь к нам!

нас уже человек

Личный кабинет