GrowtopiaNoobs / Growtopia-Bot

Growtopia bot made with C++, ENet and Qt.
GNU Affero General Public License v3.0
19 stars 20 forks source link

Tank packet type 4 : Dropped items question. #57

Open opticbird opened 2 years ago

opticbird commented 2 years ago

I can get the Tile data from the Tank packet. But when I try to get the Dropped items, it will return some random numbers. I'm not an expert with Data Types and Sizes, but shouldn't this code work?

Last UID will show as 917512

Dropped items count will show as 0

    world = new WorldStruct;

    worldPtr += 6;
    __int16 strLen = *(__int16*)worldPtr;
    worldPtr += 2;
    world->name = "";
    for (int i = 0; i < strLen; i++)
    {
        world->name += worldPtr[0];
        worldPtr++;
    }

    world->xSize = *(uint32_t*)worldPtr;
    worldPtr += 4;
    world->ySize = *(uint32_t*)worldPtr;
    worldPtr += 4;
    world->tileCount = *(uint32_t*)worldPtr;
    worldPtr += 4;

    for (int i = 0; i < world->tileCount; i++)
    {
        Tile tile;
        tile.tileCount = i;

        tile.foreground = *(__int16*)worldPtr;
        worldPtr += 2;

        tile.background = *(__int16*)worldPtr;
        worldPtr += 2;

        tile.unknownData = *(__int16*)worldPtr;
        worldPtr += 2;

        tile.fFlags = *(uint8_t*)worldPtr;
        worldPtr++;

        tile.sFlags = *(uint8_t*)worldPtr;
        worldPtr++;

        if (tile.unknownData != 0)
        {
            worldPtr += 2;
        }
        if (tile.foreground == 242 || tile.foreground == 9640 || tile.foreground == 202) 
        {
            worldPtr++;
            worldPtr++;
            worldPtr += 4;
            uint32_t accCount = *(uint32_t*)worldPtr;
            worldPtr += 4;
            for (int i = 0; i < accCount; i++)
            {
                worldPtr += 4;
            }
            worldPtr += 8;
        }
        else if (tile.foreground == 12 || tile.foreground == 6)
        {
            worldPtr++;
            __int16 labelLen = *(__int16*)worldPtr;
            worldPtr += 2;
            for (int i = 0; i < labelLen; i++)
            {
                cout << worldPtr[0];
                worldPtr++;
            }
            uint8_t doorStatus = *(uint8_t*)worldPtr;
            worldPtr++;
        }

        world->tiles.push_back(tile);

        if (isLeader)
            tiles.push_back(tile);
    }

    world->droppedItemCount = *(uint32_t*)worldPtr;
    worldPtr += 4;
    world->lastUid = *(uint32_t*)worldPtr;

for (int i = 0; i < world->droppedItemCount; i++) { floatingItem item; worldPtr += 2;

        item.id = *(uint16_t*)worldPtr;
        worldPtr += 2;

        item.x = *(float*)worldPtr;
        worldPtr += 4;

        item.y = *(float*)worldPtr;
        worldPtr += 4;

        item.count = *(uint16_t*)worldPtr;
        worldPtr += 2;
        if (item.count > 200)
        {
            item.count = 1;
        }
        //flags or not?
        item.uid = *(uint32_t*)worldPtr;
        worldPtr += 4;

        world->droppeditems.push_back(item);
        if (isLeader)
            droppeditems.push_back(item);
    }
opticbird commented 2 years ago

gtnoob's source already has uid count

Where? I only see tile serilization, which doesn't seem to have last UID or item pos etc.

opticbird commented 2 years ago

image

That is received whenever something is collected. I need to get that from the world packet, so I can actually get dropped items.