Синхронизация оружия на руках ID_WEAPONS_UPDATE - ID: 204

Ya Zaregalsya

Известный
Автор темы
386
134
Чё за бред?


C++:
struct WeaponsUpdateData
{
    UINT8 slot_0;
    UINT8 weapon_0;
    UINT16 ammo_0;
    UINT8 slot_1;
    UINT8 weapon_1;
    UINT16 ammo_1;
    UINT8 slot_2;
    UINT8 weapon_2;
    UINT16 ammo_2;
    UINT8 slot_3;
    UINT8 weapon_3;
    UINT16 ammo_3;
    UINT8 slot_4;
    UINT8 weapon_4;
    UINT16 ammo_4;
    UINT8 slot_5;
    UINT8 weapon_5;
    UINT16 ammo_5;
    UINT8 slot_6;
    UINT8 weapon_6;
    UINT16 ammo_6;
    UINT8 slot_7;
    UINT8 weapon_7;
    UINT16 ammo_7;
    UINT8 slot_8;
    UINT8 weapon_8;
    UINT16 ammo_8;
    UINT8 slot_9;
    UINT8 weapon_9;
    UINT16 ammo_9;
    UINT8 slot_10;
    UINT8 weapon_10;
    UINT16 ammo_10;
    UINT8 slot_11;
    UINT8 weapon_11;
    UINT16 ammo_11;
};

bool CALLBACK outcomingPacket(stRakNetHookParams* data)
{
    switch (data->packetId)
    {
        case 204:
        {
            SF->getSAMP()->getChat()->AddChatMessage(-1, "WeaponsUpdateData");
            WeaponsUpdateData weaponsUpdateData;
            data->bitStream->Read(weaponsUpdateData.slot_0);
            data->bitStream->Read(weaponsUpdateData.weapon_0);
            data->bitStream->Read(weaponsUpdateData.ammo_0);
            data->bitStream->Read(weaponsUpdateData.slot_1);
            data->bitStream->Read(weaponsUpdateData.weapon_1);
            data->bitStream->Read(weaponsUpdateData.ammo_1);
            data->bitStream->Read(weaponsUpdateData.slot_2);
            data->bitStream->Read(weaponsUpdateData.weapon_2);
            data->bitStream->Read(weaponsUpdateData.ammo_2);
            data->bitStream->Read(weaponsUpdateData.slot_3);
            data->bitStream->Read(weaponsUpdateData.weapon_3);
            data->bitStream->Read(weaponsUpdateData.ammo_3);
            data->bitStream->Read(weaponsUpdateData.slot_4);
            data->bitStream->Read(weaponsUpdateData.weapon_4);
            data->bitStream->Read(weaponsUpdateData.ammo_4);
            data->bitStream->Read(weaponsUpdateData.slot_5);
            data->bitStream->Read(weaponsUpdateData.weapon_5);
            data->bitStream->Read(weaponsUpdateData.ammo_5);
            data->bitStream->Read(weaponsUpdateData.slot_6);
            data->bitStream->Read(weaponsUpdateData.weapon_6);
            data->bitStream->Read(weaponsUpdateData.ammo_6);
            data->bitStream->Read(weaponsUpdateData.slot_7);
            data->bitStream->Read(weaponsUpdateData.weapon_7);
            data->bitStream->Read(weaponsUpdateData.ammo_7);
            data->bitStream->Read(weaponsUpdateData.slot_8);
            data->bitStream->Read(weaponsUpdateData.weapon_8);
            data->bitStream->Read(weaponsUpdateData.ammo_8);
            data->bitStream->Read(weaponsUpdateData.slot_9);
            data->bitStream->Read(weaponsUpdateData.weapon_9);
            data->bitStream->Read(weaponsUpdateData.ammo_9);
            data->bitStream->Read(weaponsUpdateData.slot_10);
            data->bitStream->Read(weaponsUpdateData.weapon_10);
            data->bitStream->Read(weaponsUpdateData.ammo_10);
            data->bitStream->Read(weaponsUpdateData.slot_11);
            data->bitStream->Read(weaponsUpdateData.weapon_11);
            data->bitStream->Read(weaponsUpdateData.ammo_11);
            data->bitStream->ResetReadPointer();

            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_0: %i; weapon_0: %i; ammo_0: %i;",
                weaponsUpdateData.slot_0, weaponsUpdateData.weapon_0, weaponsUpdateData.ammo_0);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_1: %i; weapon_1: %i; ammo_1: %i;",
                weaponsUpdateData.slot_1, weaponsUpdateData.weapon_1, weaponsUpdateData.ammo_1);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_2: %i; weapon_2: %i; ammo_2: %i;",
                weaponsUpdateData.slot_2, weaponsUpdateData.weapon_2, weaponsUpdateData.ammo_2);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_3: %i; weapon_3: %i; ammo_3: %i;",
                weaponsUpdateData.slot_3, weaponsUpdateData.weapon_3, weaponsUpdateData.ammo_3);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_4: %i; weapon_4: %i; ammo_4: %i;",
                weaponsUpdateData.slot_4, weaponsUpdateData.weapon_4, weaponsUpdateData.ammo_4);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_5: %i; weapon_5: %i; ammo_5: %i;",
                weaponsUpdateData.slot_5, weaponsUpdateData.weapon_5, weaponsUpdateData.ammo_5);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_6: %i; weapon_6: %i; ammo_6: %i;",
                weaponsUpdateData.slot_6, weaponsUpdateData.weapon_6, weaponsUpdateData.ammo_6);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_7: %i; weapon_7: %i; ammo_7: %i;",
                weaponsUpdateData.slot_7, weaponsUpdateData.weapon_7, weaponsUpdateData.ammo_7);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_8: %i; weapon_8: %i; ammo_8: %i;",
                weaponsUpdateData.slot_8, weaponsUpdateData.weapon_8, weaponsUpdateData.ammo_8);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_9: %i; weapon_9: %i; ammo_9: %i;",
                weaponsUpdateData.slot_9, weaponsUpdateData.weapon_9, weaponsUpdateData.ammo_9);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_10: %i; weapon_10: %i; ammo_10: %i;",
                weaponsUpdateData.slot_10, weaponsUpdateData.weapon_10, weaponsUpdateData.ammo_10);
            SF->getSAMP()->getChat()->AddChatMessage(-1, "slot_11: %i; weapon_11: %i; ammo_11: %i;",
                weaponsUpdateData.slot_11, weaponsUpdateData.weapon_11, weaponsUpdateData.ammo_11);

            break;
        }

sa-mp-182.png
 
Решение
Спасибо всем за ответы. В интернете так и не нашёл правильного варианта, в итоге методом тыка пришёл к такой структуре:


Lua:
struct WeaponsUpdateData
{
    UINT8 packet_id;
    UINT8 player_target_id;
    UINT8 unknown_player_data;
    UINT8 npc_target_id;
    UINT8 unknown_npc_data;
    UINT8 slot_id;
    UINT8 weapon_id;
    UINT16 ammo_amount;

    //packet_id - 204.
    //player_target_id - ID захватываемого игрока.
    //unknown_player_data- непонятная инфа о захватываемых игроках, но не мусор. Встречал 0, 1 и 2.
    //npc_target_id - ID захватываемого NPC.
    //unknown_npc_data- непонятная инфа о захватываемых NPC, но не мусор. Встречал только 0. Скорее всего это bool.
    //slot_id - ID обновлённого слота.
    //weapon_id - ID...

Ya Zaregalsya

Известный
Автор темы
386
134
там паленая какая-то

короче, скипай 32 бита
Так скиньте правильную. Скипать в каком месте? Поставил пропуск битов в самое начало и ничего особо не изменилось.

там паленая какая-то

короче, скипай 32 бита
Нашёл другую структуру в собейте, чуть позже попробую.
 

Rei

Известный
Друг
1,616
1,674
Так скиньте правильную. Скипать в каком месте? Поставил пропуск битов в самое начало и ничего особо не изменилось.


Нашёл другую структуру в собейте, чуть позже попробую.
2 байта - таргет ид игрока
2 байта - таргет ид актера
дальше читаешь пушки как обычно
 

Ya Zaregalsya

Известный
Автор темы
386
134
2 байта - таргет ид игрока
2 байта - таргет ид актера
дальше читаешь пушки как обычно
Всё равно выводит мусор. Единственная полезная информация это что на месте ammo_0 выводятся патроны (вернее патроны умноженные в 256 раз), но это происходит только если синхра отправляется в момент выстрела.

И ещё первый байт это реально TargetID, но и там в 256 раз больше и только в определённый момент если другой игрок подсвечивается маркером, а так без этого там мусорная инфа 256 в квадрате.
 
Последнее редактирование:

Rei

Известный
Друг
1,616
1,674
Всё равно выводит мусор. Единственная полезная информация это что на месте ammo_0 выводятся патроны (вернее патроны умноженные в 256 раз), но это происходит только если синхра отправляется в момент выстрела.

И ещё первый байт это реально TargetID, но и там в 256 раз больше и только в определённый момент если другой игрок подсвечивается маркером, а так без этого там мусорная инфа 256 в квадрате.
65535 значит пусто ( нет таргета )
 
  • Нравится
Реакции: Ya Zaregalsya

Ya Zaregalsya

Известный
Автор темы
386
134
65535 значит пусто ( нет таргета )
Есть где-нибудь нормальная готовая структура? Уже долго вожусь с подстановкой разных типов данных, все они если и дают правильный результат, то выводят его в неожиданном месте в перемешку с кучей мусора.

По этому пакету настолько противоречивая информация, что даже ID все пишут разный.
 
Последнее редактирование:

Rei

Известный
Друг
1,616
1,674
Есть где-нибудь нормальная готовая структура? Уже долго вожусь с подстановкой разных типов данных, все они если и дают правильный результат, то выводят его в неожиданном месте в перемешку с кучей мусора.

По этому пакету настолько противоречивая информация, что даже ID все пишут разный.
samp.lua в handlers
 
  • Нравится
Реакции: Ya Zaregalsya

Ya Zaregalsya

Известный
Автор темы
386
134
Добавил UINT16 playerTarget; UINT16 actorTarget; но мусор как выводился, так и выводится.

Кстати пакет приходит всегда размером 72 бита вне зависимости от кол-ва оружия на руках. Тут опять-таки везде разная информация, кто-то говорит, что должны слаться только данные об обновлённом оружии, другие говорят, что шлются сразу все 11 слотов, плюс этот пакет зачем-то объединён с синхронизацией маркера над головой, такие разные задачи, а пакет на них один. Такая вот загадочная каша.
 
Последнее редактирование:

SAsha133777

Потрачен
127
111
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Добавил UINT16 playerTarget; UINT16 actorTarget; но мусор как выводился, так и выводится.

Кстати пакет приходит всегда размером 72 бита вне зависимости от кол-ва оружия на руках. Тут опять-таки везде разная информация, кто-то говорит, что должны слаться только данные об обновлённом оружии, другие говорят, что шлются сразу все 11 слотов, плюс этот пакет зачем-то объединён с синхронизацией маркера над головой, такие разные задачи, а пакет на них один. Такая вот загадочная каша.
Этот пакет отправляется когда меняется количество патрон у какого-то оружия, когда оно появляется, когда удаляется. И в одном пакете только для одного оружия. Ещё он отправляется когда целишься на игрока и видно у него над головой зелёный треугольник.
 
  • Нравится
Реакции: Ya Zaregalsya

Ya Zaregalsya

Известный
Автор темы
386
134
Спасибо всем за ответы. В интернете так и не нашёл правильного варианта, в итоге методом тыка пришёл к такой структуре:


Lua:
struct WeaponsUpdateData
{
    UINT8 packet_id;
    UINT8 player_target_id;
    UINT8 unknown_player_data;
    UINT8 npc_target_id;
    UINT8 unknown_npc_data;
    UINT8 slot_id;
    UINT8 weapon_id;
    UINT16 ammo_amount;

    //packet_id - 204.
    //player_target_id - ID захватываемого игрока.
    //unknown_player_data- непонятная инфа о захватываемых игроках, но не мусор. Встречал 0, 1 и 2.
    //npc_target_id - ID захватываемого NPC.
    //unknown_npc_data- непонятная инфа о захватываемых NPC, но не мусор. Встречал только 0. Скорее всего это bool.
    //slot_id - ID обновлённого слота.
    //weapon_id - ID обновлённого оружия.
    //ammo_amount - обновлённое кол-во боеприпасов.
};
 
Последнее редактирование:
  • Нравится
Реакции: MeG@LaDo[N] ^_^

al3x_

Известный
125
1,086
если все еще нужно
C++:
unsigned char packet;
unsigned short playerTarget, actorTarget;
unsigned char slot, weapon;
unsigned short ammo;
params->bitStream->Read(packet);
params->bitStream->Read(playerTarget);
params->bitStream->Read(actorTarget);
params->bitStream->Read(slot);
params->bitStream->Read(weapon);
params->bitStream->Read(ammo);
 
  • Нравится
Реакции: MeG@LaDo[N] ^_^