mirror of
https://github.com/CookiePLMonster/SilentPatch.git
synced 2024-12-29 15:23:02 +05:00
III: Rsstore the 'brakelights' dummy as it's vanished from the III PC code
This commit is contained in:
parent
8e258b0ac5
commit
fd4fbbacef
1 changed files with 61 additions and 0 deletions
|
@ -1071,6 +1071,34 @@ namespace SlidingTextsScalingFixes
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============= Rsstore the 'brakelights' dummy as it's vanished from the III PC code =============
|
||||||
|
namespace BrakelightsDummy
|
||||||
|
{
|
||||||
|
struct RwObjectNameIdAssocation
|
||||||
|
{
|
||||||
|
const char* pName;
|
||||||
|
int32_t hierId;
|
||||||
|
uint32_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
// This vector is "null terminated" with an empty entry
|
||||||
|
std::vector<RwObjectNameIdAssocation> carIds;
|
||||||
|
|
||||||
|
static CVector* (__thiscall* orgVectorCtor)(CVector* pThis, const CVector* vec);
|
||||||
|
static CVector* __fastcall VectorCtor_Brakelights(CVector* pThis, void*, const char* vec)
|
||||||
|
{
|
||||||
|
// We are given a pointer to CAR_POS_TAILLIGHTS (ID 1), but we want CAR_POS_BRAKELIGHTS (ID 4), synthesise one
|
||||||
|
const CVector* brakeLights = reinterpret_cast<const CVector*>(vec + 3*sizeof(CVector));
|
||||||
|
|
||||||
|
// If all 3 components are 0.0, assume it's a modded vehicle and fall back to the stock dummy
|
||||||
|
if (brakeLights->x == 0.0f && brakeLights->y == 0.0f && brakeLights->z == 0.0f)
|
||||||
|
{
|
||||||
|
brakeLights = reinterpret_cast<const CVector*>(vec);
|
||||||
|
}
|
||||||
|
return orgVectorCtor(pThis, brakeLights);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace ModelIndicesReadyHook
|
namespace ModelIndicesReadyHook
|
||||||
{
|
{
|
||||||
static void (*orgInitialiseObjectData)(const char*);
|
static void (*orgInitialiseObjectData)(const char*);
|
||||||
|
@ -1432,6 +1460,39 @@ void InjectDelayedPatches_III_Common( bool bHasDebugMenu, const wchar_t* wcModul
|
||||||
TXN_CATCH();
|
TXN_CATCH();
|
||||||
|
|
||||||
|
|
||||||
|
// Rsstore the 'brakelights' dummy as it's vanished from the III PC code
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using namespace BrakelightsDummy;
|
||||||
|
|
||||||
|
auto preRenderBrakeLightsPos = get_pattern("50 E8 ? ? ? ? 8D 84 24 ? ? ? ? 8D 55 04", 1);
|
||||||
|
|
||||||
|
// Only patch the hierarchy if no other mod does it
|
||||||
|
RwObjectNameIdAssocation** vehicleDescs = *get_pattern<RwObjectNameIdAssocation**>("89 D9 8B 04 95 ? ? ? ? 50 E8 ? ? ? ? 89 D9", 2 + 3);
|
||||||
|
if (ModCompat::Utils::GetModuleHandleFromAddress(vehicleDescs) == hGameModule)
|
||||||
|
{
|
||||||
|
RwObjectNameIdAssocation* orgCarIds = vehicleDescs[0];
|
||||||
|
if (ModCompat::Utils::GetModuleHandleFromAddress(orgCarIds) == hGameModule)
|
||||||
|
{
|
||||||
|
// Copy the original hierarchy, then add ours
|
||||||
|
while (orgCarIds->pName != nullptr)
|
||||||
|
{
|
||||||
|
carIds.push_back(*orgCarIds++);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add ours, then null terminate
|
||||||
|
carIds.push_back({ "brakelights", 4, 9 });
|
||||||
|
carIds.push_back({});
|
||||||
|
|
||||||
|
Patch(&vehicleDescs[0], carIds.data());
|
||||||
|
|
||||||
|
InterceptCall(preRenderBrakeLightsPos, orgVectorCtor, VectorCtor_Brakelights);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
TXN_CATCH();
|
||||||
|
|
||||||
FLAUtils::Init(moduleList);
|
FLAUtils::Init(moduleList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue