mirror of
https://git.rip/DMCA_FUCKER/re3.git
synced 2024-12-23 05:10:00 +00:00
more CVehicleModelInfo
This commit is contained in:
parent
cb8993f15e
commit
c5a058b615
|
@ -8,7 +8,11 @@ class CVehicle : public CPhysical
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// 0x128
|
// 0x128
|
||||||
uint8 stuff1[120];
|
uint8 stuff1[116];
|
||||||
|
uint8 m_currentColour1;
|
||||||
|
uint8 m_currentColour2;
|
||||||
|
uint8 m_extra1;
|
||||||
|
uint8 m_extra2;
|
||||||
int16 m_nAlarmState;
|
int16 m_nAlarmState;
|
||||||
CPed *pDriver;
|
CPed *pDriver;
|
||||||
CPed *pPassengers[8];
|
CPed *pPassengers[8];
|
||||||
|
|
|
@ -203,6 +203,7 @@ enum
|
||||||
MI_FATFEMALE01,
|
MI_FATFEMALE01,
|
||||||
MI_FATFEMALE02,
|
MI_FATFEMALE02,
|
||||||
|
|
||||||
|
MI_FIRETRUCK = 97,
|
||||||
MI_PREDATOR = 120,
|
MI_PREDATOR = 120,
|
||||||
MI_RHINO = 122,
|
MI_RHINO = 122,
|
||||||
MI_TRAIN = 124,
|
MI_TRAIN = 124,
|
||||||
|
|
|
@ -7,6 +7,10 @@
|
||||||
#include "TxdStore.h"
|
#include "TxdStore.h"
|
||||||
#include "Weather.h"
|
#include "Weather.h"
|
||||||
#include "VisibilityPlugins.h"
|
#include "VisibilityPlugins.h"
|
||||||
|
#include "FileMgr.h"
|
||||||
|
#include "World.h"
|
||||||
|
#include "Vehicle.h"
|
||||||
|
#include "ModelIndices.h"
|
||||||
#include "ModelInfo.h"
|
#include "ModelInfo.h"
|
||||||
|
|
||||||
int8 *CVehicleModelInfo::ms_compsToUse = (int8*)0x5FF2EC; // -2, -2
|
int8 *CVehicleModelInfo::ms_compsToUse = (int8*)0x5FF2EC; // -2, -2
|
||||||
|
@ -280,6 +284,16 @@ CVehicleModelInfo::HideDamagedAtomicCB(RpAtomic *atomic, void *data)
|
||||||
return atomic;
|
return atomic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RpAtomic*
|
||||||
|
CVehicleModelInfo::HideAllComponentsAtomicCB(RpAtomic *atomic, void *data)
|
||||||
|
{
|
||||||
|
if(CVisibilityPlugins::GetAtomicId(atomic) & (int)data)
|
||||||
|
RpAtomicSetFlags(atomic, 0);
|
||||||
|
else
|
||||||
|
RpAtomicSetFlags(atomic, rpATOMICRENDER);
|
||||||
|
return atomic;
|
||||||
|
}
|
||||||
|
|
||||||
RpMaterial*
|
RpMaterial*
|
||||||
CVehicleModelInfo::HasAlphaMaterialCB(RpMaterial *material, void *data)
|
CVehicleModelInfo::HasAlphaMaterialCB(RpMaterial *material, void *data)
|
||||||
{
|
{
|
||||||
|
@ -758,6 +772,183 @@ CVehicleModelInfo::SetVehicleColour(uint8 c1, uint8 c2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CVehicleModelInfo::ChooseVehicleColour(uint8 &col1, uint8 &col2)
|
||||||
|
{
|
||||||
|
if(m_numColours == 0){
|
||||||
|
col1 = 0;
|
||||||
|
col2 = 0;
|
||||||
|
}else{
|
||||||
|
m_lastColorVariation = (m_lastColorVariation+1) % m_numColours;
|
||||||
|
col1 = m_colours1[m_lastColorVariation];
|
||||||
|
col2 = m_colours2[m_lastColorVariation];
|
||||||
|
if(m_numColours > 1){
|
||||||
|
CVehicle *veh = FindPlayerVehicle();
|
||||||
|
if(veh && CModelInfo::GetModelInfo(veh->GetModelIndex()) == this &&
|
||||||
|
veh->m_currentColour1 == col1 &&
|
||||||
|
veh->m_currentColour2 == col2){
|
||||||
|
m_lastColorVariation = (m_lastColorVariation+1) % m_numColours;
|
||||||
|
col1 = m_colours1[m_lastColorVariation];
|
||||||
|
col2 = m_colours2[m_lastColorVariation];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CVehicleModelInfo::AvoidSameVehicleColour(uint8 *col1, uint8 *col2)
|
||||||
|
{
|
||||||
|
int i, n;
|
||||||
|
|
||||||
|
if(m_numColours > 1)
|
||||||
|
for(i = 0; i < 8; i++){
|
||||||
|
if(*col1 != m_lastColour1 || *col2 != m_lastColour2)
|
||||||
|
break;
|
||||||
|
n = CGeneral::GetRandomNumberInRange(0, m_numColours);
|
||||||
|
*col1 = m_colours1[n];
|
||||||
|
*col2 = m_colours2[n];
|
||||||
|
}
|
||||||
|
m_lastColour1 = *col1;
|
||||||
|
m_lastColour2 = *col2;
|
||||||
|
}
|
||||||
|
|
||||||
|
RwTexture*
|
||||||
|
CreateCarColourTexture(uint8 r, uint8 g, uint8 b)
|
||||||
|
{
|
||||||
|
RwImage *img;
|
||||||
|
RwRaster *ras;
|
||||||
|
RwTexture *tex;
|
||||||
|
RwUInt8 *pixels;
|
||||||
|
RwInt32 width, height, depth, format;
|
||||||
|
|
||||||
|
img = RwImageCreate(2, 2, 32);
|
||||||
|
pixels = (RwUInt8*)RwMalloc(2*2*4);
|
||||||
|
pixels[0] = r;
|
||||||
|
pixels[1] = g;
|
||||||
|
pixels[2] = b;
|
||||||
|
pixels[3] = 0xFF;
|
||||||
|
pixels[4] = r;
|
||||||
|
pixels[5] = g;
|
||||||
|
pixels[6] = b;
|
||||||
|
pixels[7] = 0xFF;
|
||||||
|
pixels[8] = r;
|
||||||
|
pixels[9] = g;
|
||||||
|
pixels[10] = b;
|
||||||
|
pixels[11] = 0xFF;
|
||||||
|
pixels[12] = r;
|
||||||
|
pixels[13] = g;
|
||||||
|
pixels[14] = b;
|
||||||
|
pixels[15] = 0xFF;
|
||||||
|
RwImageSetPixels(img, pixels);
|
||||||
|
RwImageSetPalette(img, nil);
|
||||||
|
RwImageFindRasterFormat(img, rwRASTERTYPETEXTURE, &width, &height, &depth, &format);
|
||||||
|
ras = RwRasterCreate(width, height, depth, format);
|
||||||
|
RwRasterSetFromImage(ras, img);
|
||||||
|
RwImageDestroy(img);
|
||||||
|
RwFree(pixels);
|
||||||
|
tex = RwTextureCreate(ras);
|
||||||
|
tex->name[0] = '@';
|
||||||
|
return tex;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CVehicleModelInfo::LoadVehicleColours(void)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
int i;
|
||||||
|
char line[1024];
|
||||||
|
int start, end;
|
||||||
|
int section, numCols;
|
||||||
|
enum {
|
||||||
|
NONE,
|
||||||
|
COLOURS,
|
||||||
|
CARS
|
||||||
|
};
|
||||||
|
int r, g, b;
|
||||||
|
char name[64];
|
||||||
|
int colors[16];
|
||||||
|
int n;
|
||||||
|
|
||||||
|
CFileMgr::ChangeDir("\\DATA\\");
|
||||||
|
fd = CFileMgr::OpenFile("CARCOLS.DAT", "r");
|
||||||
|
CFileMgr::ChangeDir("\\");
|
||||||
|
|
||||||
|
for(i = 0; i < 256; i++)
|
||||||
|
ms_colourTextureTable[i] = nil;
|
||||||
|
|
||||||
|
section = 0;
|
||||||
|
numCols = 0;
|
||||||
|
while(CFileMgr::ReadLine(fd, line, sizeof(line))){
|
||||||
|
// find first valid character in line
|
||||||
|
for(start = 0; ; start++)
|
||||||
|
if(line[start] > ' ' || line[start] == '\0' || line[start] == '\n')
|
||||||
|
break;
|
||||||
|
// find end of line
|
||||||
|
for(end = start; ; end++){
|
||||||
|
if(line[end] == '\0' || line[end] == '\n')
|
||||||
|
break;
|
||||||
|
if(line[end] == ',' || line[end] == '\r')
|
||||||
|
line[end] = ' ';
|
||||||
|
}
|
||||||
|
line[end] = '\0';
|
||||||
|
|
||||||
|
// empty line
|
||||||
|
if(line[start] == '#' || line[start] == '\0')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(section == NONE){
|
||||||
|
if(strncmp(&line[start], "col", 3) == 0)
|
||||||
|
section = COLOURS;
|
||||||
|
else if(strncmp(&line[start], "car", 3) == 0)
|
||||||
|
section = CARS;
|
||||||
|
}else if(strncmp(&line[start], "end", 3) == 0){
|
||||||
|
section = NONE;
|
||||||
|
}else if(section == COLOURS){
|
||||||
|
sscanf(&line[start], // BUG: games doesn't add start
|
||||||
|
"%d %d %d", &r, &g, &b);
|
||||||
|
ms_vehicleColourTable[numCols].red = r;
|
||||||
|
ms_vehicleColourTable[numCols].green = g;
|
||||||
|
ms_vehicleColourTable[numCols].blue = b;
|
||||||
|
ms_vehicleColourTable[numCols].alpha = 0xFF;
|
||||||
|
ms_colourTextureTable[numCols] = CreateCarColourTexture(r, g, b);
|
||||||
|
numCols++;
|
||||||
|
}else if(section == CARS){
|
||||||
|
n = sscanf(&line[start], // BUG: games doesn't add start
|
||||||
|
"%s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
|
||||||
|
name,
|
||||||
|
&colors[0], &colors[1],
|
||||||
|
&colors[2], &colors[3],
|
||||||
|
&colors[4], &colors[5],
|
||||||
|
&colors[6], &colors[7],
|
||||||
|
&colors[8], &colors[9],
|
||||||
|
&colors[10], &colors[11],
|
||||||
|
&colors[12], &colors[13],
|
||||||
|
&colors[14], &colors[15]);
|
||||||
|
CVehicleModelInfo *mi = (CVehicleModelInfo*)CModelInfo::GetModelInfo(name, nil);
|
||||||
|
assert(mi);
|
||||||
|
mi->m_numColours = (n-1)/2;
|
||||||
|
for(i = 0; i < mi->m_numColours; i++){
|
||||||
|
mi->m_colours1[i] = colors[i*2 + 0];
|
||||||
|
mi->m_colours2[i] = colors[i*2 + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CFileMgr::CloseFile(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CVehicleModelInfo::DeleteVehicleColourTextures(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < 256; i++){
|
||||||
|
if(ms_colourTextureTable[i]){
|
||||||
|
RwTextureDestroy(ms_colourTextureTable[i]);
|
||||||
|
ms_colourTextureTable[i] = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RpMaterial*
|
RpMaterial*
|
||||||
CVehicleModelInfo::HasSpecularMaterialCB(RpMaterial *material, void *data)
|
CVehicleModelInfo::HasSpecularMaterialCB(RpMaterial *material, void *data)
|
||||||
|
@ -872,6 +1063,31 @@ CVehicleModelInfo::ShutdownEnvironmentMaps(void)
|
||||||
pMatFxIdentityFrame = nil;
|
pMatFxIdentityFrame = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(int id)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
switch(id){
|
||||||
|
case MI_TRAIN:
|
||||||
|
n = 3;
|
||||||
|
break;
|
||||||
|
case MI_FIRETRUCK:
|
||||||
|
n = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
n = ((CVehicleModelInfo*)CModelInfo::GetModelInfo(id))->m_numDoors;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(n == 0)
|
||||||
|
return id == MI_RCBANDIT ? 0 : 1;
|
||||||
|
|
||||||
|
if(id == MI_COACH)
|
||||||
|
return 8;
|
||||||
|
|
||||||
|
return n - 1;
|
||||||
|
}
|
||||||
|
|
||||||
STARTPATCHES
|
STARTPATCHES
|
||||||
InjectHook(0x51FDC0, &CVehicleModelInfo::DeleteRwObject_, PATCH_JUMP);
|
InjectHook(0x51FDC0, &CVehicleModelInfo::DeleteRwObject_, PATCH_JUMP);
|
||||||
InjectHook(0x51FCB0, &CVehicleModelInfo::CreateInstance_, PATCH_JUMP);
|
InjectHook(0x51FCB0, &CVehicleModelInfo::CreateInstance_, PATCH_JUMP);
|
||||||
|
@ -880,6 +1096,7 @@ STARTPATCHES
|
||||||
InjectHook(0x51FE10, &CVehicleModelInfo::CollapseFramesCB, PATCH_JUMP);
|
InjectHook(0x51FE10, &CVehicleModelInfo::CollapseFramesCB, PATCH_JUMP);
|
||||||
InjectHook(0x51FE50, &CVehicleModelInfo::MoveObjectsCB, PATCH_JUMP);
|
InjectHook(0x51FE50, &CVehicleModelInfo::MoveObjectsCB, PATCH_JUMP);
|
||||||
InjectHook(0x51FE70, &CVehicleModelInfo::HideDamagedAtomicCB, PATCH_JUMP);
|
InjectHook(0x51FE70, &CVehicleModelInfo::HideDamagedAtomicCB, PATCH_JUMP);
|
||||||
|
InjectHook(0x51FED0, &CVehicleModelInfo::HideAllComponentsAtomicCB, PATCH_JUMP);
|
||||||
InjectHook(0x51FEF0, &CVehicleModelInfo::HasAlphaMaterialCB, PATCH_JUMP);
|
InjectHook(0x51FEF0, &CVehicleModelInfo::HasAlphaMaterialCB, PATCH_JUMP);
|
||||||
|
|
||||||
InjectHook(0x51FF10, &CVehicleModelInfo::SetAtomicRendererCB, PATCH_JUMP);
|
InjectHook(0x51FF10, &CVehicleModelInfo::SetAtomicRendererCB, PATCH_JUMP);
|
||||||
|
@ -907,6 +1124,12 @@ STARTPATCHES
|
||||||
InjectHook(0x520D30, (RpMaterial *(*)(RpMaterial*, void*))CVehicleModelInfo::GetEditableMaterialListCB, PATCH_JUMP);
|
InjectHook(0x520D30, (RpMaterial *(*)(RpMaterial*, void*))CVehicleModelInfo::GetEditableMaterialListCB, PATCH_JUMP);
|
||||||
InjectHook(0x520DE0, &CVehicleModelInfo::FindEditableMaterialList, PATCH_JUMP);
|
InjectHook(0x520DE0, &CVehicleModelInfo::FindEditableMaterialList, PATCH_JUMP);
|
||||||
InjectHook(0x520E70, &CVehicleModelInfo::SetVehicleColour, PATCH_JUMP);
|
InjectHook(0x520E70, &CVehicleModelInfo::SetVehicleColour, PATCH_JUMP);
|
||||||
|
InjectHook(0x520FD0, &CVehicleModelInfo::ChooseVehicleColour, PATCH_JUMP);
|
||||||
|
InjectHook(0x5210A0, &CVehicleModelInfo::AvoidSameVehicleColour, PATCH_JUMP);
|
||||||
|
InjectHook(0x521260, &CVehicleModelInfo::LoadVehicleColours, PATCH_JUMP);
|
||||||
|
InjectHook(0x521650, &CVehicleModelInfo::DeleteVehicleColourTextures, PATCH_JUMP);
|
||||||
|
|
||||||
|
InjectHook(0x5219D0, &CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors, PATCH_JUMP);
|
||||||
|
|
||||||
InjectHook(0x521820, (RpAtomic *(*)(RpAtomic*, void*))CVehicleModelInfo::SetEnvironmentMapCB, PATCH_JUMP);
|
InjectHook(0x521820, (RpAtomic *(*)(RpAtomic*, void*))CVehicleModelInfo::SetEnvironmentMapCB, PATCH_JUMP);
|
||||||
InjectHook(0x5217A0, (RpMaterial *(*)(RpMaterial*, void*))CVehicleModelInfo::SetEnvironmentMapCB, PATCH_JUMP);
|
InjectHook(0x5217A0, (RpMaterial *(*)(RpMaterial*, void*))CVehicleModelInfo::SetEnvironmentMapCB, PATCH_JUMP);
|
||||||
|
|
|
@ -56,7 +56,7 @@ public:
|
||||||
uint8 m_colours1[NUM_VEHICLE_COLOURS];
|
uint8 m_colours1[NUM_VEHICLE_COLOURS];
|
||||||
uint8 m_colours2[NUM_VEHICLE_COLOURS];
|
uint8 m_colours2[NUM_VEHICLE_COLOURS];
|
||||||
uint8 m_numColours;
|
uint8 m_numColours;
|
||||||
uint8 m_bLastColorVariation; //
|
uint8 m_lastColorVariation;
|
||||||
uint8 m_currentColour1;
|
uint8 m_currentColour1;
|
||||||
uint8 m_currentColour2;
|
uint8 m_currentColour2;
|
||||||
RwTexture *m_envMap;
|
RwTexture *m_envMap;
|
||||||
|
@ -78,6 +78,7 @@ public:
|
||||||
static RwFrame *CollapseFramesCB(RwFrame *frame, void *data);
|
static RwFrame *CollapseFramesCB(RwFrame *frame, void *data);
|
||||||
static RwObject *MoveObjectsCB(RwObject *object, void *data);
|
static RwObject *MoveObjectsCB(RwObject *object, void *data);
|
||||||
static RpAtomic *HideDamagedAtomicCB(RpAtomic *atomic, void *data);
|
static RpAtomic *HideDamagedAtomicCB(RpAtomic *atomic, void *data);
|
||||||
|
static RpAtomic *HideAllComponentsAtomicCB(RpAtomic *atomic, void *data);
|
||||||
static RpMaterial *HasAlphaMaterialCB(RpMaterial *material, void *data);
|
static RpMaterial *HasAlphaMaterialCB(RpMaterial *material, void *data);
|
||||||
|
|
||||||
static RpAtomic *SetAtomicRendererCB(RpAtomic *atomic, void *data);
|
static RpAtomic *SetAtomicRendererCB(RpAtomic *atomic, void *data);
|
||||||
|
@ -100,6 +101,10 @@ public:
|
||||||
static RpAtomic *GetEditableMaterialListCB(RpAtomic *atomic, void *data);
|
static RpAtomic *GetEditableMaterialListCB(RpAtomic *atomic, void *data);
|
||||||
void FindEditableMaterialList(void);
|
void FindEditableMaterialList(void);
|
||||||
void SetVehicleColour(uint8 c1, uint8 c2);
|
void SetVehicleColour(uint8 c1, uint8 c2);
|
||||||
|
void ChooseVehicleColour(uint8 &col1, uint8 &col2);
|
||||||
|
void AvoidSameVehicleColour(uint8 *col1, uint8 *col2);
|
||||||
|
static void LoadVehicleColours(void);
|
||||||
|
static void DeleteVehicleColourTextures(void);
|
||||||
|
|
||||||
static RpAtomic *SetEnvironmentMapCB(RpAtomic *atomic, void *data);
|
static RpAtomic *SetEnvironmentMapCB(RpAtomic *atomic, void *data);
|
||||||
static RpMaterial *SetEnvironmentMapCB(RpMaterial *material, void *data);
|
static RpMaterial *SetEnvironmentMapCB(RpMaterial *material, void *data);
|
||||||
|
@ -108,6 +113,8 @@ public:
|
||||||
static void LoadEnvironmentMaps(void);
|
static void LoadEnvironmentMaps(void);
|
||||||
static void ShutdownEnvironmentMaps(void);
|
static void ShutdownEnvironmentMaps(void);
|
||||||
|
|
||||||
|
static int GetMaximumNumberOfPassengersFromNumberOfDoors(int id);
|
||||||
|
|
||||||
void DeleteRwObject_(void) { this->CVehicleModelInfo::DeleteRwObject(); }
|
void DeleteRwObject_(void) { this->CVehicleModelInfo::DeleteRwObject(); }
|
||||||
RwObject *CreateInstance_(void) { return this->CVehicleModelInfo::CreateInstance(); }
|
RwObject *CreateInstance_(void) { return this->CVehicleModelInfo::CreateInstance(); }
|
||||||
void SetClump_(RpClump *clump) { this->CVehicleModelInfo::SetClump(clump); }
|
void SetClump_(RpClump *clump) { this->CVehicleModelInfo::SetClump(clump); }
|
||||||
|
|
Loading…
Reference in a new issue