Тема: RakSAMP Lite
Показать сообщение отдельно

  #683  
Старый 09.02.2023, 19:33
Rei
Познавший АНТИЧАТ
Регистрация: 18.06.2017
Сообщений: 1,632
С нами: 4686777

Репутация: 183


По умолчанию

Цитата:
Сообщение от Heroku  

Функция позволяет получать исходящие данные синхронизации из любого участка кода.
Принимает в себя ID пакета. При желании можно с легкостью переделать под входящую синхронизацию (если не забуду, то может сделаю) и сделать аналог функциям из муна sampStorePlayerOnfootData, sampStorePlayerIncarData и т.д

Lua:





Код:
local
ffi
=
require
(
"ffi"
)
require
'samp.synchronization'
require
'sampfuncs'
local
storePackets
=
{
[
PACKET_PLAYER_SYNC
]
=
{
}
,
[
PACKET_VEHICLE_SYNC
]
=
{
}
,
[
PACKET_AIM_SYNC
]
=
{
}
}
local
syncTypes
=
{
[
PACKET_PLAYER_SYNC
]
=
"PlayerSyncData"
,
[
PACKET_VEHICLE_SYNC
]
=
"VehicleSyncData"
,
[
PACKET_AIM_SYNC
]
=
"AimSyncData"
}
registerHandler
(
"onSendPacket"
,
function
(
id
,
bs
)
if
storePackets
[
id
]
~=
nil
and
syncTypes
[
id
]
~=
nil
then
bs
:
ignoreBits
(
8
)
-- skip packetid
local
new_sync_data
=
ffi
.
new
(
syncTypes
[
id
]
)
local
syncPointer
=
tonumber
(
ffi
.
cast
(
'intptr_t'
,
ffi
.
cast
(
'void*'
,
new_sync_data
)
)
)
local
result
=
bs
:
readBuffer
(
syncPointer
,
ffi
.
sizeof
(
new_sync_data
)
)
if
result
then
storePackets
[
id
]
=
new_sync_data
end
end
end
)
function
storeSyncData
(
packet_id
)
return
storePackets
[
packet_id
]
end
-- example
function
onRunCommand
(
command
)
if
command
==
"!test"
then
local
aim_sync_data
=
storeSyncData
(
PACKET_AIM_SYNC
)
print
(
aim_sync_data
.
camMode
)
-- return cam mode
local
player_sync_data
=
storeSyncData
(
PACKET_PLAYER_SYNC
)
print
(
player_sync_data
.
specialAction
)
-- return special action
end
end

Lua:





Код:
function
samp_create_sync_data
(
sync_type
)
-- from SAMP.Lua
local
raknet
=
require
'samp.raknet'
require
'samp.synchronization'
local
sync_traits
=
{
player
=
{
'PlayerSyncData'
,
raknet
.
PACKET
.
PLAYER_SYNC
}
,
vehicle
=
{
'VehicleSyncData'
,
raknet
.
PACKET
.
VEHICLE_SYNC
}
,
passenger
=
{
'PassengerSyncData'
,
raknet
.
PACKET
.
PASSENGER_SYNC
}
,
aim
=
{
'AimSyncData'
,
raknet
.
PACKET
.
AIM_SYNC
}
,
trailer
=
{
'TrailerSyncData'
,
raknet
.
PACKET
.
TRAILER_SYNC
}
,
unoccupied
=
{
'UnoccupiedSyncData'
,
raknet
.
PACKET
.
UNOCCUPIED_SYNC
}
,
bullet
=
{
'BulletSyncData'
,
raknet
.
PACKET
.
BULLET_SYNC
}
,
spectator
=
{
'SpectatorSyncData'
,
raknet
.
PACKET
.
SPECTATOR_SYNC
}
}
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
)
)
)
-- function to send packet
local
func_send
=
function
(
)
local
bs
=
bitStream
.
new
(
)
bs
:
writeUInt8
(
sync_info
[
2
]
)
bs
:
writeBuffer
(
raw_data_ptr
,
ffi
.
sizeof
(
data
)
)
bs
:
sendPacketEx
(
HIGH_PRIORITY
,
UNRELIABLE_SEQUENCED
,
1
)
bs
:
reset
(
)
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


но нужно вручную заполнять поля

Lua:





Код:
local
data
=
samp_create_sync_data
(
"player"
)
data
.
position
.
x
,
data
.
position
.
y
,
data
.
position
.
z
=
getBotPosition
(
)
data
.
quaternion
[
0
]
,
data
.
quaternion
[
1
]
,
data
.
quaternion
[
2
]
,
data
.
quaternion
[
3
]
=
getBotQuaternion
(
)
data
.
health
=
getBotHealth
(
)
data
.
armor
=
getBotArmor
(
)
-- анимку и флаги бы еще
data
.
send
(
)
 
Ответить с цитированием