HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 23.01.2025, 02:36
Smeruxa
Познавший АНТИЧАТ
Регистрация: 27.11.2020
Сообщений: 1,431
С нами: 2874035

Репутация: 183


По умолчанию

Функция с чтением пакета: https://gitlab.com/blasthack/raksamp...tgame.cpp#L127

Что я делаю не так? Почему не могу никак записать нормально синхру на плюсах?

8 бит я игнорирую в самом начале, перед getData

C++:





Код:
nlohmann
::
json
getData
(
RakNet
::
BitStream
*
bs
)
{
nlohmann
::
json data
;
uint16_t
playerId
;
bool
bHasLR
,
bHasUD
,
bHasSurfInfo
,
bAnimation
;
bs
->
Read
(
playerId
)
;
if
(
playerId

1004
)
return
data
;
sampapi
::
v037r1
::
Synchronization
::
OnfootData onfoot
;
memset
(
&
onfoot
,
0
,
sizeof
(
sampapi
::
v037r1
::
Synchronization
::
OnfootData
)
)
;
bs
->
Read
(
bHasLR
)
;
if
(
bHasLR
)
bs
->
Read
(
onfoot
.
m_controllerState
.
m_sLeftStickX
)
;
bs
->
Read
(
bHasUD
)
;
if
(
bHasUD
)
bs
->
Read
(
onfoot
.
m_controllerState
.
m_sLeftStickY
)
;
bs
->
Read
(
onfoot
.
m_controllerState
.
m_value
)
;
bs
->
Read
(
onfoot
.
m_position
.
x
)
;
bs
->
Read
(
onfoot
.
m_position
.
y
)
;
bs
->
Read
(
onfoot
.
m_position
.
z
)
;
bs
->
ReadNormQuat
(
onfoot
.
m_fQuaternion
[
0
]
,
onfoot
.
m_fQuaternion
[
1
]
,
onfoot
.
m_fQuaternion
[
2
]
,
onfoot
.
m_fQuaternion
[
3
]
)
;
BYTE byteHealthArmour
;
bs
->
Read
(
byteHealthArmour
)
;
BYTE byteArmTemp
=
(
byteHealthArmour
&
0x0F
)
;
BYTE byteHlTemp
=
(
byteHealthArmour
>>
4
)
;
BYTE byteHealth
=
(
byteHlTemp
==
0xF
)
?
100
:
(
byteHlTemp
==
0
?
0
:
byteHlTemp
*
7
)
;
BYTE byteArmour
=
(
byteArmTemp
==
0xF
)
?
100
:
(
byteArmTemp
==
0
?
0
:
byteArmTemp
*
7
)
;
onfoot
.
m_nHealth
=
byteHealth
;
onfoot
.
m_nArmor
=
byteArmour
;
bs
->
Read
(
onfoot
.
m_nCurrentWeapon
)
;
bs
->
Read
(
onfoot
.
m_nSpecialAction
)
;
bs
->
ReadVector
(
onfoot
.
m_speed
.
x
,
onfoot
.
m_speed
.
y
,
onfoot
.
m_speed
.
z
)
;
bs
->
Read
(
bHasSurfInfo
)
;
if
(
bHasSurfInfo
)
{
bs
->
Read
(
onfoot
.
m_nSurfingVehicleId
)
;
bs
->
Read
(
onfoot
.
m_surfingOffset
.
x
)
;
bs
->
Read
(
onfoot
.
m_surfingOffset
.
y
)
;
bs
->
Read
(
onfoot
.
m_surfingOffset
.
z
)
;
}
else
{
onfoot
.
m_nSurfingVehicleId
=
-
1
;
}
uint16_t
animId
;
bs
->
Read
(
bAnimation
)
;
if
(
bAnimation
)
{
bs
->
Read
(
animId
)
;
}
data
[
"playerId"
]
=
playerId
;
data
[
"lrAnalog"
]
=
(
bHasLR
)
?
onfoot
.
m_controllerState
.
m_sLeftStickX
:
0
;
data
[
"udAnalog"
]
=
(
bHasUD
)
?
onfoot
.
m_controllerState
.
m_sLeftStickY
:
0
;
data
[
"wKeys"
]
=
onfoot
.
m_controllerState
.
m_value
;
data
[
"position"
]
=
{
onfoot
.
m_position
.
x
,
onfoot
.
m_position
.
y
,
onfoot
.
m_position
.
z
}
;
data
[
"quaternion"
]
=
{
onfoot
.
m_fQuaternion
[
0
]
,
onfoot
.
m_fQuaternion
[
1
]
,
onfoot
.
m_fQuaternion
[
2
]
,
onfoot
.
m_fQuaternion
[
3
]
}
;
data
[
"health"
]
=
onfoot
.
m_nHealth
;
data
[
"armour"
]
=
onfoot
.
m_nArmor
;
data
[
"weapon"
]
=
onfoot
.
m_nCurrentWeapon
;
data
[
"specialAction"
]
=
onfoot
.
m_nSpecialAction
;
data
[
"moveSpeed"
]
=
{
onfoot
.
m_speed
.
x
,
onfoot
.
m_speed
.
y
,
onfoot
.
m_speed
.
z
}
;
data
[
"surfingOffsets"
]
=
(
bHasSurfInfo
)
?
nlohmann
::
json
::
array
(
{
onfoot
.
m_surfingOffset
.
x
,
onfoot
.
m_surfingOffset
.
y
,
onfoot
.
m_surfingOffset
.
z
}
)
:
nlohmann
::
json
::
array
(
{
0
,
0
,
0
}
)
;
data
[
"surfingVehicleId"
]
=
(
bHasSurfInfo
)
?
onfoot
.
m_nSurfingVehicleId
:
-
1
;
data
[
"animationId"
]
=
(
bAnimation
)
?
animId
:
0
;
return
data
;
}
 
Ответить с цитированием

  #2  
Старый 23.01.2025, 05:09
waparabka
Участник форума
Регистрация: 08.10.2019
Сообщений: 139
С нами: 3474377

Репутация: 98
По умолчанию

onfoot packet read:





Код:
sampapi
::
v037r1
::
Synchronization
::
OnfootData data
bs
->
Read
(
(
char
*
)
&
data
,
sizeof
(
sampapi
::
v037r1
::
Synchronization
::
OnfootData
)
)
;
 
Ответить с цитированием

  #3  
Старый 23.01.2025, 06:08
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

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

onfoot packet read:





Код:
sampapi
::
v037r1
::
Synchronization
::
OnfootData data
bs
->
Read
(
(
char
*
)
&
data
,
sizeof
(
sampapi
::
v037r1
::
Synchronization
::
OnfootData
)
)
;

Самп сжимает входящик пакеты и каждый раз его размен может отличаться
 
Ответить с цитированием

  #4  
Старый 23.01.2025, 14:37
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

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

sampapi::v037r1::Synchronization::OnfootData onfoot; memset(&onfoot, 0, sizeof(sampapi::v037r1::Synchronization::OnfootDat a));
Кстати, можно заменить на sampapi::v037r1::Synchronization::OnfootData onfoot {};
 
Ответить с цитированием

  #5  
Старый 23.01.2025, 18:50
AdCKuY_DpO4uLa
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами: 4091290

Репутация: 213
По умолчанию

слив сурсов триложи сампа. не рекомендую использовать json для хранения синхронизации, ибо это очень затратно по ресурсам, входящая синхра приходит обычно каждые ~15мс, но если это прям жизненно необходимо, то тогда лучше использовать уже заранее созданный объект nlohmann::json и уже в нем перезаписывать все данные.

C++:





Код:
std
::
uint16_t
playerId
;
bool
bHasLR
,
bHasUD
,
bHasSurfInfo
,
bAnimation
;
stOnFootData OnFootData
{
}
;
//The packet received from server is different
bsPlayerSync
.
IgnoreBits
(
8
)
;
//ignore the packet id
bsPlayerSync
.
Read
(
playerId
)
;
if
(
playerId
>=
SAMP_MAX_PLAYERS
)
return
;
auto
&
it
=
pNetGame
->
pools
.
mPlayerPool
.
find
(
playerId
)
;
if
(
it
==
pNetGame
->
pools
.
mPlayerPool
.
end
(
)
)
return
;
// LEFT/RIGHT KEYS
bsPlayerSync
.
Read
(
bHasLR
)
;
if
(
bHasLR
)
bsPlayerSync
.
Read
(
OnFootData
.
m_ControllerState
.
m_sLeftStickX
)
;
// UP/DOWN KEYS
bsPlayerSync
.
Read
(
bHasUD
)
;
if
(
bHasUD
)
bsPlayerSync
.
Read
(
OnFootData
.
m_ControllerState
.
m_sLeftStickY
)
;
// GENERAL KEYS
bsPlayerSync
.
Read
(
OnFootData
.
m_ControllerState
.
m_value
)
;
// VECTOR POS
bsPlayerSync
.
Read
(
OnFootData
.
m_Position
.
m_fPos
[
0
]
)
;
bsPlayerSync
.
Read
(
OnFootData
.
m_Position
.
m_fPos
[
1
]
)
;
bsPlayerSync
.
Read
(
OnFootData
.
m_Position
.
m_fPos
[
2
]
)
;
// ROTATION
bsPlayerSync
.
ReadNormQuat
(
OnFootData
.
m_Quaternion
.
m_fQuaternion
[
0
]
,
OnFootData
.
m_Quaternion
.
m_fQuaternion
[
1
]
,
OnFootData
.
m_Quaternion
.
m_fQuaternion
[
2
]
,
OnFootData
.
m_Quaternion
.
m_fQuaternion
[
3
]
)
;
// HEALTH/Armor (COMPRESSED INTO 1 BYTE)
std
::
uint8_t
byteHealthArmor
{
}
,
byteHealth
{
}
,
byteArmor
{
}
,
byteArmTemp
{
}
,
byteHlTemp
{
}
;
bsPlayerSync
.
Read
(
byteHealthArmor
)
;
byteArmTemp
=
(
byteHealthArmor
&
0x0F
)
;
byteHlTemp
=
(
byteHealthArmor
>>
4
)
;
if
(
byteArmTemp
==
0xF
)
byteArmor
=
100
;
else
if
(
byteArmTemp
==
0
)
byteArmor
=
0
;
else
byteArmor
=
byteArmTemp
*
7
;
if
(
byteHlTemp
==
0xF
)
byteHealth
=
100
;
else
if
(
byteHlTemp
==
0
)
byteHealth
=
0
;
else
byteHealth
=
byteHlTemp
*
7
;
OnFootData
.
m_Health
=
byteHealth
;
OnFootData
.
m_Armor
=
byteArmor
;
// CURRENT WEAPON
bsPlayerSync
.
Read
(
OnFootData
.
m_CurrentWeapon
)
;
// Special Action
bsPlayerSync
.
Read
(
OnFootData
.
m_SpecialAction
)
;
// READ MOVESPEED VECTORS
bsPlayerSync
.
ReadVector
(
OnFootData
.
m_Speed
.
m_fPos
[
0
]
,
OnFootData
.
m_Speed
.
m_fPos
[
1
]
,
OnFootData
.
m_Speed
.
m_fPos
[
2
]
)
;
bsPlayerSync
.
Read
(
bHasSurfInfo
)
;
if
(
bHasSurfInfo
)
{
bsPlayerSync
.
Read
(
OnFootData
.
m_SurfingOffset
.
m_fPos
[
0
]
)
;
bsPlayerSync
.
Read
(
OnFootData
.
m_SurfingOffset
.
m_fPos
[
1
]
)
;
bsPlayerSync
.
Read
(
OnFootData
.
m_SurfingOffset
.
m_fPos
[
2
]
)
;
bsPlayerSync
.
Read
(
OnFootData
.
m_SurfingVehicleId
)
;
}
else
OnFootData
.
m_SurfingVehicleId
=
-
1
;
bsPlayerSync
.
Read
(
bAnimation
)
;
if
(
bAnimation
)
bsPlayerSync
.
Read
(
OnFootData
.
m_Animation
.
m_value
)
;
 
Ответить с цитированием

  #6  
Старый 26.01.2025, 16:39
Smeruxa
Познавший АНТИЧАТ
Регистрация: 27.11.2020
Сообщений: 1,431
С нами: 2874035

Репутация: 183


По умолчанию

Я считал, что у меня проблема заключается в чтении, но на самом деле в воспроизведении

При воспроизведении записанного маршрута игра просто крашится, что бы я туда не записывал (я уже по разному пробовал на самом деле, и структуру onfoot записывать - sampapi::v037r1::Synchronization::OnfootData, но что-то безуспешно)

Что передаю ИД первым, что не передаю, дело особо не меняется, делая по структуре из events библиотеки тоже криво-косо идет

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

Прошу подсказать в чем действительно может быть дело, потому что я в тупике, кто поможет с воспроизведением и все будет работать, тому заплачу 300 рублей

C++:





Код:
auto
recordedData
=
gConfig
->
data
[
"ways"
]
[
playWayName
]
[
index
]
;
RakNet
::
BitStream bs
;
float
vec
[
3
]
=
{
recordedData
[
"position"
]
[
0
]
.
get

(
)
,
recordedData
[
"position"
]
[
1
]
.
get

(
)
,
recordedData
[
"position"
]
[
2
]
.
get

(
)
}
;
float
quat
[
4
]
=
{
0
}
;
bs
.
Write

(
ID_PLAYER_SYNC
)
;
bs
.
Write

(
sampapi
::
v037r1
::
RefNetGame
(
)
->
GetPlayerPool
(
)
->
m_localInfo
.
m_nId
)
;
// playerId
bs
.
Write0
(
)
;
// w/o leftRightKeys
bs
.
Write0
(
)
;
// w/o upDownKeys
bs
.
Write

(
0
)
;
// keysData
bs
.
Write
(
vec
)
;
// position
bs
.
Write
(
quat
)
;
// quaternion
bs
.
Write

(
255
)
;
// health & armor
bs
.
Write

(
0
)
;
// weapon
bs
.
Write

(
0
)
;
// specialAction
bs
.
Write

(
0
)
;
// moveSpeed
bs
.
Write0
(
)
;
// w/o surfingVehicleId & surfingOffsets
bs
.
Write0
(
)
;
// w/o animationId & animationFlags
rakhook
::
send
(
&
bs
,
PacketPriority
::
HIGH_PRIORITY
,
PacketReliability
::
RELIABLE_ORDERED
,
(
char
)
0
)
;
 
Ответить с цитированием

  #7  
Старый 26.01.2025, 20:50
AdCKuY_DpO4uLa
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами: 4091290

Репутация: 213
По умолчанию

C++:





Код:
stOnFootData data
{
}
;
// fill struct
data
.
m_Armor
=
(
std
::
uint8_t
)
pPed
->
m_fArmour
;
data
.
m_Health
=
(
std
::
uint8_t
)
pPed
->
m_fHealth
;
// etc...
BitStream bs
;
bs
.
Write

(
ID_PLAYER_SYNC
)
;
bs
.
Write
(
(
PCHAR
)
&
data
,
sizeof
(
stOnFootData
)
)
;
pNetGame
->
SendPacket
(
&
bs
)
;
 
Ответить с цитированием

  #8  
Старый 26.01.2025, 22:50
Smeruxa
Познавший АНТИЧАТ
Регистрация: 27.11.2020
Сообщений: 1,431
С нами: 2874035

Репутация: 183


По умолчанию

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

C++:





Код:
stOnFootData data
{
}
;
// fill struct
data
.
m_Armor
=
(
std
::
uint8_t
)
pPed
->
m_fArmour
;
data
.
m_Health
=
(
std
::
uint8_t
)
pPed
->
m_fHealth
;
// etc...
BitStream bs
;
bs
.
Write

(
ID_PLAYER_SYNC
)
;
bs
.
Write
(
(
PCHAR
)
&
data
,
sizeof
(
stOnFootData
)
)
;
pNetGame
->
SendPacket
(
&
bs
)
;

Все тоже самое, краш, может это структура sampapi отличается от твоей? Что ты используешь? stOnFootData - это откуда?

C++:





Код:
if
(
gConfig
->
data
[
"ways"
]
.
contains
(
playWayName
)
)
{
std
::
thread
(
[
playWayName
]
(
)
{
play
=
true
;
sampapi
::
v037r1
::
RefChat
(
)
->
AddMessage
(
-
1
,
std
::
string
(
"Проигрываем маршрут: "
+
playWayName
)
.
c_str
(
)
)
;
auto
start
=
std
::
chrono
::
steady_clock
::
now
(
)
;
size_t index
=
0
;
while
(
index

data
[
"ways"
]
[
playWayName
]
.
size
(
)
)
{
auto
packetTime
=
gConfig
->
data
[
"ways"
]
[
playWayName
]
[
index
]
[
"time"
]
.
get

(
)
;
auto
currentTime
=
std
::
chrono
::
duration_cast

(
std
::
chrono
::
steady_clock
::
now
(
)
-
start
)
.
count
(
)
;
if
(
currentTime
>=
packetTime
)
{
auto
recordedData
=
gConfig
->
data
[
"ways"
]
[
playWayName
]
[
index
]
;
sampapi
::
v037r1
::
Synchronization
::
OnfootData data
{
}
;
data
.
m_position
=
{
recordedData
[
"position"
]
[
0
]
.
get

(
)
,
recordedData
[
"position"
]
[
1
]
.
get

(
)
,
recordedData
[
"position"
]
[
2
]
.
get

(
)
,
}
;
RakNet
::
BitStream bs
;
bs
.
Write

(
ID_PLAYER_SYNC
)
;
bs
.
Write
(
(
PCHAR
)
&
data
,
sizeof
(
sampapi
::
v037r1
::
Synchronization
::
OnfootData
)
)
;
rakhook
::
send
(
&
bs
,
PacketPriority
::
HIGH_PRIORITY
,
PacketReliability
::
RELIABLE_ORDERED
,
(
char
)
0
)
;
++
index
;
}
}
sampapi
::
v037r1
::
RefChat
(
)
->
AddMessage
(
-
1
,
"Маршрут завершен."
)
;
play
=
false
;
}
)
.
detach
(
)
;
}




UPD, выяснил, что это происходит именно при воспроизведении, обычная отправка ошибок не вызывает 🥲🥲🥲🥲

Пойду пытаться делать очередь

UPD. ЗАБЕГАЛО

UPD, В общем, все так-то у меня было нормально, что-то с воспроизведением было не так

Видимо ему не понравилось, что я это делал внутри rakhook'а и отдельным потоком

Создал при помощи ktcore очередь и по красоте расписал все, и ура, РАБОТАЕТ!

Спасибо всем, кто пытался помочь, проблема оказалась вообще в третьем, вместо первого и второго
 
Ответить с цитированием

  #9  
Старый 27.01.2025, 00:30
вайега52
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами: 2055431

Репутация: 3


По умолчанию

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

Видимо ему не понравилось, что я это делал внутри rakhook'а и отдельным потоком
скорее всего была гонка потоков и надо было использовать мютексы
 
Ответить с цитированием

  #10  
Старый 27.01.2025, 04:05
AdCKuY_DpO4uLa
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами: 4091290

Репутация: 213
По умолчанию

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

Все тоже самое, краш, может это структура sampapi отличается от твоей? Что ты используешь? stOnFootData - это откуда?

C++:





Код:
if
(
gConfig
->
data
[
"ways"
]
.
contains
(
playWayName
)
)
{
std
::
thread
(
[
playWayName
]
(
)
{
play
=
true
;
sampapi
::
v037r1
::
RefChat
(
)
->
AddMessage
(
-
1
,
std
::
string
(
"Проигрываем маршрут: "
+
playWayName
)
.
c_str
(
)
)
;
auto
start
=
std
::
chrono
::
steady_clock
::
now
(
)
;
size_t index
=
0
;
while
(
index

data
[
"ways"
]
[
playWayName
]
.
size
(
)
)
{
auto
packetTime
=
gConfig
->
data
[
"ways"
]
[
playWayName
]
[
index
]
[
"time"
]
.
get

(
)
;
auto
currentTime
=
std
::
chrono
::
duration_cast

(
std
::
chrono
::
steady_clock
::
now
(
)
-
start
)
.
count
(
)
;
if
(
currentTime
>=
packetTime
)
{
auto
recordedData
=
gConfig
->
data
[
"ways"
]
[
playWayName
]
[
index
]
;
sampapi
::
v037r1
::
Synchronization
::
OnfootData data
{
}
;
data
.
m_position
=
{
recordedData
[
"position"
]
[
0
]
.
get

(
)
,
recordedData
[
"position"
]
[
1
]
.
get

(
)
,
recordedData
[
"position"
]
[
2
]
.
get

(
)
,
}
;
RakNet
::
BitStream bs
;
bs
.
Write

(
ID_PLAYER_SYNC
)
;
bs
.
Write
(
(
PCHAR
)
&
data
,
sizeof
(
sampapi
::
v037r1
::
Synchronization
::
OnfootData
)
)
;
rakhook
::
send
(
&
bs
,
PacketPriority
::
HIGH_PRIORITY
,
PacketReliability
::
RELIABLE_ORDERED
,
(
char
)
0
)
;
++
index
;
}
}
sampapi
::
v037r1
::
RefChat
(
)
->
AddMessage
(
-
1
,
"Маршрут завершен."
)
;
play
=
false
;
}
)
.
detach
(
)
;
}



UPD, выяснил, что это происходит именно при воспроизведении, обычная отправка ошибок не вызывает 🥲🥲🥲🥲
Пойду пытаться делать очередь

UPD. ЗАБЕГАЛО

UPD, В общем, все так-то у меня было нормально, что-то с воспроизведением было не так
Видимо ему не понравилось, что я это делал внутри rakhook'а и отдельным потоком

Создал при помощи ktcore очередь и по красоте расписал все, и ура, РАБОТАЕТ!
Спасибо всем, кто пытался помочь, проблема оказалась вообще в третьем, вместо первого и второго
В следующий раз кидай полный код. Из-за того, что у тебя не было синхронизации потоков, хотя возможно ещё что-то повлияло на это, все пошло по пятой точке. У меня лично такое было, даже когда я просто пытался вывести сообщение в чат в отдельном потоке без синхронизации
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.