SA:MP Эмуляция клавиш

Klimer

Активный
Автор темы
310
82
В общем то, раньше писал бота который эмулировал нажатие клавиш, но был 1 минус - была эмуляция клавиш Windows. Из-за которой открывая чат бот условно спамил wwwwwww и так далее. Есть ли эмуляция клавиш что бы в плагине для адм указывалась эмуляция клавиш без юзания клавиш винды?​
 

miset

Активный
225
61
В общем то, раньше писал бота который эмулировал нажатие клавиш, но был 1 минус - была эмуляция клавиш Windows. Из-за которой открывая чат бот условно спамил wwwwwww и так далее. Есть ли эмуляция клавиш что бы в плагине для адм указывалась эмуляция клавиш без юзания клавиш винды?
setGameKeyState + отправка синхры ходьбы upDownKeys - w | s leftRightKeys - a | d
Состояния сам в игре посмотри

1767271915890.png
 
Последнее редактирование:

Klimer

Активный
Автор темы
310
82
piskadrocha:
local data = samp_create_sync_data('player', true) -- но это если понял да шкибидиди доп доп у тебя ноп на sendplayersync, если нет можешь там подменять как хочешь
data.keys.decel_jump = true
data.send()

--[[ samp.lua samp synchronization.lua https://github.com/THE-FYP/SAMP.Lua/blob/master/samp/synchronization.lua

typedef 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;
} SampKeys;

]]

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
 

Klimer

Активный
Автор темы
310
82
piskadrocha:
local data = samp_create_sync_data('player', true) -- но это если понял да шкибидиди доп доп у тебя ноп на sendplayersync, если нет можешь там подменять как хочешь
data.keys.decel_jump = true
data.send()

--[[ samp.lua samp synchronization.lua https://github.com/THE-FYP/SAMP.Lua/blob/master/samp/synchronization.lua

typedef 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;
} SampKeys;

]]

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
ага и как его юзать?
 

Langer

Активный
210
55
я пробовал не получается
lua:
function sampev.onSendPlayerSync(data)

    print(data.keys.accel_zoomOut)

    print(data.keys.unknown_walkSlow)

    data.keys.accel_zoomOut = 1 -- run

    data.keys.unknown_walkSlow = 1 -- walk

end
если я правильно понял, что тебе именно надо, то это должно работать
 

Klimer

Активный
Автор темы
310
82
lua:
function sampev.onSendPlayerSync(data)

    print(data.keys.accel_zoomOut)

    print(data.keys.unknown_walkSlow)

    data.keys.accel_zoomOut = 1 -- run

    data.keys.unknown_walkSlow = 1 -- walk

end
если я правильно понял, что тебе именно надо, то это должно работать
после вставки в скрипт он не грузится (CTRL + R) пробовал