код не работает

bebubyabyuabua

Активный
Автор темы
117
30
Версия SA-MP
  1. 0.3.7-R3
Пытаюсь сделать скрипт который нажимает в определенное время ALT и синхронизирует время с пк.
Пользовался двумя этими ссылками: https://www.blast.hk/threads/159790/ , https://www.blast.hk/threads/183283/

Я абсолютно не разбираюсь в языке LUA, все что понимаю это английские слова в коде и их перевод, а что оно делает я не понимаю

Пробами с нейросетью она мне выдала вариант, кто-нибудь может подсказать, что не так?

Или подредактировать её версию и выдать работающую на лаунчере Arizona RP

Код:
require 'lib.moonloader'
require 'vkeys' -- Подключаем библиотеку vkeys

function main()
    -- Создаем новый поток для выполнения основного кода
    lua_thread.create(function()
        while true do
            -- Получаем текущее время
            local currentTime = os.date('%H:%M:%S')
       
            -- Проверяем, совпадает ли текущее время с нужным
            if currentTime == "06:45:33" then -- Укажите нужное время здесь
                print("Нажимаем Alt...")
           
                -- Нажимаем клавишу Alt (VK_MENU = 18)
                vkeys.click(18) -- Нажимает и отпускает клавишу Alt
           
                -- Ждем одну секунду, чтобы избежать повторного нажатия
                wait(1000)
            end
       
            -- Ждем немного перед следующей проверкой (например, 100 мс)
            wait(100)
        end
    end)
end

-- Запускаем основную функцию
main()

Выдаёт следующую ошибку
Код:
[ML] (error) autoalt.lua: ...rizona Games Launcher\bin\arizona\moonloader\autoalt.lua:14: attempt to index upvalue 'lua_thread' (a nil value)
stack traceback:
    ...rizona Games Launcher\bin\arizona\moonloader\autoalt.lua:14: in function 'main'
    ...rizona Games Launcher\bin\arizona\moonloader\autoalt.lua:42: in main chunk
[ML] (error) autoalt.lua: Script died due to an error. (329C5174)
 
Последнее редактирование:

dask

Участник
22
3
А как сделать чтобы в самой игре прожималось? Условно игра в двух окнах, нужно чтобы в обоих прожалось

вот вроде

Lua:
require 'lib.moonloader'

local ffi = require 'ffi'

ffi.cdef[[
    typedef void* HWND;
    typedef unsigned long DWORD;
    typedef long LONG;
    typedef struct {
        LONG x;
        LONG y;
    } POINT;
 
    HWND FindWindowA(const char* lpClassName, const char* lpWindowName);
    HWND FindWindowExA(HWND hWndParent, HWND hWndChildAfter, const char* lpszClass, const char* lpszWindow);
    int SendMessageA(HWND hWnd, unsigned int Msg, uintptr_t wParam, uintptr_t lParam);
    int PostMessageA(HWND hWnd, unsigned int Msg, uintptr_t wParam, uintptr_t lParam);
    int GetWindowTextA(HWND hWnd, char* lpString, int nMaxCount);
    HWND GetWindow(HWND hWnd, unsigned int uCmd);
    int IsWindowVisible(HWND hWnd);
]]

local user32 = ffi.load('user32')

local WM_KEYDOWN = 0x0100
local WM_KEYUP = 0x0101
local VK_MENU = 0x12
local GW_HWNDNEXT = 2

local TARGET_TIME = "22:34:20"
local CHECK_INTERVAL = 100

function findAllSampWindows()
    local sampWindows = {}
    local hwnd = user32.FindWindowA("Grand Theft Auto San Andreas", nil)
 
    if hwnd ~= nil then
        table.insert(sampWindows, hwnd)
    
        local nextHwnd = hwnd
        while true do
            nextHwnd = user32.FindWindowExA(nil, nextHwnd, "Grand Theft Auto San Andreas", nil)
            if nextHwnd == nil then break end
        
            if user32.IsWindowVisible(nextHwnd) == 1 then
                table.insert(sampWindows, nextHwnd)
            end
        end
    end
 
    return sampWindows
end

function getWindowTitle(hwnd)
    local buffer = ffi.new("char[256]")
    local length = user32.GetWindowTextA(hwnd, buffer, 256)
    if length > 0 then
        return ffi.string(buffer, length)
    end
    return ""
end

function sendAltToWindow(hwnd)
    user32.PostMessageA(hwnd, WM_KEYDOWN, VK_MENU, 0)
    wait(50)
    user32.PostMessageA(hwnd, WM_KEYUP, VK_MENU, 0)
end

function main()
    local lastSecond = -1
 
    while true do
        local currentTime = os.date('%H:%M:%S')
        local hour, minute, second = currentTime:match("(%d+):(%d+):(%d+)")
        second = tonumber(second)
    
        if second ~= lastSecond then
            lastSecond = second
        
            if currentTime == TARGET_TIME then
                local sampWindows = findAllSampWindows()
            
                for i, hwnd in ipairs(sampWindows) do
                    sendAltToWindow(hwnd)
                    wait(10)
                end
            
                wait(3600000)
                lastSecond = -1
            end
        end
    
        wait(CHECK_INTERVAL)
    end
end

Или как ниже предложили через setGame Key State


Lua:
require 'lib.moonloader'

local TARGET_MINUTES = "00:00"
local CHECK_INTERVAL = 100

function main()
    local lastSecond = -1
   
    while true do
        local currentTime = os.date('%H:%M:%S')
        local hour, minute, second = currentTime:match("(%d+):(%d+):(%d+)")
        second = tonumber(second)
        local currentMinSec = string.format("%s:%s", minute, second)
       
        if second ~= lastSecond then
            lastSecond = second
           
            if currentMinSec == TARGET_MINUTES then
                setGameKeyState(18, 255)
                wait(50)
                setGameKeyState(18, 0)
               
                wait(61000)
                lastSecond = -1
            end
        end
       
        wait(CHECK_INTERVAL)
    end
end
 
Последнее редактирование:

976h

Активный
248
78
  • Нравится
  • Bug
Реакции: bebubyabyuabua и Corenale