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

Receiver

leet-cheats 👑
Автор темы
Модератор
645
957
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,851
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 👑
Автор темы
Модератор
645
957
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 👑
Автор темы
Модератор
645
957
Первым же делом пошел смотреть Plugin SDK, создал тему, потому что не понял как это вообще работает и как этим пользоваться. Тупое копирование меня не устраивает
 

Musaigen

shitposter
Проверенный
1,660
1,477
Первым же делом пошел смотреть 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 👑
Автор темы
Модератор
645
957
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.