В этом посте DK показывал пример, как расширить класс, "прикрепив" к нему дополнительные атрибуты. Насколько я понял, существующие пулы при этом не расширяются.
#include <plugin.h>
using namespace plugin;
class VehicleExtendedExample {
public:
class VehicleComponents { // Класс, который представляет наши данные (можно сказать, что эти данные "прикрепляются" к структуре транспорта)
public:
RwFrame *m_pDoorLF;
RwFrame *m_pDoorRF;
RwFrame *m_pDoorLR;
RwFrame *m_pDoorRR;
VehicleComponents(CVehicle *) { // Конструктор этого класса будет вызван при вызове конструктора транспорта (CVehicle::CVehicle)
m_pDoorLF = m_pDoorRF = m_pDoorLR = m_pDoorRR = nullptr; // устанавливаем все указатели в 0
}
};
VehicleExtendedExample() {
static VehicleExtendedData<VehicleComponents> vehComps; // Создаем экземпляр нашего расширения. vehComps - это переменная, через которую мы будем
// обращаться к нашим данным (используя метод Get(CVehicle *транспорт) )
Events::vehicleSetModelEvent += [](CVehicle *vehicle, int modelIndex) { // Выполняем нашу функцию, когда игра устанавливает модель транспорту
if (vehicle->m_pRwClump) { // Если создан графический обьект модели (RpClump)
vehComps.Get(vehicle).m_pDoorLF = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_lf_dummy"); // Находим компоненты в иерархии
vehComps.Get(vehicle).m_pDoorRF = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_rf_dummy"); // и записываем их в наш класс
vehComps.Get(vehicle).m_pDoorLR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_lr_dummy");
vehComps.Get(vehicle).m_pDoorRR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_rr_dummy");
}
else // иначе устанавливаём всё в 0
vehComps.Get(vehicle).m_pDoorLF = vehComps.Get(vehicle).m_pDoorRF = vehComps.Get(vehicle).m_pDoorLR = vehComps.Get(vehicle).m_pDoorRR = nullptr;
};
Events::vehicleRenderEvent += [](CVehicle *vehicle) { // Выполняем нашу функцию, когда игра рендерит транспорт
if (vehComps.Get(vehicle).m_pDoorLF)
vehComps.Get(vehicle).m_pDoorLF->modelling.pos.z = 1.0f; // Сдвигаем компонент вверх
if (vehComps.Get(vehicle).m_pDoorRF)
vehComps.Get(vehicle).m_pDoorRF->modelling.pos.z = 1.0f;
if (vehComps.Get(vehicle).m_pDoorLR)
vehComps.Get(vehicle).m_pDoorLR->modelling.pos.z = 1.0f;
if (vehComps.Get(vehicle).m_pDoorRR)
vehComps.Get(vehicle).m_pDoorRR->modelling.pos.z = 1.0f;
};
}
} vehicleExtendedExample;
DK, можешь на простом примере показать общий принцип расширения классов через прикрепление новых атрибутов. К примеру, есть условный класс
class CVector {
public:
float x;
float y;
CVector();
} vector2d[100];
И есть, например, пул таких координат по определенному адресу памяти, где идет по порядку vector2d[0].x, veсtor2d[0].y, vector2d[1].x, veсtor2d[1].y, vector2d[2].x, veсtor2d[2].y...
Как к этому классу "прикрепить" еще свою координату float z, чтобы обращаться уже к vector2d.x, vector2d.y, vector3d.Get(vector2d).z и не повредить существующий пул. Пример не связан с игрой.