- 136
- 55
итак. к чему я это говорю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
if str:find('ALT') and dist < 5.0 then
local data = samp_create_sync_data('player')
data.keysData = data.keysData + 1024
data.send()
end
setVirtualKeyDown(int vkey, bool down)
. номера клавиш можно узнать тут.setVirtualKeyDown(87, true) -- зажатие 87 клавиши (W)
wait(1000) -- задержка на секунду
setVirtualKeyDown(87, false) -- отпускание 87 клавиши (W)
setGameKeyState(int key, int state)
статья на дев_вики и дополнительная информация об аргументах функцииТут же wait ну подойдёт? Нужно через потоки делать?это не отправка пакета серверу, а полноценная эмуляция нажатия клавиш -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 ну подойдёт? Нужно через потоки делать?
итак. к чему я это говорю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
if str:find('ALT') and dist < 5.0 then
local data = samp_create_sync_data('player')
data.keysData = data.keysData + 1024
data.send()
end
local data = samp_create_sync_data('player')
data.keysData = data.keysData + 64
data.send()
Пздц, а можно по подробнее пожалуйста, как нажать на 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()
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
setGameKeyState(11, 64)
Это разные вещи вообще-то.Сижу, ахуел.
Ну если чё, нажать Y можно просто одной строкой кода, уже разобрался)
Lua:setGameKeyState(11, 64)
А как отправить зажатие клавишы?сервер считывает нажатия не всех кнопок. вот тебе список который я составил методом тыка
итак. к чему я это говорю
для нажатия альта я использовал функцию фипа которая копирует синхру в таблицу
в чём профит спросите вы? не будут нажиматься кнопки клавиатуры. вот и всё в принципе.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
Каждый раз перехватывать отправку PlayerData и постоояно изменять, что клавиша нажата.А как отправить зажатие клавишы?
setVirtualKeyDown(id, true) -- нажатие клавишиА как отправить зажатие клавишы?
Так через синхру ж.setVirtualKeyDown(id, true) -- нажатие клавиши
wait(100) -- время, сколько она будет зажата
setVirtualKeyDown(id, false) -- отжатие клавиши
idы клавиш чекай тут http://netcode.ru/cpp/?artID=234
можешь, пожалуйста, код скинуть? я чет не понял, как это сделатьКаждый раз перехватывать отправку PlayerData и постоояно изменять, что клавиша нажата.
Понять какая клавиша нужна можно из названия, они специально сделаны так удобно.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;
};
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