Имитация нажатия

Статус
В этой теме нельзя размещать новые ответы.

EndoHokage

Активный
Автор темы
136
55
Здравствуйте, можно ли как то имитировать нажатие клавиши в луа?
Что бы сервер думал что ты нажимаешь эти клавиши на клавиатуре
 
  • Нравится
Реакции: Mamory
Решение
сервер считывает нажатия не всех кнопок. вот тебе список который я составил методом тыка
Y = gunid + 64
F =keydata + 16
H = gunid + 192
C = keydata + 2
N = gunid + 128
LMB = keydata + 4
RMB = keydata + 128
TAB = keydata + 1
SPRINT = keydata +8
ALT = keydata + 1024
JUMP = keydata + 32
итак. к чему я это говорю
для нажатия альта я использовал функцию фипа которая копирует синхру в таблицу

Lua:
if str:find('ALT') and dist < 5.0 then
    local data = samp_create_sync_data('player')
    data.keysData = data.keysData + 1024
    data.send()
end
в чём профит спросите вы? не будут нажиматься кнопки клавиатуры. вот и всё в принципе.

maestto

Известный
93
115
это не отправка пакета серверу, а полноценная эмуляция нажатия клавиш - setVirtualKeyDown(int vkey, bool down). номера клавиш можно узнать тут.

пример, зажатие клавиши w на секунду:
Lua:
setVirtualKeyDown(87, true) -- зажатие 87 клавиши (W)
wait(1000) -- задержка на секунду
setVirtualKeyDown(87, false) -- отпускание 87 клавиши (W)


есть, конечно, ещё одна, но более ограниченная в плане количества клавиш (и не только), функция setGameKeyState(int key, int state) статья на дев_вики и дополнительная информация об аргументах функции
 
Последнее редактирование:

EndoHokage

Активный
Автор темы
136
55
это не отправка пакета серверу, а полноценная эмуляция нажатия клавиш - setVirtualKeyDown(int vkey, bool down). номера клавиш можно узнать тут.

пример, зажатие клавиши w на секунду:
Lua:
setVirtualKeyDown(87, true) -- зажатие 87 клавиши (W)
wait(1000) -- задержка на секунду
setVirtualKeyDown(87, false) -- отпускание 87 клавиши (W)


есть, конечно, ещё одна, но более ограниченная в плане количества клавиш (и не только), функция setGameKeyState(int key, int state) статья на дев_вики и дополнительная информация об аргументах функции
Тут же wait ну подойдёт? Нужно через потоки делать?
 
  • Нравится
Реакции: Mamory

deddosouru

Смотрю аниме, служу Сатане
Друг
2,036
1,317
сервер считывает нажатия не всех кнопок. вот тебе список который я составил методом тыка
Y = gunid + 64
F =keydata + 16
H = gunid + 192
C = keydata + 2
N = gunid + 128
LMB = keydata + 4
RMB = keydata + 128
TAB = keydata + 1
SPRINT = keydata +8
ALT = keydata + 1024
JUMP = keydata + 32
итак. к чему я это говорю
для нажатия альта я использовал функцию фипа которая копирует синхру в таблицу

Lua:
if str:find('ALT') and dist < 5.0 then
    local data = samp_create_sync_data('player')
    data.keysData = data.keysData + 1024
    data.send()
end
в чём профит спросите вы? не будут нажиматься кнопки клавиатуры. вот и всё в принципе.
 

Adam_Rockwell

Активный
143
25
Пздц, а можно по подробнее пожалуйста, как нажать на Y например?
Код ниже не работает, выдаёт ошибку attempt to call global 'samp_create_sync_data' (a nil value) на 1 строчку.
code:
      local data = samp_create_sync_data('player')
      data.keysData = data.keysData + 64
      data.send()
 

MrBidloKoder

Известный
425
248
Пздц, а можно по подробнее пожалуйста, как нажать на Y например?
Код ниже не работает, выдаёт ошибку attempt to call global 'samp_create_sync_data' (a nil value) на 1 строчку.
code:
      local data = samp_create_sync_data('player')
      data.keysData = data.keysData + 64
      data.send()

Lua:
function samp_create_sync_data(sync_type, copy_from_player)
    local ffi = require 'ffi'
    local sampfuncs = require 'sampfuncs'
    -- from SAMP.Lua
    local raknet = require 'samp.raknet'
    require 'samp.synchronization'

    copy_from_player = copy_from_player or true
    local sync_traits = {
        player = {'PlayerSyncData', raknet.PACKET.PLAYER_SYNC, sampStorePlayerOnfootData},
        vehicle = {'VehicleSyncData', raknet.PACKET.VEHICLE_SYNC, sampStorePlayerIncarData},
        passenger = {'PassengerSyncData', raknet.PACKET.PASSENGER_SYNC, sampStorePlayerPassengerData},
        aim = {'AimSyncData', raknet.PACKET.AIM_SYNC, sampStorePlayerAimData},
        trailer = {'TrailerSyncData', raknet.PACKET.TRAILER_SYNC, sampStorePlayerTrailerData},
        unoccupied = {'UnoccupiedSyncData', raknet.PACKET.UNOCCUPIED_SYNC, nil},
        bullet = {'BulletSyncData', raknet.PACKET.BULLET_SYNC, nil},
        spectator = {'SpectatorSyncData', raknet.PACKET.SPECTATOR_SYNC, nil}
    }
    local sync_info = sync_traits[sync_type]
    local data_type = 'struct ' .. sync_info[1]
    local data = ffi.new(data_type, {})
    local raw_data_ptr = tonumber(ffi.cast('uintptr_t', ffi.new(data_type .. '*', data)))
    -- copy player's sync data to the allocated memory
    if copy_from_player then
        local copy_func = sync_info[3]
        if copy_func then
            local _, player_id
            if copy_from_player == true then
                _, player_id = sampGetPlayerIdByCharHandle(PLAYER_PED)
            else
                player_id = tonumber(copy_from_player)
            end
            copy_func(player_id, raw_data_ptr)
        end
    end
    -- function to send packet
    local func_send = function()
        local bs = raknetNewBitStream()
        raknetBitStreamWriteInt8(bs, sync_info[2])
        raknetBitStreamWriteBuffer(bs, raw_data_ptr, ffi.sizeof(data))
        raknetSendBitStreamEx(bs, sampfuncs.HIGH_PRIORITY, sampfuncs.UNRELIABLE_SEQUENCED, 1)
        raknetDeleteBitStream(bs)
    end
    -- metatable to access sync data and 'send' function
    local mt = {
        __index = function(t, index)
            return data[index]
        end,
        __newindex = function(t, index, value)
            data[index] = value
        end
    }
    return setmetatable({send = func_send}, mt)
end
 
  • Нравится
Реакции: Fake Frisen и Gorskin

Vintik

Мечтатель
Проверенный
1,411
851
Сижу, ахуел.

Ну если чё, нажать Y можно просто одной строкой кода, уже разобрался)
Lua:
setGameKeyState(11, 64)
Это разные вещи вообще-то.
Способ, который был выше, отправляет информацию серверу.
Твой способ лишь говорит ГТА, что нажата клавиша, и уже сама ГТА отправляет эту информацию серверу (тот способ лучше, короч)
 
  • Нравится
Реакции: mvviper

kFor

Известный
99
23
сервер считывает нажатия не всех кнопок. вот тебе список который я составил методом тыка

итак. к чему я это говорю
для нажатия альта я использовал функцию фипа которая копирует синхру в таблицу

Lua:
if str:find('ALT') and dist < 5.0 then
    local data = samp_create_sync_data('player')
    data.keysData = data.keysData + 1024
    data.send()
end
в чём профит спросите вы? не будут нажиматься кнопки клавиатуры. вот и всё в принципе.
А как отправить зажатие клавишы?
 

TimeLordRu

Известный
151
38

Vintik

Мечтатель
Проверенный
1,411
851
  • Нравится
Реакции: kFor

Vintik

Мечтатель
Проверенный
1,411
851
На примере клавиши Alt. Названия всех клавиш, информация о нажатии которых передаётся на сервер, можно найти тут:
struct SampKeys {
uint8_t primaryFire : 1;
uint8_t horn_crouch : 1;
uint8_t secondaryFire_shoot : 1;
uint8_t accel_zoomOut : 1;
uint8_t enterExitCar : 1;
uint8_t decel_jump : 1;
uint8_t circleRight : 1;
uint8_t aim : 1;
uint8_t circleLeft : 1;
uint8_t landingGear_lookback : 1;
uint8_t unknown_walkSlow : 1;
uint8_t specialCtrlUp : 1;
uint8_t specialCtrlDown : 1;
uint8_t specialCtrlLeft : 1;
uint8_t specialCtrlRight : 1;
uint8_t _unknown : 1;
};
Понять какая клавиша нужна можно из названия, они специально сделаны так удобно.
Lua:
events = require 'samp.events'
alt_pressed = false -- переменная (зажат ли Alt?)

function main()
    sampRegisterChatCommand('alt', function() -- команда /alt будет изменять состояние (зажат / не зажат) Alt
        alt_pressed = not alt_pressed -- изменяем состояние переменной
        sampAddChatMessage(alt and 'Теперь сервер будет думать, что Вы зажали Alt и держите.' or 'Теперь сервер НЕ будет думать, что Вы зажали Alt.', -1)
    end)
end

function events.onSendPlayerSync(data) -- исходящий пакет синхронизации с сервером (когда ты пешком)
    if alt_pressed then
        data.keys.unknown_walkSlow = 1 -- изменяем информацию, что Alt зажат
    end
end
 
  • Нравится
Реакции: kFor
Статус
В этой теме нельзя размещать новые ответы.