SOme stuff, breaks cargoship!

This commit is contained in:
momo5502 2016-09-21 23:19:16 +02:00
parent db2e572612
commit efbbaec1d6
7 changed files with 162 additions and 183 deletions

View File

@ -50,6 +50,8 @@ namespace Components
{ {
Game::XAssetHeader header = { 0 }; Game::XAssetHeader header = { 0 };
if (filename)
{
// Allow call DB_FindXAssetHeader within the hook // Allow call DB_FindXAssetHeader within the hook
AssetHandler::BypassState = true; AssetHandler::BypassState = true;
@ -60,6 +62,7 @@ namespace Components
// Disallow calling DB_FindXAssetHeader ;) // Disallow calling DB_FindXAssetHeader ;)
AssetHandler::BypassState = false; AssetHandler::BypassState = false;
}
return header; return header;
} }

View File

@ -100,10 +100,12 @@ namespace Components
for (int i = 0; i < modelSurfs->numSurfaces; ++i) for (int i = 0; i < modelSurfs->numSurfaces; ++i)
{ {
memcpy(&tempSurfaces[i], surfaceData + (i * 84), 12); char* source = &surfaceData[i * 84];
memcpy(&tempSurfaces[i].indexBuffer, surfaceData + (i * 84) + 16, 20);
memcpy(&tempSurfaces[i].numCT, surfaceData + (i * 84) + 40, 8); memcpy(&tempSurfaces[i], source, 12);
memcpy(&tempSurfaces[i].something, surfaceData + (i * 84) + 52, 24); memcpy(&tempSurfaces[i].indexBuffer, source + 16, 20);
memcpy(&tempSurfaces[i].numCT, source + 40, 8);
memcpy(&tempSurfaces[i].something, source + 52, 24);
tempSurfaces[i].streamHandle = 0xFF; // Fake handle for buffer interception tempSurfaces[i].streamHandle = 0xFF; // Fake handle for buffer interception
} }

View File

@ -7,6 +7,13 @@ namespace Components
Utils::Hook Zones::LoadFxElemDefHook; Utils::Hook Zones::LoadFxElemDefHook;
Utils::Hook Zones::LoadFxElemDefArrayHook; Utils::Hook Zones::LoadFxElemDefArrayHook;
Utils::Hook Zones::LoadXModelLodInfoHook; Utils::Hook Zones::LoadXModelLodInfoHook;
Utils::Hook Zones::LoadXModelHook;
Utils::Hook Zones::LoadXSurfaceArrayHook;
Utils::Hook Zones::LoadGameWorldSpHook;
Utils::Hook Zones::LoadPathDataHook;
Utils::Hook Zones::LoadVehicleDefHook;
Utils::Hook Zones::Loadsnd_alias_tArrayHook;
Utils::Hook Zones::LoadLoadedSoundHook;
Utils::Hook fxEffectLoadHook; Utils::Hook fxEffectLoadHook;
@ -67,50 +74,33 @@ namespace Components
Game::Load_XString(0); Game::Load_XString(0);
} }
Utils::Hook xModelModifyHook; bool Zones::LoadXModel(bool atStreamStart, char* xmodel, int size)
void XModelModifyHookFunc(int a1, char* buffer, size_t len)
{ {
__asm bool result = Game::Load_Stream(atStreamStart, xmodel, size);
{
push len
push buffer
push a1
call xModelModifyHook.Original
add esp, 0Ch
}
int elSize = (Zones::ZoneVersion == VERSION_ALPHA2) ? 364 : 360; int elSize = (Zones::ZoneVersion == VERSION_ALPHA2) ? 364 : 360;
static unsigned char tempVar[364]; Game::XModel model[2]; // Allocate 2 models, as we exceed the buffer
memcpy(&tempVar[0], &buffer[0], 36);
memcpy(&tempVar[36], &buffer[44], 28);
//DB_AddRelocation((DWORD)buffer + 44, 28, (DWORD)buffer + 36); memcpy(model, xmodel, 36);
memcpy(&model->pad3[0x1C], &xmodel[44], 28);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
//DB_AddRelocation((DWORD)buffer + 72 + (i * 56), 12, (DWORD)buffer + 64 + (i * 44)); memcpy(&model->lods[i], &xmodel[72 + (i * 56)], 12);
//DB_AddRelocation((DWORD)buffer + 72 + (i * 56) + 12, 32, (DWORD)buffer + 64 + (i * 44) + 16); memcpy(&model->lods[i].pad3, &xmodel[72 + (i * 56) + 16], 32);
memcpy(&tempVar[64 + (i * 44)], &buffer[72 + (i * 56)], 12); memcpy(reinterpret_cast<char*>(&model) + (elSize - 4) - (i * 4), &xmodel[72 + (i * 56) + 12], 4);
memcpy(&tempVar[64 + (i * 44) + 12], &buffer[72 + (i * 56) + 16], 32);
memcpy(&tempVar[(elSize - 4) - (i * 4)], &buffer[72 + (i * 56) + 12], 4);
} }
//DB_AddRelocation((DWORD)buffer + 292, (elSize - 292 - 4), (DWORD)buffer + 236); memcpy(&model->lods[3].pad4[0], &xmodel[292], (elSize - 292 - 4)/*68*/);
//DB_AddRelocation((DWORD)buffer + (elSize - 8), 8, (DWORD)buffer + 296); memcpy(&model->physPreset, &xmodel[(elSize - 8)], 8);
memcpy(&tempVar[236], &buffer[292], (elSize - 292 - 4)/*68*/); model[1].name = reinterpret_cast<char*>(0xDEC0ADDE);
memcpy(&tempVar[296], &buffer[(elSize - 8)], 8);
tempVar[304] = 0xDE; memcpy(xmodel, &model, elSize);
tempVar[305] = 0xAD;
tempVar[306] = 0xC0;
tempVar[307] = 0xDE;
memcpy(buffer, tempVar, elSize); return result;
} }
void Zones::LoadXModelLodInfo(int i) void Zones::LoadXModelLodInfo(int i)
@ -132,42 +122,31 @@ namespace Components
} }
} }
Utils::Hook xsurfaceIntLoadHook; bool Zones::LoadXSurfaceArray(bool atStreamStart, char* buffer, int size)
void XSurfaceIntLoadHookFunc(int a1, char* buffer, size_t len)
{ {
len >>= 6; size >>= 6;
int count = len; int count = size;
len *= 84; size *= 84;
__asm bool result = Game::Load_Stream(atStreamStart, buffer, size);
{
push len
push buffer
push a1
call xsurfaceIntLoadHook.Original
add esp, 0Ch
}
char* tempVar = new char[len]; Utils::Memory::Allocator allocator;
Game::XSurface* tempSurfaces = allocator.AllocateArray<Game::XSurface>(count);
for (int i = 0; i < count; i++) for (int i = 0; i < count; ++i)
{ {
char* source = &buffer[i * 84]; char* source = &buffer[i * 84];
char* dest = &tempVar[i * 64];
//memcpy(dest, source, 12); memcpy(&tempSurfaces[i], source, 12);
//memcpy(dest + 12, source + 16, 72); memcpy(&tempSurfaces[i].indexBuffer, source + 16, 20);
memcpy(dest, source, 12); memcpy(&tempSurfaces[i].numCT, source + 40, 8);
memcpy(dest + 12, source + 16, 20); memcpy(&tempSurfaces[i].something, source + 52, 24);
memcpy(dest + 32, source + 40, 8);
memcpy(dest + 40, source + 52, 24);
} }
memcpy(buffer, tempVar, len); memcpy(buffer, tempSurfaces, sizeof(Game::XSurface) * count);
delete[] tempVar; return result;
} }
Utils::Hook loadWeaponDefHook; Utils::Hook loadWeaponDefHook;
@ -465,27 +444,18 @@ namespace Components
Game::DB_PopStreamPos(); Game::DB_PopStreamPos();
} }
Utils::Hook gameWorldSpLoadHook; bool Zones::LoadGameWorldSp(bool atStreamStart, char* buffer)
void GameWorldSpLoadHookFunc(int a1, char* buffer, size_t len)
{ {
len = 84; bool result = Game::Load_Stream(atStreamStart, buffer, 84);
__asm Game::GameWorldSp world[2];
{ memcpy(&world, buffer, 44);
push len memcpy(&world[1], &buffer[44], 28);
push buffer memcpy(&world->vehicleTrack, &buffer[72], 12);
push a1
call gameWorldSpLoadHook.Original
add esp, 0Ch
}
static char tempVar[84]; memcpy(buffer, world, 84);
memcpy(&tempVar[0], &buffer[0], 44);
memcpy(&tempVar[56], &buffer[44], 28);
memcpy(&tempVar[44], &buffer[72], 12);
memcpy(buffer, tempVar, sizeof(tempVar)); return result;
} }
Utils::Hook pathDataTailHook; Utils::Hook pathDataTailHook;
@ -517,84 +487,58 @@ namespace Components
} }
} }
Utils::Hook sndAliasLoadHook; bool Zones::Loadsnd_alias_tArray(bool atStreamStart, char* buffer, int len)
void SndAliasLoadHookFunc(int a1, char* buffer, size_t len)
{ {
len /= 100; len /= 100;
int count = len; int count = len;
len *= 108; len *= 108;
__asm bool result = Game::Load_Stream(atStreamStart, buffer, len);
{
push len
push buffer
push a1
call gameWorldSpLoadHook.Original
add esp, 0Ch
}
char* tempVar = new char[len]; Utils::Memory::Allocator allocator;
Game::snd_alias_t* tempSounds = allocator.AllocateArray<Game::snd_alias_t>(count);
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
char* src = &buffer[i * 108]; char* src = &buffer[i * 108];
char* dest = &tempVar[i * 100];
memcpy(dest + 0, src + 0, 60); memcpy(&tempSounds[i], src + 0, 60);
memcpy(dest + 60, src + 68, 20); memcpy(&tempSounds[i].pad2[36], src + 68, 20);
memcpy(dest + 80, src + 88, 20); memcpy(&tempSounds[i].pad2[56], src + 88, 20);
AssetHandler::Relocate((DWORD)src + 0, 60, (DWORD)(buffer + (i * 100)) + 0); AssetHandler::Relocate(src + 0, buffer + (i * 100) + 0, 60);
AssetHandler::Relocate((DWORD)src + 68, 20, (DWORD)(buffer + (i * 100)) + 60); AssetHandler::Relocate(src + 68, buffer + (i * 100) + 60, 20);
AssetHandler::Relocate((DWORD)src + 88, 20, (DWORD)(buffer + (i * 100)) + 80); AssetHandler::Relocate(src + 88, buffer + (i * 100) + 80, 20);
} }
memcpy(buffer, tempVar, len); memcpy(buffer, tempSounds, sizeof(Game::snd_alias_t) * count);
delete[] tempVar;
return result;
} }
Utils::Hook mssSoundLoadHook; bool Zones::LoadLoadedSound(bool atStreamStart, char* buffer)
void MssSoundLoadHookFunc(int a1, char* buffer, size_t len)
{ {
len = 48; bool result = Game::Load_Stream(atStreamStart, buffer, 48);
__asm
{
push len
push buffer
push a1
call gameWorldSpLoadHook.Original
add esp, 0Ch
}
memcpy(buffer + 28, buffer + 32, 16); memcpy(buffer + 28, buffer + 32, 16);
AssetHandler::Relocate((DWORD)buffer + 32, 16, (DWORD)buffer + 28); AssetHandler::Relocate(buffer + 32, buffer + 28, 16);
return result;
} }
Utils::Hook vehicleLoadHook; bool Zones::LoadVehicleDef(bool atStreamStart, char* buffer)
void VehicleLoadHookFunc(int a1, char* buffer, int len)
{ {
len = 788; bool result = Game::Load_Stream(atStreamStart, buffer, 788);
__asm Game::VehicleDef vehicle[2];
{ memcpy(vehicle, &buffer[0], 400);
push len memcpy(&vehicle->pad[404], &buffer[400], 388);
push buffer
push a1
call vehicleLoadHook.Original
add esp, 0Ch
}
static char tempVar[788]; AssetHandler::Relocate(buffer + 400, buffer + 408, 388);
memcpy(&tempVar[0], &buffer[0], 400);
memcpy(&tempVar[408], &buffer[400], 388);
AssetHandler::Relocate((DWORD)buffer + 400, 388, (DWORD)buffer + 408); memcpy(buffer, vehicle, sizeof(788));
memcpy(buffer, tempVar, sizeof(tempVar)); return result;
} }
Utils::Hook loadWeaponAttachHook; Utils::Hook loadWeaponAttachHook;
@ -676,13 +620,6 @@ namespace Components
Game::DB_PopStreamPos(); Game::DB_PopStreamPos();
} }
Utils::Hook gameWorldSpIntHook;
void GameWorldSpIntHookFunc(int /*doLoad*/)
{
memset(*(void**)0x112AD7C, 0, 40);
}
Utils::Hook loadTechniquePassHook; Utils::Hook loadTechniquePassHook;
void Load_TechniquePassHookFunc(bool atStreamStart, Game::ShaderArgumentDef* pass, size_t size) void Load_TechniquePassHookFunc(bool atStreamStart, Game::ShaderArgumentDef* pass, size_t size)
@ -784,17 +721,17 @@ namespace Components
Zones::LoadFxElemDefHook.Install(); Zones::LoadFxElemDefHook.Install();
Zones::LoadXModelLodInfoHook.Install(); Zones::LoadXModelLodInfoHook.Install();
xModelModifyHook.Install(); Zones::LoadXModelHook.Install();
xsurfaceIntLoadHook.Install(); Zones::LoadXSurfaceArrayHook.Install();
gameWorldSpLoadHook.Install(); Zones::LoadGameWorldSpHook.Install();
pathDataTailHook.Install(); pathDataTailHook.Install();
loadWeaponDefHook.Install(); loadWeaponDefHook.Install();
vehicleLoadHook.Install(); Zones::LoadVehicleDefHook.Install();
sndAliasLoadHook.Install(); Zones::Loadsnd_alias_tArrayHook.Install();
mssSoundLoadHook.Install(); Zones::LoadLoadedSoundHook.Install();
menuDefLoadHook.Install(); menuDefLoadHook.Install();
fxEffectLoadHook.Install(); fxEffectLoadHook.Install();
@ -802,7 +739,7 @@ namespace Components
if (Zones::ZoneVersion >= VERSION_ALPHA3) if (Zones::ZoneVersion >= VERSION_ALPHA3)
{ {
gameWorldSpIntHook.Install(); Zones::LoadPathDataHook.Install();
} }
loadTechniquePassHook.Install(); loadTechniquePassHook.Install();
@ -814,23 +751,23 @@ namespace Components
Zones::LoadFxElemDefHook.Uninstall(); Zones::LoadFxElemDefHook.Uninstall();
Zones::LoadXModelLodInfoHook.Uninstall(); Zones::LoadXModelLodInfoHook.Uninstall();
xModelModifyHook.Uninstall(); Zones::LoadXModelHook.Uninstall();
xsurfaceIntLoadHook.Uninstall(); Zones::LoadXSurfaceArrayHook.Uninstall();
gameWorldSpLoadHook.Uninstall(); Zones::LoadGameWorldSpHook.Uninstall();
pathDataTailHook.Uninstall(); pathDataTailHook.Uninstall();
loadWeaponDefHook.Uninstall(); loadWeaponDefHook.Uninstall();
vehicleLoadHook.Uninstall(); Zones::LoadVehicleDefHook.Uninstall();
sndAliasLoadHook.Uninstall(); Zones::Loadsnd_alias_tArrayHook.Uninstall();
mssSoundLoadHook.Uninstall(); Zones::LoadLoadedSoundHook.Uninstall();
menuDefLoadHook.Uninstall(); menuDefLoadHook.Uninstall();
fxEffectLoadHook.Uninstall(); fxEffectLoadHook.Uninstall();
loadWeaponAttachHook.Uninstall(); loadWeaponAttachHook.Uninstall();
gameWorldSpIntHook.Uninstall(); Zones::LoadPathDataHook.Uninstall();
loadTechniquePassHook.Uninstall(); loadTechniquePassHook.Uninstall();
loadStructuredDataChildArrayHook.Uninstall(); loadStructuredDataChildArrayHook.Uninstall();
@ -853,21 +790,25 @@ namespace Components
Zones::LoadFxElemDefArrayHook.Initialize(0x495938, Zones::LoadFxElemDefArrayStub, HOOK_CALL); Zones::LoadFxElemDefArrayHook.Initialize(0x495938, Zones::LoadFxElemDefArrayStub, HOOK_CALL);
Zones::LoadFxElemDefHook.Initialize(0x45ADA0, Zones::LoadFxElemDefStub, HOOK_CALL); Zones::LoadFxElemDefHook.Initialize(0x45ADA0, Zones::LoadFxElemDefStub, HOOK_CALL);
Zones::LoadXModelLodInfoHook.Initialize(0x4EA6FE, Zones::LoadXModelLodInfoStub, HOOK_CALL); Zones::LoadXModelLodInfoHook.Initialize(0x4EA6FE, Zones::LoadXModelLodInfoStub, HOOK_CALL);
xModelModifyHook.Initialize(0x410D90, XModelModifyHookFunc, HOOK_CALL); Zones::LoadXModelHook.Initialize(0x410D90, Zones::LoadXModel, HOOK_CALL);
xsurfaceIntLoadHook.Initialize(0x4925C8, XSurfaceIntLoadHookFunc, HOOK_CALL); Zones::LoadXSurfaceArrayHook.Initialize(0x4925C8, Zones::LoadXSurfaceArray, HOOK_CALL);
gameWorldSpLoadHook.Initialize(0x4F4D0D, GameWorldSpLoadHookFunc, HOOK_CALL); Zones::LoadGameWorldSpHook.Initialize(0x4F4D0D, Zones::LoadGameWorldSp, HOOK_CALL);
loadWeaponDefHook.Initialize(0x47CCD2, Load_WeaponDef_CodC, HOOK_CALL); loadWeaponDefHook.Initialize(0x47CCD2, Load_WeaponDef_CodC, HOOK_CALL);
vehicleLoadHook.Initialize(0x483DA0, VehicleLoadHookFunc, HOOK_CALL); Zones::LoadVehicleDefHook.Initialize(0x483DA0, Zones::LoadVehicleDef, HOOK_CALL);
sndAliasLoadHook.Initialize(0x4F0AC8, SndAliasLoadHookFunc, HOOK_CALL); Zones::Loadsnd_alias_tArrayHook.Initialize(0x4F0AC8, Zones::Loadsnd_alias_tArray, HOOK_CALL);
mssSoundLoadHook.Initialize(0x403A5D, MssSoundLoadHookFunc, HOOK_CALL); Zones::LoadLoadedSoundHook.Initialize(0x403A5D, Zones::LoadLoadedSound, HOOK_CALL);
loadWeaponAttachHook.Initialize(0x463022, Load_WeaponAttach, HOOK_CALL); loadWeaponAttachHook.Initialize(0x463022, Load_WeaponAttach, HOOK_CALL);
menuDefLoadHook.Initialize(0x41A570, MenuDefLoadHookFunc, HOOK_CALL); menuDefLoadHook.Initialize(0x41A570, MenuDefLoadHookFunc, HOOK_CALL);
fxEffectLoadHook.Initialize(0x49591B, FxEffectLoadHookFunc, HOOK_CALL); fxEffectLoadHook.Initialize(0x49591B, FxEffectLoadHookFunc, HOOK_CALL);
gameWorldSpIntHook.Initialize(0x4F4D3B, GameWorldSpIntHookFunc, HOOK_CALL);
loadTechniquePassHook.Initialize(0x428F0A, Load_TechniquePassHookFunc, HOOK_CALL); loadTechniquePassHook.Initialize(0x428F0A, Load_TechniquePassHookFunc, HOOK_CALL);
loadStructuredDataChildArrayHook.Initialize(0x4B1EB8, Load_StructuredDataChildArrayHookFunc, HOOK_CALL); loadStructuredDataChildArrayHook.Initialize(0x4B1EB8, Load_StructuredDataChildArrayHookFunc, HOOK_CALL);
pathDataTailHook.Initialize(0x427A1B, PathDataTailHookFunc, HOOK_JUMP); pathDataTailHook.Initialize(0x427A1B, PathDataTailHookFunc, HOOK_JUMP);
Zones::LoadPathDataHook.Initialize(0x4F4D3B, [] ()
{
ZeroMemory(*Game::varPathData, sizeof(Game::PathData));
}, HOOK_CALL);
} }
Zones::~Zones() Zones::~Zones()

View File

@ -21,11 +21,24 @@ namespace Components
static Utils::Hook LoadFxElemDefHook; static Utils::Hook LoadFxElemDefHook;
static Utils::Hook LoadFxElemDefArrayHook; static Utils::Hook LoadFxElemDefArrayHook;
static Utils::Hook LoadXModelLodInfoHook; static Utils::Hook LoadXModelLodInfoHook;
static Utils::Hook LoadXModelHook;
static Utils::Hook LoadXSurfaceArrayHook;
static Utils::Hook LoadGameWorldSpHook;
static Utils::Hook LoadPathDataHook;
static Utils::Hook LoadVehicleDefHook;
static Utils::Hook Loadsnd_alias_tArrayHook;
static Utils::Hook LoadLoadedSoundHook;
static void LoadFxElemDefArrayStub(bool atStreamStart); static void LoadFxElemDefArrayStub(bool atStreamStart);
static bool LoadFxElemDefStub(bool atStreamStart, Game::FxElemDef* fxElem, int size); static bool LoadFxElemDefStub(bool atStreamStart, Game::FxElemDef* fxElem, int size);
static void LoadXModelLodInfo(int i); static void LoadXModelLodInfo(int i);
static void LoadXModelLodInfoStub(); static void LoadXModelLodInfoStub();
static bool LoadXModel(bool atStreamStart, char* xmodel, int size);
static bool LoadXSurfaceArray(bool atStreamStart, char* buffer, int size);
static bool LoadGameWorldSp(bool atStreamStart, char* buffer);
static bool LoadVehicleDef(bool atStreamStart, char* buffer);
static bool Loadsnd_alias_tArray(bool atStreamStart, char* buffer, int len);
static bool LoadLoadedSound(bool atStreamStart, char* buffer);
}; };
} }

View File

@ -279,6 +279,7 @@ namespace Game
TracerDef** varTracerDefPtr = (TracerDef**)0x112B3BC; TracerDef** varTracerDefPtr = (TracerDef**)0x112B3BC;
XModel** varXModelPtr = (XModel**)0x112A934; XModel** varXModelPtr = (XModel**)0x112A934;
XModel** varXModel = (XModel**)0x112AE14; XModel** varXModel = (XModel**)0x112AE14;
PathData** varPathData = (PathData**)0x112AD7C;
const char** varConstChar = (const char**)0x112A774; const char** varConstChar = (const char**)0x112A774;
Material** varMaterialHandle = (Material**)0x112A878; Material** varMaterialHandle = (Material**)0x112A878;
FxEffectDef** varFxEffectDefHandle = (FxEffectDef**)0x112ACC0; FxEffectDef** varFxEffectDefHandle = (FxEffectDef**)0x112ACC0;

View File

@ -569,6 +569,7 @@ namespace Game
extern TracerDef** varTracerDefPtr; extern TracerDef** varTracerDefPtr;
extern XModel** varXModelPtr; extern XModel** varXModelPtr;
extern XModel** varXModel; extern XModel** varXModel;
extern PathData** varPathData;
extern const char** varConstChar; extern const char** varConstChar;
extern Material** varMaterialHandle; extern Material** varMaterialHandle;
extern FxEffectDef** varFxEffectDefHandle; extern FxEffectDef** varFxEffectDefHandle;

View File

@ -1415,9 +1415,9 @@ namespace Game
short numSurfs; // +4 short numSurfs; // +4
short maxSurfs;// +6 short maxSurfs;// +6
XModelSurfs* surfaces; // +8 XModelSurfs* surfaces; // +8
char pad3[24]; char pad3[24]; // +12
XSurface* surfs; XSurface* surfs;
char pad4[4]; // +12 char pad4[4];
}; };
struct cplane_t struct cplane_t
@ -2281,20 +2281,37 @@ namespace Game
char pad[112]; char pad[112];
}; };
struct GameMap_SP struct PathData
{
char pad[40];
};
struct VehicleTrack
{
char pad[8];
};
struct GameWorldSp
{ {
const char* name; const char* name;
char pad[48]; PathData pathData;
VehicleTrack vehicleTrack;
GameMap_Data* data; GameMap_Data* data;
}; };
struct GameMap_MP struct GameWorldMp
{ {
const char* name; const char* name;
GameMap_Data* data; GameMap_Data* data;
}; };
struct VehicleDef
{
const char* name;
char pad[716];
};
union XAssetHeader union XAssetHeader
{ {
void *data; void *data;
@ -2320,9 +2337,10 @@ namespace Game
XAnimParts* xanim; XAnimParts* xanim;
clipMap_t* clipMap; clipMap_t* clipMap;
FxEffectDef* fx; FxEffectDef* fx;
GameMap_MP* gameMapMP; GameWorldMp* gameMapMP;
GameMap_SP* gameMapSP; GameWorldSp* gameMapSP;
TracerDef* tracer; TracerDef* tracer;
VehicleDef* vehicle;
}; };
struct XAsset struct XAsset