PDA

Просмотр полной версии : Как эмулировать входящий пакет?


Ya Zaregalsya
11.08.2022, 04:13
Почему этот код не работает? Пакеты не эмулируются, не коннектится к серверу.

C++:






bool
CALLBACK
incomingPacket
(
stRakNetHookParams
*
data
)
{
SF
->
getRakNet
(
)
->
emulateRecvPacket
(
data
->
packetId
,
data
->
bitStream
)
;
return
false
;
}




Аналогичная функция в Мунлоадере работает как часы и пользуется спросом, но если вбить эту же функу из СФ в поиск по форуму, то не найдётся ни одного её упоминания. Отсюда можно сделать вывод, что одна из самых важных функций во всей либе неработоспособна, либо работает неочевидным образом и никто так и не понял как её использовать. Вопрос к разработчику @FYP (https://www.blast.hk/members/2/)

😐

01EG
22.11.2023, 20:19
Почему этот код не работает? Пакеты не эмулируются, не коннектится к серверу.

C++:






bool
CALLBACK
incomingPacket
(
stRakNetHookParams
*
data
)
{
SF
->
getRakNet
(
)
->
emulateRecvPacket
(
data
->
packetId
,
data
->
bitStream
)
;
return
false
;
}




Аналогичная функция в Мунлоадере работает как часы и пользуется спросом, но если вбить эту же функу из СФ в поиск по форуму, то не найдётся ни одного её упоминания. Отсюда можно сделать вывод, что одна из самых важных функций во всей либе неработоспособна, либо работает неочевидным образом и никто так и не понял как её использовать. Вопрос к разработчику @FYP (https://www.blast.hk/members/2/)

😐


эммм

собственно соизволю ответить

1) так а с каким пакетом, то работаешь ? у тебя входящий пакет приходит попадает в блок кода в котором возвращает ничего(ложное) - отмену, типа ничо и не должно работать

2) у тебя всё пустые значения, что битстрим, что параметры к нему

3) if( params->packetId == PacketEnumeration::TytPacketNyjniy )

4) типа_пример вот как должно было идти примерно, я так понимаю тебе нужно для примера, чтоб когда соединение с сервером устанавливалось, то сразу разрывалось ?

C++:






bool
CALLBACK
incomingPacket
(
stRakNetHookParams
*
data
)
{
// PACKET_CONNECTION_COOKIE = 26
if
(
params
->
packetId
==
PacketEnumeration
::
26
)
{
{
SF
->
getRakNet
(
)
->
emulateRecvPacket
(
data
->
packetId
,
data
->
bitStream
)
;
return
false
;
}
}




мало писал на сф, по идеи идом можно вставить пакет,

п.с. не бейте тапками, что апнул старую тему, не сдержался, триггернулся на этом, https://www.blast.hk/threads/151147/page-2#post-1155924 , еще давно видел эту тему, странно, что осталась без внимания, такая критика СФ и такой мастер как @Dark_Knight (https://www.blast.hk/members/34/) не пояснил еще здесь...

Ya Zaregalsya
22.11.2023, 23:27
эммм
собственно соизволю ответить

1) так а с каким пакетом, то работаешь ? у тебя входящий пакет приходит попадает в блок кода в котором возвращает ничего(ложное) - отмену, типа ничо и не должно работать
2) у тебя всё пустые значения, что битстрим, что параметры к нему
3) if( params->packetId == PacketEnumeration::TytPacketNyjniy )

4) типа_пример вот как должно было идти примерно, я так понимаю тебе нужно для примера, чтоб когда соединение с сервером устанавливалось, то сразу разрывалось ?

C++:






bool
CALLBACK
incomingPacket
(
stRakNetHookParams
*
data
)
{
// PACKET_CONNECTION_COOKIE = 26
if
(
params
->
packetId
==
PacketEnumeration
::
26
)
{
{
SF
->
getRakNet
(
)
->
emulateRecvPacket
(
data
->
packetId
,
data
->
bitStream
)
;
return
false
;
}
}




мало писал на сф, по идеи идом можно вставить пакет,

п.с. не бейте тапками, что апнул старую тему, не сдержался, триггернулся на этом, https://www.blast.hk/threads/151147/page-2#post-1155924 , еще давно видел эту тему, странно, что осталась без внимания, такая критика СФ и такой мастер как @Dark_Knight (https://www.blast.hk/members/34/) не пояснил еще здесь...


Спасибо чел что пытаешься помочь, но ты совсем нихера не понял что такое эмуляция. Если бы она работала в СФ, то код выше вообще никак не влиял бы на игровой процесс. Код выше чисто демонстрационный, пока ни у кого на этом форуме не получилось эмулировать пакет при помощи СФ. Если таковые есть, то пусть покажут свой пример. Я пытался сделать самыми разными способами и нифига не получилось.

01EG
23.11.2023, 03:33
Спасибо чел что пытаешься помочь, но ты совсем нихера не понял что такое эмуляция. Если бы она работала в СФ, то код выше вообще никак не влиял бы на игровой процесс. Код выше чисто демонстрационный, пока ни у кого на этом форуме не получилось эмулировать пакет при помощи СФ. Если таковые есть, то пусть покажут свой пример. Я пытался сделать самыми разными способами и нифига не получилось.


эмулировать пакет не равно заполнить структуру и отправить ? это единственный способ в сф

Ya Zaregalsya
23.11.2023, 13:21
эмулировать пакет не равно заполнить структуру и отправить ? это единственный способ в сф


Это называется отправить пакет. А эмулировать это когда ты принудительно заставляешь самп обработать твой собственный пакет, как будто он пришёл от сервера.

Ya Zaregalsya
31.01.2024, 12:17
Вроде что-то получилось.

C++:






struct
stOnFootData
{
uint16_t
sLeftRightKeys
;
uint16_t
sUpDownKeys
;
union
{
uint16_t
sKeys
;
struct
stSAMPKeys
stSampKeys
;
}
;
float
fPosition
[
3
]
;
float
fQuaternion
[
4
]
;
uint8_t
byteHealth
;
uint8_t
byteArmor
;
uint8_t
byteCurrentWeapon
;
uint8_t
byteSpecialAction
;
float
fMoveSpeed
[
3
]
;
float
fSurfingOffsets
[
3
]
;
uint16_t
sSurfingVehicleID
;
union
{
struct
{
uint16_t
id
;
uint8_t
frameDelta
;
union
{
struct
{
bool
loop
:
1
;
bool
lockX
:
1
;
bool
lockY
:
1
;
bool
freeze
:
1
;
uint8_t
time
:
2
;
uint8_t
_unused
:
1
;
bool
regular
:
1
;
}
;
uint8_t
value
;
}
flags
;
}
animation
;
struct
{
uint16_t
sCurrentAnimationID
;
uint16_t
sAnimFlags
;
}
;
}
;
}
;
void
emulOnFootData
(
int
sampPlayerId
,
stOnFootData onFootData
)
{
bool
bHasLeftRightKeys
=
onFootData
.
sLeftRightKeys
!=
0
?
true
:
false
;
bool
bHasUpDownKeys
=
onFootData
.
sUpDownKeys
!=
0
?
true
:
false
;
bool
bHasSurfInfo
=
onFootData
.
sSurfingVehicleID
!=
0
?
true
:
false
;
bool
bAnimation
=
onFootData
.
sCurrentAnimationID
!=
0
?
true
:
false
;
BitStream bs
;
bs
.
Write
(
(
unsigned
short
)
sampPlayerId
)
;
bs
.
Write
(
bHasLeftRightKeys
)
;
if
(
bHasLeftRightKeys
)
{
bs
.
Write
(
(
WORD
)
onFootData
.
sLeftRightKeys
)
;
}
bs
.
Write
(
bHasUpDownKeys
)
;
if
(
bHasUpDownKeys
)
{
bs
.
Write
(
(
WORD
)
onFootData
.
sUpDownKeys
)
;
}
bs
.
Write
(
onFootData
.
sKeys
)
;
// bs.WriteVector(onFootData.fPosition[0], onFootData.fPosition[1], onFootData.fPosition[2]);
bs
.
Write
(
onFootData
.
fPosition
[
0
]
)
;
bs
.
Write
(
onFootData
.
fPosition
[
1
]
)
;
bs
.
Write
(
onFootData
.
fPosition
[
2
]
)
;
bs
.
WriteNormQuat
(
onFootData
.
fQuaternion
[
0
]
,
onFootData
.
fQuaternion
[
1
]
,
onFootData
.
fQuaternion
[
2
]
,
onFootData
.
fQuaternion
[
3
]
)
;
BYTE byteHealthArmor
=
(
onFootData
.
byteHealth

getRakNet
(
)
->
emulateRecvPacket
(
207
,
&
bs
)
;
}
void
test
(
int
playerId
)
{
stOnFootData onFootData
;
onFootData
.
sLeftRightKeys
=
0
;
onFootData
.
sUpDownKeys
=
0
;
onFootData
.
sKeys
=
0
;
onFootData
.
fPosition
[
0
]
=
PEDSELF
->
GetPosition
(
)
->
fX
+
1.0
;
onFootData
.
fPosition
[
1
]
=
PEDSELF
->
GetPosition
(
)
->
fY
;
onFootData
.
fPosition
[
2
]
=
PEDSELF
->
GetPosition
(
)
->
fZ
;
onFootData
.
fQuaternion
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
0
]
;
onFootData
.
fQuaternion
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
1
]
;
onFootData
.
fQuaternion
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
2
]
;
onFootData
.
fQuaternion
[
3
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fQuaternion
[
3
]
;
onFootData
.
byteHealth
=
50
;
onFootData
.
byteArmor
=
100
;
onFootData
.
byteCurrentWeapon
=
24
;
onFootData
.
byteSpecialAction
=
68
;
onFootData
.
fMoveSpeed
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
0
]
;
onFootData
.
fMoveSpeed
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
1
]
;
onFootData
.
fMoveSpeed
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
onFootData
.
fMoveSpeed
[
2
]
;
bool
bHasSurfInfo
=
false
;
onFootData
.
fSurfingOffsets
[
0
]
=
0.0
;
onFootData
.
fSurfingOffsets
[
1
]
=
0.0
;
onFootData
.
fSurfingOffsets
[
2
]
=
0.0
;
onFootData
.
sSurfingVehicleID
=
0
;
bool
bAnimation
=
true
;
/*
onFootData.animation.id = 1224;
onFootData.animation.frameDelta = 1.0;
onFootData.animation.flags.lockX = false;
onFootData.animation.flags.lockY = false;
onFootData.animation.flags.freeze = false;
onFootData.animation.flags.time = false;
onFootData.animation.flags._unused = false;
onFootData.animation.flags.regular = false;*/
onFootData
.
sCurrentAnimationID
=
984
;
onFootData
.
sAnimFlags
=
4356
;
emulOnFootData
(
playerId
,
onFootData
)
;
}




Недостающие функции битстрима можно скопипастить отсюда (https://github.com/LoleroChitero/RakSAMP/blob/c6aa8f362e74cabeb7f5001a8bf081eccfb5d323/raknet/BitStream.h#L1362).

UPD: исправил фатальные опечатки.

Ya Zaregalsya
03.06.2024, 17:41
Почему этот код не работает? Пакеты не эмулируются, не коннектится к серверу.

C++:






bool
CALLBACK
incomingPacket
(
stRakNetHookParams
*
data
)
{
SF
->
getRakNet
(
)
->
emulateRecvPacket
(
data
->
packetId
,
data
->
bitStream
)
;
return
false
;
}




Аналогичная функция в Мунлоадере работает как часы и пользуется спросом, но если вбить эту же функу из СФ в поиск по форуму, то не найдётся ни одного её упоминания. Отсюда можно сделать вывод, что одна из самых важных функций во всей либе неработоспособна, либо работает неочевидным образом и никто так и не понял как её использовать. Вопрос к разработчику @FYP (https://www.blast.hk/members/2/)

😐


А этот код не работал из-за того, что в СФ ид пакета идёт в куче данных с самим пакетом, но при эмуляции ожидает получить сам пакет без этого ид. С РПС таких проблем нет.