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

Статус
В этой теме нельзя размещать новые ответы.

Ya Zaregalsya

Известный
Автор темы
387
135
Почему этот код не работает? Пакеты не эмулируются, не коннектится к серверу.
C++:
bool CALLBACK incomingPacket(stRakNetHookParams* data)
{
    SF->getRakNet()->emulateRecvPacket(data->packetId, data->bitStream);
    return false;
}

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

😐
 
Решение
Вроде что-то получилось.


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...

01EG

Известный
Проверенный
631
355
Почему этот код не работает? Пакеты не эмулируются, не коннектится к серверу.
C++:
bool CALLBACK incomingPacket(stRakNetHookParams* data)
{
    SF->getRakNet()->emulateRecvPacket(data->packetId, data->bitStream);
    return false;
}

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

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

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 не пояснил еще здесь...
 
  • Нравится
Реакции: cloused2

Ya Zaregalsya

Известный
Автор темы
387
135
эммм
собственно соизволю ответить

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 не пояснил еще здесь...
Спасибо чел что пытаешься помочь, но ты совсем нихера не понял что такое эмуляция. Если бы она работала в СФ, то код выше вообще никак не влиял бы на игровой процесс. Код выше чисто демонстрационный, пока ни у кого на этом форуме не получилось эмулировать пакет при помощи СФ. Если таковые есть, то пусть покажут свой пример. Я пытался сделать самыми разными способами и нифига не получилось.
 
Последнее редактирование:

01EG

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

Ya Zaregalsya

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

Ya Zaregalsya

Известный
Автор темы
387
135
Вроде что-то получилось.


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 << 0x4) | onFootData.byteArmor;
    {
        BYTE byteTempHealth = onFootData.byteHealth / 7;
        BYTE byteTempArmor = onFootData.byteArmor / 7;

        byteHealthArmor = (byteTempHealth << 4) | byteTempArmor;
    }
    bs.Write(byteHealthArmor);
    bs.Write(onFootData.byteCurrentWeapon);
    bs.Write(onFootData.byteSpecialAction);

    bs.WriteVector(onFootData.fMoveSpeed[0], onFootData.fMoveSpeed[1], onFootData.fMoveSpeed[2]);

    bs.Write(bHasSurfInfo);
    if (bHasSurfInfo)
    {

        bs.Write(onFootData.sSurfingVehicleID);
        bs.Write(onFootData.fSurfingOffsets[0]);
        bs.Write(onFootData.fSurfingOffsets[1]);
        bs.Write(onFootData.fSurfingOffsets[2]);
    }
    bs.Write(bAnimation);
    if (bAnimation)
    {

        bs.Write(onFootData.sCurrentAnimationID);
        bs.Write(onFootData.sAnimFlags);
    }

    SF->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);
}
Недостающие функции битстрима можно скопипастить отсюда.

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

Ya Zaregalsya

Известный
Автор темы
387
135
Почему этот код не работает? Пакеты не эмулируются, не коннектится к серверу.
C++:
bool CALLBACK incomingPacket(stRakNetHookParams* data)
{
    SF->getRakNet()->emulateRecvPacket(data->packetId, data->bitStream);
    return false;
}

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

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