|
Новичок
Регистрация: 10.11.2020
Сообщений: 28
С нами:
2899308
Репутация:
53
|
|
В sampev в событиях onPlayerSync(playerId, data) и onVehicleSync(playerId, vehicleId, data) неверно считывается вектор скорости. Возможно проблема в этой части кода:
Код из bitstream_io для RakSAMP Lite:
Код:
mod
.
compressedVector
=
{
read
=
function
(
bs
)
local
magnitude
=
bs
:
readFloat
(
)
if
magnitude
~=
0
then
local
readCf
=
mod
.
compressedFloat
.
read
return
vector3d
(
readCf
(
bs
)
*
magnitude
,
readCf
(
bs
)
*
magnitude
,
readCf
(
bs
)
*
magnitude
)
else
return
vector3d
(
0
,
0
,
0
)
end
end
,
write
=
function
(
bs
,
data
)
local
x
,
y
,
z
=
data
.
x
,
data
.
y
,
data
.
z
local
magnitude
=
math
.
sqrt
(
x
*
x
+
y
*
y
+
z
*
z
)
bs
:
writeFloat
(
magnitude
)
if
magnitude
>
0
then
local
writeCf
=
mod
.
compressedFloat
.
write
writeCf
(
bs
,
x
/
magnitude
)
writeCf
(
bs
,
y
/
magnitude
)
writeCf
(
bs
,
z
/
magnitude
)
end
end
}
mod
.
compressedFloat
=
{
read
=
function
(
bs
)
return
bs
:
readInt16
(
)
/
32767.5
-
1
end
,
write
=
function
(
bs
,
value
)
if
value
1
then
value
=
1
end
bs
:
writeInt16
(
(
value
+
1
)
*
32767.5
)
end
}
Код из bitstream_io, используемой в игре:
Код:
mod
.
compressedVector
=
{
read
=
function
(
bs
)
local
magnitude
=
raknetBitStreamReadFloat
(
bs
)
if
magnitude
~=
0
then
local
readCf
=
mod
.
compressedFloat
.
read
return
vector3d
(
readCf
(
bs
)
*
magnitude
,
readCf
(
bs
)
*
magnitude
,
readCf
(
bs
)
*
magnitude
)
else
return
vector3d
(
0
,
0
,
0
)
end
end
,
write
=
function
(
bs
,
data
)
local
x
,
y
,
z
=
data
.
x
,
data
.
y
,
data
.
z
local
magnitude
=
math
.
sqrt
(
x
*
x
+
y
*
y
+
z
*
z
)
raknetBitStreamWriteFloat
(
bs
,
magnitude
)
if
magnitude
>
0
then
local
writeCf
=
mod
.
compressedFloat
.
write
writeCf
(
bs
,
x
/
magnitude
)
writeCf
(
bs
,
y
/
magnitude
)
writeCf
(
bs
,
z
/
magnitude
)
end
end
}
mod
.
compressedFloat
=
{
read
=
function
(
bs
)
return
raknetBitStreamReadInt16
(
bs
)
/
32767.5
-
1
end
,
write
=
function
(
bs
,
value
)
if
value
1
then
value
=
1
end
raknetBitStreamWriteInt16
(
bs
,
(
value
+
1
)
*
32767.5
)
end
}
Например, такой код даёт разный результат в игре и в RakSAMP:
Пример кода:
Код:
--Вариант в игре
function
sampev
.
onPlayerSync
(
playerId
,
data
)
lua_thread
.
create
(
function
(
)
if
settings
.
maincfg
.
sendTargets
then
local
vecX
=
data
.
position
.
x
+
(
data
.
moveSpeed
.
x
*
100
)
-- Увеличенный вектор, для наглядности
local
vecY
=
data
.
position
.
y
+
(
data
.
moveSpeed
.
y
*
100
)
-- Увеличенный вектор, для наглядности
local
vecZ
=
data
.
position
.
z
+
(
data
.
moveSpeed
.
z
*
100
)
-- Увеличенный вектор, для наглядности
local
wX1
,
wY1
=
convert3DCoordsToScreen
(
data
.
position
.
x
,
data
.
position
.
y
,
data
.
position
.
z
)
local
wX2
,
wY2
=
convert3DCoordsToScreen
(
vecX
,
vecY
,
vecZ
)
renderDrawLine
(
wX1
,
wY1
,
wX2
,
wY2
,
1
,
0xFFFFFFFF
)
--Для игры. Вектор скорости отрисуется корректно.
print
(
"PlayerSyncData:"
,
data
.
position
.
x
,
data
.
position
.
y
,
data
.
position
.
z
,
data
.
moveSpeed
.
x
*
100
,
data
.
moveSpeed
.
y
*
100
,
data
.
moveSpeed
.
z
*
100
)
--printf здесь выдаст разный по направлению результат вектора скорости
end
end
)
end
--Вариант для бота
function
sampev
.
onPlayerSync
(
playerId
,
data
)
newTask
(
function
(
)
if
settings
.
maincfg
.
sendTargets
then
local
sendData
=
{
data
.
position
.
x
,
data
.
position
.
y
,
data
.
position
.
z
,
data
.
position
.
x
+
(
data
.
moveSpeed
.
x
*
100
)
,
data
.
position
.
y
+
(
data
.
moveSpeed
.
y
*
100
)
,
data
.
position
.
z
+
(
data
.
moveSpeed
.
z
*
100
)
}
renderOnClient
(
data
)
--Функция отрабатывает корректно, искажений при передаче нет. Вектор скорости отрисуется некорректно, из-за неверных данных от бота
print
(
"PlayerSyncData:"
,
data
.
position
.
x
,
data
.
position
.
y
,
data
.
position
.
z
,
data
.
moveSpeed
.
x
*
100
,
data
.
moveSpeed
.
y
*
100
,
data
.
moveSpeed
.
z
*
100
)
--printf здесь выдаст разный по направлению результат вектора скорости
end
end
)
end
|