GTA SA, C++ | Как работает карта педов?

Receiver

leet-cheats 👑
Автор темы
Модератор
646
952
1617174673855.png

1617174694477.png

1617174703356.png

1617174770551.png
 
Решение
Первым же делом пошел смотреть Plugin SDK, создал тему, потому что не понял как это вообще работает и как этим пользоваться. Тупое копирование меня не устраивает
Как-то так. (Я не эксперт в этом)
Простой пример:
#include <iostream>
#include <string>

using std::cout;
using std::endl;

union CColor
{
    unsigned long color;
    struct {
        // Сколько может уместиться байтов в unsigned long -> 4
        unsigned char alpha;
        unsigned char red;
        unsigned char green;
        unsigned char blue;
    };

    CColor()
    {
        this->alpha = 255;
        this->red = 255;
        this->green = 255;
        this->blue = 255;
    
        cout << (int)this->alpha << endl;
        cout << (int)this->red << endl;
        cout <<...

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,749
4,847
C++:
struct poolBitmap {
    unsigned char nId : 7;
    bool bEmpty : 1;
};

+0 это new CCopPed[n];
+4 это new poolBitmap[n];
+8 это n
+12 это номер самого последнего педа в пуле, т.е. может быть такая картина:
ped nullptr nullptr ped nullptr ped
По оффсету 12 будет лежать значение 6
UPD: возможно там будет не 6, а 1, как индекс первого свободного элемента куда можно воткнуть нового педа при создании, не помню точно
 

Receiver

leet-cheats 👑
Автор темы
Модератор
646
952
C++:
struct poolBitmap {
    unsigned char nId : 7;
    bool bEmpty : 1;
};

+0 это new CCopPed[n];
+4 это new poolBitmap[n];
+8 это n
+12 это номер самого последнего педа в пуле, т.е. может быть такая картина:
ped nullptr nullptr ped nullptr ped
По оффсету 12 будет лежать значение 6
UPD: возможно там будет не 6, а 1, как индекс первого свободного элемента куда можно воткнуть нового педа при создании, не помню точно
Как этим пользоваться?
 

Receiver

leet-cheats 👑
Автор темы
Модератор
646
952
Первым же делом пошел смотреть Plugin SDK, создал тему, потому что не понял как это вообще работает и как этим пользоваться. Тупое копирование меня не устраивает
 

Musaigen

dead eyes
Проверенный
1,666
1,485
Первым же делом пошел смотреть Plugin SDK, создал тему, потому что не понял как это вообще работает и как этим пользоваться. Тупое копирование меня не устраивает
Как-то так. (Я не эксперт в этом)
Простой пример:
#include <iostream>
#include <string>

using std::cout;
using std::endl;

union CColor
{
    unsigned long color;
    struct {
        // Сколько может уместиться байтов в unsigned long -> 4
        unsigned char alpha;
        unsigned char red;
        unsigned char green;
        unsigned char blue;
    };

    CColor()
    {
        this->alpha = 255;
        this->red = 255;
        this->green = 255;
        this->blue = 255;
    
        cout << (int)this->alpha << endl;
        cout << (int)this->red << endl;
        cout << (int)this->green << endl;
        cout << (int)this->blue << endl;
        cout << this->color << endl;
        
        /*
        Output:
        255
        255
        255
        255
        4294967295
        */
    }
    
};

int main()
{
    CColor color;
    
    return 0;
}
Сложный пример:
#include <iostream>
#include <string>

using std::cout;
using std::endl;

union tPoolObjectFlags {
    struct {
        // Сколько байтов может поместиться в unsigned char -> 1
        // Здесь утверждать ничего не стану, ибо сам хз
        unsigned char nId : 7;
        bool bEmpty : 1;
        // Возможно, имеется виду размер типа поля поделить на кол-во битов. Т.е:
        // sizeof(unsigned char) / 7 -> 255 / 7
        // sizeof(bool) / 1 -> 1 / 1
    };
    unsigned char value;
    
    tPoolObjectFlags()
    {
        unsigned char byteId = 2;
        bool bEmpty = true;
    
        this->value = value | (byteId);
        this->value = value | (bEmpty << 7);
        // Обратно, Утверждать не стану, но здесь всё как в структуре
        // Т.е первый сдвиг равен 0 (начало структуры)
        // Второй сдвиг равен первому и т.д
    
        cout << "Bit shifting" << endl;
        cout << (int)this->nId << endl;
        cout << this->bEmpty << endl;
        cout << (int)this->value << endl << endl;
        
        this->value = 0;
        
        this->nId = 2;
        this->bEmpty = true;
        
        cout << "Field set" << endl;
        cout << (int)this->nId << endl;
        cout << this->bEmpty << endl;
        cout << (int)this->value << endl << endl;
        
        // Output:
        /*
            Bit shifting                                                                                                                         
            2                                                                                                                                   
            1                                                                                                                                   
            130
            
            Field set                                                                                                                           
            2                                                                                                                                   
            1                                                                                                                                   
            130
        */
    }
};

int main()
{
    tPoolObjectFlags color;
    
    return 0;
}
 
  • Нравится
Реакции: Receiver

Receiver

leet-cheats 👑
Автор темы
Модератор
646
952
struct { // Сколько байтов может поместиться в unsigned char -> 1 // Здесь утверждать ничего не стану, ибо сам хз unsigned char nId : 7; bool bEmpty : 1; // Возможно, имеется виду размер типа поля поделить на кол-во битов. Т.е: // sizeof(unsigned char) / 7 -> 255 / 7 // sizeof(bool) / 1 -> 1 / 1 }; unsigned char value;
Я тут вроде разобрался немного. nValue это unsigned char, его размер 1 байт, т.е. 8 бит. Первые 7 бит nValue будет занимать nId, последний - bEmpty.